全自动采集最新行业文章(【Python】绕过反爬,开发音乐爬虫,实现完美采集)
优采云 发布时间: 2022-01-06 15:07全自动采集最新行业文章(【Python】绕过反爬,开发音乐爬虫,实现完美采集)
前言
emmmmmm,大家好,我叫山年。基本上我每天更新一个实际的Python爬虫文章,但是反应好像不是很好,看了几百篇,我觉得我对每篇文章文章解释的很仔细,大家觉得兴趣可以被评估:
[Python]绕过防爬,开发音乐爬虫,完美采集
【Python】纯干货,5000字博文教你采集整站小说(附源码)
【Python】绕过X调_signature签名,完善采集全站视频,个人视频
好坏都能接受,勤奋是我们一直在做的
开始
目标网址
搜索与 Python 相关的工作
嗯,这个页面是我们想要的一些数据采集。
分析 (x0)
这次直接点击,查看网页源码,搜索我们需要的内容采集,看看源码中是否有我们需要的数据:
显示结果为0,表示数据不在我们网页的源代码中。
但它是在我们的元素网页元素中,这也是我反复强调的:网页的源代码是服务器向浏览器传输的原创数据,网页元素是网页源代码在由浏览器渲染(可能是浏览源代码中一些JavaScript脚本实现的效果)
分析 (x1)
既然不是在网页源码中,而是在元素中,那么我们可以使用selenium来执行一个数据采集,因为selenium采集的数据是元素中的数据,但是缺点是采集的速度慢。
不想慢,继续分析,我们抓包看看浏览器是否执行了网页源代码中的JavaScript脚本,调用了某个接口的api来生成我们需要的数据。刷新当前页面抓包:
哎,可以看到禁止调试了,如果开发者写了一个javascript语句阻止我们调试怎么办?
单击右箭头打开忽略断点,然后单击运行。
emmmmm 查看捕获的数据
已经确认就是这个包了,接下来我们来分析一下这个请求
post请求,那么有3个参数:
不知道first是什么意思,pn是1(这是第一页)kd是Python(搜索到关键词是Python)。
说明 说明?只要我们请求这个链接,就可以得到我们想要的数据!
这里请注意,服务器会检测cookies,即我们必须在请求头中携带cookies!自己测试一下吧。
分析 (x2)
然后我们开心的采集下来第一页,就用提取规则提取想要的数据。
然后分析X1中的一个点,再重复一遍,服务端会检测cookies,也就是我们必须在请求头中携带cookies!
并且cookies是有时间敏感性的(比如你登录XX网站,短时间内不需要重新登录,十天半后可能需要重新登录。 这就是为什么)
然后说明:在采集数据之前,我们先自动获取网页的cookies,然后通过cookies获取采集的数据。这样就可以实现完全自动化,而不是手动复制cookie
那么思路就清晰了:先白化用户(不带cookies),请求访问网站首页获取服务器返回的cookies,然后利用这个cookie去post界面获取我们需要的数据
到目前为止,我们只有采集到第一页的数据,如果我们需要采集的所有数据怎么办?
我们继续分析。如果你想要采集的所有页码的数据,我经常告诉你一个思路:先看看我们的网站翻页后的变化。显然我们不会在这里工作,因为数据是由接口api生成的。那么,我们换个思路,翻页后抓取第二页的api,看看它和第一页的api有什么不同。
可以看出有几个变化的点和没有变化的点。首先,post地址没变,只是参数变了。
first变为false,pn为页码变为2,关键词与Python保持一致,并添加sid参数。
分析 (x3)
看第三页,是first还是FALSE,sid的值也是不变的,如果不改变就好办了(就是第一页和后面页码的参数不一样),如果它不断地无限变化,我们需要找到变化的规律。
阅读第三页上的包裹后,我知道事情变得更容易了。
规则总结:参数frist第一页为ture,其他页均为FALSE,pn随页码变化,kd为自己搜索到的关键词,sid的第一页为空,下一页页码是一个固定值(这里想给大家解释一下,其实第一页传入sid参数也是可以访问的。不要问为什么,这是资深爬虫的直觉) .
当我们翻到第一页时,它确实带有 sid ……而且首先变成了 FALSE,这太神奇了。
神奇的点在哪里?之前我们在首页抓包的时候,可以看到first是TRUE,sid没有这个参数。也就是访问第一页后生成sid参数,然后将sid传入到第二页码中。其中接口的参数。
如果我们直接把页码界面的所有参数都写成四个,第一个不为TRUE,sid是固定的,可行吗?
不可行,除非你手动抓包复制sid,因为sid是访问第一页的数据后产生的...
如果看不懂,就看看这段神奇的地方在哪里。
综上所述,我们现在需要做的就是弄清楚sid值是从哪里来的。
分析 (x4)
可以直接ctrl+f搜索,可以知道sid确实是帖子第一页获取数据。
所以大体思路是先访问首页获取cookies,然后获取帖子首页的sid。第一页的参数first为TRUE,sid为空,后面的页码first为FALSE,sid为第一页发布后得到的值。
...当我手动翻页时
醉了,网站的版本已经改版了。如果没有登录的用户操作太多,他们会直接让你登录...也就是说,cookies只能手动登录后才能复制,因为这个登录也有那个特殊的我不能去通过验证码。找个编码台不划算……
没办法,我被手动cookies委屈了。
代码
``
当然,学习Python会很困难。没有好的学习资料,如何学习?
如果你在学习Python时不明白,建议加入交流Q群号:928946953
群里有志同道合的朋友,互相帮助,群里有很好的视频学习教程和PDF!
有大牛解答!
``
import requests
import time
import sys
cookies = '手动copy'
url = 'https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false'
headers = {
'authority': 'www.lagou.com',
'method': 'POST',
'path': '/jobs/positionAjax.json?needAddtionalResult=false',
'scheme': 'https',
'accept': 'application/json, text/javascript, */*; q=0.01',
'accept-encoding': 'gzip, deflate, br',
'accept-language': 'zh-CN,zh;q=0.9',
'content-length': '63',
'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
'cookie': cookies,
'origin': 'https://www.lagou.com',
'referer': 'https://www.lagou.com/jobs/list_Python?labelWords=&fromSearch=true&suginput=',
'sec-ch-ua': '"Chromium";v="92", " Not A;Brand";v="99", "Google Chrome";v="92"',
'sec-ch-ua-mobile': '?0',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'same-origin',
# 'traceparent': '00-2a566c511e611ee8d3273a683ca165f1-0c07ea0cee3e19f8-01',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36',
'x-anit-forge-code': '0',
'x-anit-forge-token': 'None',
'x-requested-with': 'XMLHttpRequest',
}
sid = ""
def get_data(flag, page, sid):
data = {
'first': flag,
'pn': page,
'kd': 'python',
'sid': sid
}
return data
for page in range(1, sys.maxsize):
time.sleep(5)
if page == 1:
flag = True
else:
flag = False
response = requests.post(url=url, headers=headers, data=get_data(flag, page, sid))
sid = response.json()["content"]['showId']
text = response.json()['content']['positionResult']['result']
print(text)
with open("result.csv", "a", encoding='utf-8') as file:
for cp in text:
cp_msg = f"{cp['city']},{cp['companyFullName']},{cp['companySize']},{cp['education']},{cp['positionName']},{cp['salary']},{cp['workYear']}\n"
file.write(cp_msg)
print(f"第{page}页爬取完成")
print("爬取完成")
影响
来源: