大家好我是一名喜欢Python的初级初级初初级的程序猿,这些都是我整理的一些学习笔记,喜欢的我们可以一起探讨学习,可以私信我,我们可以建立一个学习群,在这个学习群里我们可以用讲课的方式来分享我们的学习笔记,稳固我们的学习成果。在这个知识共享的时代里我们一起崛起。
此次文章为干货,比较长希望大家耐心看完
这是一个爬取某东商品数据的项目,包括爬取商品名称、图片链接、价格、好/差评、好评度并写入excel表中。最终效果可以在公众号私信 回复“最终效果”
下面开始上干货。这短短不到100行的代码就可以实现以上我所说的功能注:代码块可以左右滑动
import requests
import parsel
import xlwt
import time
url="https://search.jd.com/Search?"
#url地址
headers={
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'
}
# ua伪装
params={
'keyword':'手机'
}
#搜索的参数
res=requests.get(url=url,headers=headers,params=params)
# 请求
se=parsel.Selector(res.text)
#格式化结构
tt=se.xpath('//div[@class="gl-i-wrap"]')
# 这里为所有数据的
wb=xlwt.Workbook()
# # 打开excel
#
sheet=wb.add_sheet('sh')
# 创建名为sh的工作簿
i=1 #行
l=1 # 列
for txt in tt.extract():
l=0
time.sleep(3)
se02 = parsel.Selector(txt)
sname=''.join(se02.xpath("/html/body/div/div/a/em/text()").extract())
sheet.write(i, l, sname)
l = l + 1
price = se02.xpath('//div[@class="p-price"]/strong/i/text()').extract()[0]
# 如果不加[0]会出现['2011']
sheet.write(i, l, price)
l = l + 1
data = se02.xpath('//div[@class="p-img"]/a/img/@data-lazy-img')
imgurl = "https:" + data.extract()[0]
sheet.write(i, l, imgurl)
l=l+1
#sid txt
sid=se02.xpath('//div[@class="p-commit"]/strong/a/@id').extract()[0][10:]
# #获取评价数据
url02="https://club.jd.com/comment/productCommentSummaries.action?"
params02={
'referenceIds' :sid
}
pj=requests.get(url=url02,headers=headers,params=params02)
rj=pj.json()
pjdic=rj.get('CommentsCount')[0]
sheet.write(i,l,pjdic.get('GoodCountStr'))
l=l+1
sheet.write(i, l, pjdic.get('PoorCountStr'))
l = l + 1
sheet.write(i, l, pjdic.get('GoodRate'))
l = l + 1
i = i + 1
#本次循环结束进入下一个循环 同样的下次的内容写入下一行写入下一行
wb.save('电脑商品.xls')
print('爬取成功')
我们使用Python语言编写爬虫项目,首先我们来介绍使用的模块xlwt\parsel\time
Xlwt库介绍:Python语言中,写入Excel文件的扩展工具。相应的有xlrd扩展包,专门用于excel读取。可以实现指定表单、指定单元格的写入。(1) 大致使用流程如下:a、导入模块importxlwtb、创建workbook(其实就是excel,后来保存一下就行)workbook= xlwt.Workbook(encoding = 'ascii')c、创建表worksheet= workbook.add_sheet('My Worksheet')d、往单元格内写入内容worksheet.write(0,0, label = 'Row 0, Column 0 Value')e、保存workbook.save('Excel_Workbook.xls')
Parsel库介绍:该模块主要用来将请求后的字符串格式解析成Re Xpath Css进行内容的匹配。importrequestsimportparselresponse =requests.get(url)sel =parsel.Selector(response.text) #注意这里的S要大写# re正则#print(sel.re('正则匹配格式'))# xpath# print(sel.xpath('xpath').getall())#getall获取全部# css选择器#print(sel.css('css选择器 ::text').extract_first())#获取第一个
TIME库介绍time库是Python中处理时间的标准库提供获取系统时间并格式化输出功能提供系统级精确计时功能,用于程序性能分析
这里主要用到的是:time.sleep(3)
#线程推迟时间 这里使代码延时3秒运行因为本项目爬取的数据较多,请求较为频繁会被服务器拒绝请求,所以进行延时请求
以上所说的这些模块我们都会用到
下面开始一步步讲
一、找到url和请求方式
需要在京东官网进行寻找,找到Url地址等一系列参数。在图1-3中在京东官网搜索 “手机” 然后按F12 在network下找到他的数据查看它的请求方式,和他的Url地址在图1-3中可以找到它相应的参数,请求方式为Get请求url我们也可以看到,还需要找到headers下的UA伪装参数和params下的keyword参数。
二、发起请求
1.Selector格式化数据这里使用上面找到的参数进行请求,然后使用本项目中导入的requests模块中的get请求其中使用在上面找到的三个参数 url、headers、params(这里是keyword的值),它请求回的数据赋值给res变量,然后使用导入的模块parsel中的Selector选择器进行格式化这里的res.text是转换为文本数据的,为什么要转换呢?请看下面这张图
可以看到没有转换时res的格式为response 而他的输出为<response[200]>这是它返回的状态码表明可以爬取到数据,转换se格式为Selector它的输出为html的语句需要的重要参数都在绿色箭头所指的se变量输出的数据中。输出res.txt也可以输出所有的数据,但使用Selector后进行格式化后,Selector更加方便的后来对重要参数的筛选分析,因为它可以使用正则、css选择器、和xpath进行筛选它比其他库更加快捷方便这也是为什么使用这个Parsel库。
2.找出所有的手机模块数据并创建打开excel表
代码块:tt=se.xpath('//div[@class="gl-i-wrap"]')这里分析本项目xpath语句中画线部分的DIV class属性都是一样的为“gl-i-wrap”而这是不同的商品模块数据,所以可以判断到本项目中所有的商品模块都是同样的css属性名,也就是:class="gl-i-wrap"可以找到我们所有的商品数据。se.xpath('//div[@class="gl-i-wrap"]')进行分析://div:是表示所有的div模块[@class="gl-i-wrap"]:是表示class属性为"gl-i-wrap"那么从这里是不是就可以得到本项目的xpath,提取出了本项目所有商品的模块并赋值给了tt变量。同时在的代码中使用xlwt库打开excel表并创建一个名为“sh”的工作簿进行写入准备,并使用行i和l 变量控制他的行和列,来控制写入的表格位置。
3.提取数据
用for循环tt变量(tt是的所有商品的数据集合)L=0是为了的excel的列,本项目每次循环完成后,再次从下一行的第一列开始写入数据 ,如果不赋值l=0会出现行变到下一行(换下一行,在项目循环的最后),列会在上一行最后写的列成为本行的开头列然后一直写下去。
使用time模块中的sleep() 使代码每循环一次,就睡眠5秒这样是为了防止请求过多,网站拒绝访问。
三、提取所需信息1.提取商品名称
第一个提取出的是商品名称变量名为sname其中 ‘’.jons()是将序列中的元素以指定的字符连接生成一个新的字符串。
Xapth代码块:(/html/body/div/div/a/em/text())可以看到红线和箭头标注的位置,红线是第一个DIV第一个红箭头是第二个DIV第二个红箭头是标签a的位置橙色箭头里可以看到是商品的信息也就是要要提取的数据,所以就可以得到“/html/body/div/div/a/em/text()”这个表示在DIV下的DIV里的a标签下的em标签下的text文本信息sheet.write(i, l,sname) l = l + 1然后使用xlwt库中的写入操作,i控制行l控制列写入商品名称并把列数l+1方便写剩余的其他参数
2.提取价格信息
代码模块:xpath('//div[@class="p-price"]/strong/i/text()')解析一下这个xpath路径//div:表示所有的DIV[@class="p-price"]:表示class属性为p-price的模块/strong/i/text():表示strong标签下的i标签里的文本数据总结:在所有的DIV中找到class属性名为p-price的模块(图1-14的红色箭头)在这个模块下的strong标签(橙色箭头)下的i标签(蓝色箭头)里的文本数据。
3.提取图片链接
我们这里找到了图片的地址,前边加https是为了提取出一个完整的地址,我们看到data-lazy-img中已经有了地址,只是差一个'https:'所以我们把https:改为字符串类型让他们进行合并。4.提取评价信息
提取评价信息时需要先找到评价的数据
从这些东西我们可以确定这就是评价的数据信息,评价的爬取数据因为是异步请求,所以需要找到ID值,然后是用ID值进行请求,返回值筛选后进行赋值给变量sid,sid就是最后提取出的id值
这里的图片是提取出的数据,因为我们只要数字ID其他的都不需要,所以我们要使用索引切片进行筛选。
这里就是我们最终筛选出的ID值然后我们使用ID值进行发起请求
对比两张图!!!
上边那张图的最外边是不是有一个花括号那就可以知道这是一个字典里包含着列表,列表里又包含着字典,我们先提取出CommentsCount的值就是我们的第二张图。然后我们对第二张图片里的值进行分析。
分析方法看图
下边是我分析出的一点数据
然后我们使用pjdic.get(’分析出的数据‘)得到最终的数据并写入excel表内。最终结果查看:私信公众号回复“最终效果”
喜欢可以关注一下