Scrapy提取数据有自己的一套机制|scrapypider数据选择器py文件的使用方法( 二 )
#1.修改http请求头中的USER_AGENT字段信息
USER_AGENT='Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/79.0.3945.130Safari/537.36'
#2.关闭爬虫协议
ROBOTSTXT_OBEY=False
#3.修改日志等级 , 不显现过多的过程信息
LOG_LEVEL='WARN'
#4开启两个pipline
ITEM_PIPELINES={
'JdSpider.pipelines.JSonPipeline':100,
'JdSpider.pipelines.CSVPipeline':300,
【Scrapy提取数据有自己的一套机制|scrapypider数据选择器py文件的使用方法】}
5
●
在items.py文件中定义数据字段
在items.py文件中 , 将该项目中要获取的关键信息通过Field方法定义为字段 , 供项目中其他文件引用 。
importscrapy
classJdspiderItem(scrapy.Item):
#ID编号
ID=scrapy.Field
#商品名称
P_name=scrapy.Field
#商品价格
P_price=scrapy.Field
#卖家
seller=scrapy.Field
#商品图片url地址
P_url=scrapy.Field
pass
6
●
在爬虫文件jdgw.py中写爬虫程序
该爬虫程序起初由basic模板自动生成了JdgwSpider类的框架 , 接下来需要用户通过request和response等方式完善其中的数据提取工作 。
程序由start_requests函数开始 , 由于访问京东的商品页涉及翻页的问题 , 观察网址规律后 , 给出了网址的通用形式 , 并赋值给变量baseurl 。 当请求每个具体页面时 , 用变量keyword和page替换掉字符串中的值 。 采用yield方式 , 通过scrapy.Request方法循环访问每一个页面 , 并解析数据 。
解析每页数据的操作单独写在函数parse中 , 该函数的核心是通过XPath选择器和正则表达式提取目标信息 , 然后通过yield将item中的信息传送至pipline中做进一步处理 , 最后 , 通过request.urlretrieve方法直接下载商品图片 。 jdgw.py文件源代码如下 。
importscrapy
fromurllibimportrequest
fromJdSpider.itemsimportJdspiderItem
#自动新建的爬虫类(继承至Spider类)
classJdgwSpider(scrapy.Spider):
name='jdgw'
allowed_domains=['jd.com']
keyword="手表"#要搜索的关键词 , 可自由修改
page=1#访问的页码变量
count=0#保存商品图片的编号变量
#可以通用替换搜索关键字的
defstart_requests(self):
#循环求情多个页面的信息
print("开始....")
forpainrange(5):#中是要请求的页码范围设定
url=self.baseurl%(self.keyword,self.keyword,self.page)#格式化访问的每个页面地址
yieldscrapy.Request(url,callback=self.parse)
self.page+=2
#解析每个页面返回的数据 , 提取目标字段
defparse(self,response):
#
forbiinbath_info:#可以限定范围[0:10]
item=JdspiderItem#实例化一个item
item["ID"]=self.count+1
self.count+=1#计数变量加1
yielditem
surl=str(self.count)+"_"+str(item["P_price"])+".jpg"#构造保存的图片名称
p_url=response.urljoin(item["P_url"])
request.urlretrieve(p_url,surl)#保存图片
7
●
修改数据存储和处理程序piplines.py
piplines.py文件接收爬虫获得的item信息 , 写了两个pipline , 一个用于将结果保存为JSON格式的文件 , 另一个用于保存为CSV格式的文件 。
importjson
importcodecs
importcsv
#item结果写入JSon文件
classJSonPipeline(object):
def__init__(self):
self.file=codecs.open('goods.json','wb',encoding='utf-8')
defprocess_item(self,item,spider):
line=json.dumps(dict(item),ensure_ascii=False)+'n'
self.file.write(line)
returnitem
#item结果写入CSV文件
classCSVPipeline(object):
def__init__(self):
#打开文件 , 指定方式为写 , 利用第3个参数把csv写数据时产生的空行消除
self.file=open("goods.csv","a",newline="")
#设置文件第一行的字段名 , 注意要跟spider传过来的字典key名称相同
- 36氪首发|烹饪机器人公司「智谷天厨」获数千万元天使轮融资,羲融善道独家投资
- 纸质表格|“数字化”助推火箭升空
- 跨境|跨境电商迈入数字化变革期
- iPhone14|准大学生的数码装备推荐
- 成年后,近视度数还会再加深吗 蚂蚁庄园今日答案6月29日
- 数字化转型|新一代iPad Pro正在路上 外观、配置大升级
- 创业|八成互联网电视非法采集用户数据, 彩电企业怎么办?
- 新书推荐 │ 大数据算法设计与分析
- 唯一拥有蓝色血液的生物,活了4亿年,救得了数万人却救不了自己
- 小米12T核心参数曝光:骁龙8+、120Hz AMOLED屏
