scrapy案例:爬取京东笔记本数据
今天看了看京东的笔记本,,,然后我们就写个爬虫吧,,,,hhhhh
踩点
我们需要商品ID,商铺名,产品名,好评数,中评述,差评数,商品链接,价格
经过我们一通分析,我们发现价格和评论的信息都是保存再文件中,源代码是找不到的。
然后使用咋瓦鲁多。。。可以看看我以前写的方法。。。
我就能发现
我们的价格和评论的信息就在这两个文件中,(中间那个不是啊),我们可以放到json解析网站,解析出来看看
然后就可以根据这两个文件构造url 发送请求,然后提取出我们要的数据,,是不是很简单
至于那些动态增加的数据,看了一下大佬的文章脑部链接,,其实也不难啊,,
https://search.jd.com/s_new.php?keyword=%E7%AC%94%E8%AE%B0%E6%9C%AC&wq=%E7%AC%94%E8%AE%B0%E6%9C%AC&page=2&s=30&scrolling=y&log_id=1589597986209.7166&tpl=1_M&isList=0&show_items=100005171461,100011386554,100010816812,100010879626,100004563443,100010370676,100011177202,100004508927,100006487373,100010370680,100006288375,100011773090,100007539330,100011045982,100006546527,100006460639,100012445728,100011773074,100010409532,100005188613,100006690593,100006743209,100006302835,100012082340,100004915731,5225346,100012039000,100007934914,100003406361,100012481694
这是那些数据的url,其实简化一下就是这东西,,,额,,别被那鬼url吓到就好,,
https://search.jd.com/s_new.php?keyword=%E7%AC%94%E8%AE%B0%E6%9C%AC&wq=%E7%AC%94%E8%AE%B0%E6%9C%AC&page=2&s=30&log_id=1589597986209.7166
然后我比较了一下,有三个变量,page ,s ,log_id(时间戳要是不看人家的还真看不出来。。),,page要是偶数2,4,6.。。想想也是,,s的规律时30,90,150,210.。就是(page-1)*60 。。。。时间戳嘛就是time.time()
爬起来
1.spider
# -*- coding: utf-8 -*-
import scrapy,json,requests,time
from ..items import goodsItem
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'
}class JdSpiderSpider(scrapy.Spider):name = 'jd_spider'allowed_domains = ['jd.com']start_urls = []for x in range(1,20,2):other_urls = 'https://search.jd.com/s_new.php?keyword=%E7%AC%94%E8%AE%B0%E6%9C%AC&wq=%E7%AC%94%E8%AE%B0%E6%9C%AC&page='+str(x+1)+'&s='+str(x*30)+'&log_id='+str(time.time())start_urls.append(other_urls) # 页面的结构时相同的,下面的语法也适用start_urls.append('https://search.jd.com/Search?keyword=%E7%AC%94%E8%AE%B0%E6%9C%AC&page='+str(x))def parse(self, response):goods = response.xpath(r'//li[@data-sku]')for good in goods:item1 = goodsItem()item1['ID'] = good.xpath(r'./@data-sku').get()item1['name'] = good.xpath('.//div[@class="p-name p-name-type-2"]//em/text()').getall()item1['name'] = ' '.join(item1['name']).strip()item1['shop_name'] = good.xpath('.//a[@class="curr-shop hd-shopname"]/@title').get()item1['link'] = good.xpath('.//div[@class="p-img"]/a/@href').get()item1['shop_id'] = good.xpath('.//div/@data-venid').get()# url = 'http:' + item1['link']url = 'https://club.jd.com/comment/productCommentSummaries.action?referenceIds=' + str(item1['ID'])yield scrapy.Request(url,meta={'item':item1},callback=self.parse_data)# 请求评论文件def parse_data(self,response):item1 = response.meta['item']js = json.loads(response.text)item1['GoodCount'] = str(js['CommentsCount'][0]['GoodCount'])item1['GeneralCount'] = str(js['CommentsCount'][0]['GeneralCount'])item1['PoorCount'] = str(js['CommentsCount'][0]['PoorCount'])num = item1['ID']shop_id = item1['shop_id']# https://c0.3.cn/stock?skuId=100004563443&area=13_1007_37916_0&venderId=1000000904&cat=670,671,672url = "https://c0.3.cn/stock?skuId="+str(num)+"&area=13_1007_37916_0&venderId="+str(shop_id)+"&cat=670,671,672"# print(url)# print('='*30)resp = requests.get(url,headers=headers)js = json.loads(resp.text)item1['price'] = js['stock']['jdPrice']['p']print(resp.url)print('='*50)# https://c0.3.cn/stock?skuId=100010816812&area=13_1007_37916_0&venderId=1000000904&buyNum=1&choseSuitSkuIds=&cat=670,671,672&fqsp=0&pdpin=&pduid=1919946493&ch=1# https://c0.3.cn/stock?skuId=100005171461&area=13_1007_37916_0&venderId=1000000157&buyNum=1&choseSuitSkuIds=&cat=670,671,672&extraParam={%22originid%22:%221%22}&fqsp=0&pdpin=&pduid=1919946493&ch=1&callback=jQuery3127510# yield scrapy.Request(url, meta={'item':item1}, callback=self.parse_price)# 请求价格文件,但是这个请求发不出去,我也不知道为什么return item1# def parse_price(self,response):# item1 = response.meta['item']# js = json.loads(response.text)# item1['price'] = js['stock']['jdPrice']['p']# print(item1)# print('*'*50)# return item1
最后那个请求价格url 函数 parse_price()运行不了,因为yield scrapy.Request(url, meta={'item':item1}, callback=self.parse_price)
这个请求发不出去欸,,为什么呢,,如果有朋友知道请告诉我这个彩笔呗。。。。。。
所以就用了感觉比较low 的requests 方法,,不过好用就完了,,,
- 我又写了一个爬评论内容的,,不过只能爬单个商品,,毕竟每个商品都有那么多评论,,而且分开也很麻烦不是
import scrapy,json,requests
from ..items import commentItemclass comment_spider(scrapy.Spider):name = "comment_spider"allowed_domains = ['jd.com']ID = '100010816812' # 可以根据商品的ID 来改变start_urls = []for x in range(10):url = 'https://club.jd.com/comment/productPageComments.action?&productId='+str(ID)+'&score=0&sortType=5&page='+str(x)+'&pageSize=10&isShadowSku=0&fold=1'start_urls.append(url)# https://club.jd.com/comment/productPageComments.action?&productId=100010816812&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1# https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=100010816812&score=0&sortType=5&page=5&pageSize=10&isShadowSku=0&rid=0&fold=1# https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=100010816812&score=0&sortType=5&page=1&pageSize=10&isShadowSku=0&rid=0&fold=1def parse(self, response):js = json.loads(response.text)comment = js['comments']for each in comment:item1 = commentItem()item1['user_id'] = each['id']content = each['content']item1['content'] = ' '.join(content)item1['score'] = each['score']item1['time'] = each['creationTime']yield item1
- item
import scrapy
from scrapy import Item,Fieldclass JdItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()passclass goodsItem(Item):link = Field() # 商品链接ID = Field() # 商品IDname = Field() # 商品名字shop_name = Field() # 店家名字price = Field() # 价钱shop_id = Field()PoorCount = Field()GeneralCount = Field()GoodCount = Field()class commentItem(Item):content = Field()time = Field()score = Field()user_id = Field()
- piplines
from twisted.enterprise import adbapiclass JdPipeline(object):@classmethoddef from_crawler(cls,crawler):mysql_config = crawler.settings['MYSQL_CONFIG']return cls(mysql_config)def __init__(self,mysql_config):self.dbpool = adbapi.ConnectionPool(mysql_config['DRIVER'],host = mysql_config['HOST'],port = mysql_config['PORT'],user = mysql_config['USER'],password = mysql_config['PASSWORD'],db = mysql_config['DATABASE'],charset = 'utf8')def process_item(self, item, spider):result = self.dbpool.runInteraction(self.insert_item,item)result.addErrback(self.insert_error)return itemdef insert_item(self,cursor,item):sql = 'insert into 笔记本(id,code,name,shop_name,price,link,PoorCount,GeneralCount,GoodCount) values(null,%s,%s,%s,%s,%s,%s,%s,%s)'args = (item['ID'],item['name'],item['shop_name'],item['price'],item['link'],item['PoorCount'],item['GeneralCount'],item['GoodCount'])cursor.execute(sql,args)def insert_error(self,failure):print('---出错啦---')print(failure)def close_spider(self, spider):self.dbpool.close()class CommentPipeline(object): # 两个差不多的@classmethoddef from_crawler(cls, crawler):mysql_config = crawler.settings['MYSQL_CONFIG']return cls(mysql_config)def __init__(self, mysql_config):self.dbpool = adbapi.ConnectionPool(mysql_config['DRIVER'],host=mysql_config['HOST'],port=mysql_config['PORT'],user=mysql_config['USER'],password=mysql_config['PASSWORD'],db=mysql_config['DATABASE'],charset='utf8')def process_item(self, item, spider):result = self.dbpool.runInteraction(self.insert_item, item)result.addErrback(self.insert_error)return itemdef insert_item(self, cursor, item):sql = 'insert into 评论数(id,user_id,score,content,time) values(null,%s,%s,%s,%s)'args = (item['user_id'], item['score'], item['content'], item['time'])cursor.execute(sql, args)def insert_error(self, failure):print('---出错啦---')print(failure)def close_spider(self, spider):self.dbpool.close()
- settings
BOT_NAME = 'jd'SPIDER_MODULES = ['jd.spiders']
NEWSPIDER_MODULE = 'jd.spiders'MYSQL_CONFIG = {'DRIVER':'pymysql','HOST':'localhost','PORT':3306,'USER':'root','PASSWORD':'54567789','DATABASE':'jd'
}ROBOTSTXT_OBEY = FalseDEFAULT_REQUEST_HEADERS = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Language': 'en','referer':'https://search.jd.com/Search?keyword=%E7%AC%94%E8%AE%B0%E6%9C%AC%E7%94%B5%E8%84%91&enc=utf-8&suggest=1.def.0.V17--38s0&wq=bijiben&pvid=bd02d49840994b4586cb4f17e7ed7709',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'
}DOWNLOADER_MIDDLEWARES = { # 中间件我就随便换了个请求头,jd好像不会搞这些'jd.middlewares.JdDownloaderMiddleware': 543,
}ITEM_PIPELINES = {# 'jd.pipelines.JdPipeline': 300,'jd.pipelines.CommentPipeline':300 # 要爬评论就用这个
}
然后比较了一下加上动态加上的那部分数据,十页334条?????比不加的211条是多了一些,,,但是不应该是两倍嘛????这是为撒呢。。。。。。
而且这么多数据有什么用呢。。。。。。
scrapy案例:爬取京东笔记本数据相关推荐
- python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析
这篇文章主要介绍了python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析的实例,帮助大家更好的理解和学习使用python.感兴趣的朋友可以了解下 一.环境准备 python3.8.3 ...
- Java爬取京东商品数据
爬取京东商品数据 我把项目部署到了linux中,进行爬取,爬到了3000条手机信息,只是爬了一些简单的文本信息. 本文爬取的数据为京东手机信息 准备工作 导入爬取数据需要的依赖包 编写httpClie ...
- Python爬取京东商品数据
一.前言 由于京东反爬技术较强,使用常规方法爬取其数据行不通,且使用逆向分析技术又具有一定难度,所以本文将直接使用selenium爬取京东商品数据.若不知道怎么安装和配置selenium,请点击查阅笔 ...
- Selenium实战之Python+Selenium爬取京东商品数据
实战目标:爬取京东商品信息,包括商品的标题.链接.价格.评价数量. 代码核心在于这几个部分: 其一:使用元素定位来获取页面上指定需要抓取的关键字: 其二:将页面上定位得到的数据永久存储到本地文件中. ...
- Java实现爬取京东手机数据
Java实现爬取京东手机数据 最近看了某马的Java爬虫视频,看完后自己上手操作了下,基本达到了爬数据的要求,HTML页面源码也刚好复习了下,之前发布两篇关于简单爬虫的文章,也刚好用得上.项目没什么太 ...
- python爬取京东手机数据_用scrapy爬取京东的数据
本文目的是使用scrapy爬取京东上所有的手机数据,并将数据保存到MongoDB中. 一.项目介绍 主要目标 1.使用scrapy爬取京东上所有的手机数据 2.将爬取的数据存储到MongoDB 环境 ...
- scrapy爬取京东笔记本电脑数据并进行简单处理和分析
京东爬虫 一.环境准备 二.问题分析 三.spider 三.item 四.setting 五.pipelines 六.middlewares 七.使用jupyter进行简单的处理和分析 一.环境准备 ...
- java爬虫案例——SpringBoot使用HttpClient、Jsoup爬取京东手机数据
文章目录 前言 一.准备工作 二.项目文件 1.项目依赖 2.项目配置文件 3.pojo 4.dao接口 5.service接口及其实现类 6.HttpClient封装工具类 7.爬取任务实现 8.启 ...
- Scrapy练习——爬取京东商城商品信息
刚刚接触爬虫,花了一段时间研究了一下如何使用scrapy,写了一个比较简单的小程序,主要用于爬取京东商城有关进口牛奶页面的商品信息,包括商品的名称,价格,店铺名称,链接,以及评价的一些信息等.简单记录 ...
最新文章
- python使用matplotlib可视化、为可视化图像添加标题(title)、自定义标题的字体格式、字体大小、字体颜色等
- lombok不生效问题(持续补充)
- 登录时记住用户名和密码及cookie案例应用
- linux 描述符 打开 个数,Linux下增大可打开文件描述符的最大数的方法
- 编译原理算符分析器实现 -* c语言代码,编译原理论文-词法分析器的设计与实现...
- UOS 安装nvidia官方显卡驱动
- WPS如何隔列填充背景颜色
- u盘如何安装xp和linux,怎样从U盘安装Windows XP?
- 醉逍遥显示无法更新服务器,蜀门醉逍遥版本修改教程 (值好几千,俺心血).doc
- 大点干!早点散----------深入剖析LVS负载均衡群集原理
- 恶意程序利用Linksys路由器漏洞在路由器中传播
- 1024Studio官网
- python3 时区 时间戳 指定输入时间为东八区时间、北京时间
- 不可思议:99%的人不了解的真实中国历史
- 低调,中国的FPGA到底有多强?
- windows下ping特定端口
- 除法的向上取整和向下取整
- android 信号研究(包括信号图标和信号优化)
- 【前端开发】Vue + Fabric.js + Element-plus 实现简易的H5可视化图片编辑器
- Unity 将Sprite打包进图集
热门文章
- java 等待线程池结束_等待线程池中任务执行完毕做优雅关闭
- 根据银行卡号判断是哪个银行
- 【SQL 中级语法 2】自连接的用法
- java定义一个Person类
- Android大话设计模式 第三章----开放封闭原则---孙悟空任弼马温一职
- 输入一段英文句子,单词之间用若干空格隔开,将每个单词的首字母转换为大写字母。 例如,“I am very glad to see you”的转换结果为“I Am Very Glad To See Yo
- Python计算机视觉编程(二)---SIFT、Harris特征
- dbeaver针对某张表写sql(复制软件sql模板)
- Web前端开发 北京林业大学 CSS样式-单元作业
- FreeRTOS学习记录(四):任务、任务切换(难点)