前言
看完视频后,便实践去爬取北京新发地的菜价,但该网页相较于视频中爬取时有了较大变化,但并不影响爬取,也是我第一次爬取这样的情况,下面开始演示
爬取过程
准备阶段
集成开发环境:Pycharm
相关模块:requests、re
知识储备:直观来讲,看完爬虫1000集前27集即可,但要稍微理解里面所讲知识的内核,需要一些基础(HTML+CSS、请求响应、HTTP、Cookie和Session、正则表达式、Python、爬取),这些基础可以边学边用边补充,妨碍不大
实践
来到网页后通过查看网页源代码可以发现是客户端渲染,也就是数据是通过第二次请求后获取的,具体怎么获取,可以打开开发者工具,然后切换到Network选项卡,按F5刷新下,然后选择XHR选项,即可在下面找到数据
XHR
全称XMLHttpRequest
,是一组API函数集,可被JS、VBScript及web浏览器内嵌脚本语言调用,通过HTTP在浏览器和web服务器之间收发XML或其它数据。
然后就是代码实现
import re
import requests
import csv
url = 'http://www.xinfadi.com.cn/getCat.html'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'
}
dat = {
"prodCatid": "1186"
}
# 发送post请求
resp = requests.post(url,data=dat,headers=headers)
info = resp.json()
print(type(info))
vegetable = info['list']
# print(vegetable) # 观察数据保存的具体情况
sclist = []
for item in vegetable:
scdict = {}
# 品名
prodName = item['prodName']
# 最低价
lowPrice = item['lowPrice']
# 平均价
avgPrice = item['avgPrice']
# 最高价
highPrice = item['highPrice']
# 规格
specInfo = item['specInfo']
# 产地
place = item['place']
# 单位
unitInfo = item['unitInfo']
# 发布日期
pubDate = item['pubDate']
scdict['品名'] = prodName
scdict['最低价'] = lowPrice
scdict['平均价'] = avgPrice
scdict['最高价'] = highPrice
scdict['规格'] = specInfo
scdict['产地'] = place
scdict['单位'] = unitInfo
scdict['发布日期'] = pubDate
sclist.append(scdict)
header = ['品名','最低价','平均价','最高价','规格','产地','单位','发布日期']
with open('北京新发地蔬菜价格查询.csv','w',encoding='utf-8',newline='') as f:
writer = csv.DictWriter(f,header)
writer.writeheader()
writer.writerows(sclist)
resp.close()
代码讲解
首先就是抓取到数据所在的具体url,然后就是获取其内容,在通过type(info)
了解内容是以字典形式保存,然后继续输出数据print(vegetable)
分析具体保存情况,了解到序列中嵌套着序列,之后就是赋值然后添加到字典,然后将字典添加到列表中,最后在通过csv模块写入到csv文件中,其中写入即writerows
采用的是多行写入,这里必须要采用多行写入,不清楚可以看我写的(Python)爬虫学习(三)这篇文章
其中因为是post方式提交,需要找到form data并请求,现在form data存在位置变成如下图所示
运行结果如下
小结
没有什么难度,剩下的就是爬取美女图片了,也是我当初学爬虫的目的,也只是当初,毕竟,我虽然喜欢看高颜值姑娘的,但也更容易被有内涵的姑娘所打动,开玩笑,继续努力~