很久之前做的一个小项目了,爬取大众点评的评论,我这里就用熊猫基地的案例来展示整个爬取过程了,首先,其实评论分了两种,一开始进入的评论界面是涉及js逆向的,然后下方的更多评论中的评论爬取就较为简单,不涉及逆向
- 大众点评js逆向
我们打开开发者工具随便搜索一个在页面中看到的用户id,查看评论和图片是否是写死在源代码中的
这里我们可以看到,其实我们所要爬取的数据ajax请求
再去看看查询字符串参数,发现_token是变化的,仔细对比观察能发现cookie不变,这就意味着_token涉及加密,我们在下方的搜索中查询_token,一般习惯性都是加密谁就搜索谁
在可疑的地方打断点测试看返回值,很明显我们找对地方了,此处有我们想要的_token,我们可以看到_token = n,而n = h(i, e.sendData),所以我们需要进入到h中查看
n = i.reload(s),我们在进入i.reload(s)中查看,毕竟n = _token,i = window.Rohr_Opt所以我们进入到i中查看
这里就是我们所需要的加密js代码了,我们把他全部扣下来,再补充好环境,这里我就不多讲了,自己运行代码会有提示,最后需要把js代码封装成函数,一切都做好之后就可以开始爬虫了
这里我们用到的是execjs这个库
node = execjs.get()
sign = node.compile(open('E:\pythonfile\js文件\大众点评js.js',encoding='utf-8').read())
fun = 'token()'#这里是js文件中我们写的函数的名字
token = sign.eval(fun)
把token加入到请求头参数里面,后面就是正常的爬虫流程,我就不过多的介绍了
- 大众点评数据爬取
前面我有介绍到点击更多评论之后的评论数据是不加密的,这里我就简单的分析一下网站就好了,通过分析网站我们能发现,更多评论中的评论数据都是写在源代码中的,并且图片是懒加载,且没有涉及加密,这就意味着我们要获取到图片地址是data-lazyload,而不是src。
另外,我们多看几页能发现,第一页是默认页,和后面的url都不一样,思路理清楚以后我们就可以开始爬虫了
def get_url(url):
url_lis = []
for i in range(1, 5):
if i == 1:
url_lis.append(url)
else:
urlr = url + f'/p{i}'
url_lis.append(urlr)
return url_lis
这里我们先实现首页和后面几页的Url不一样的问题,解决了以后就可以开始爬虫了
def resq(url,headers):
url = get_url(url)
for u in url:
try:
res = requests.get(u,headers=headers)
if res.status_code == 200:
try:
html = etree.HTML(res.text)
item = html.xpath('//*[@class="reviews-items"]/ul/li')
src_lis = []
for i in item:
pl = ''.join(i.xpath('./div/div[3]/text()')).encode('utf-8')
src = i.xpath('./div/div[5]/ul/li[@class="item"]/a/img/@data-lazyload')
src_lis.append(src)
# print(src)
# print(src_lis)
return src_lis
except urllib.error.HTTPError as e:
print(e)
except Exception as e:
print(e)
这一部分就是爬虫的代码,后续可以把获取到的图片地址进行二次请求保存到本地,就好了