全自动采集最新行业文章(【Python】纯干货,5000字的博文教你采集整站小说(附源码) )
优采云 发布时间: 2021-11-15 15:20全自动采集最新行业文章(【Python】纯干货,5000字的博文教你采集整站小说(附源码)
)
内容
前言
开始
分析 (x0)
分析 (x1)
分析 (x2)
分析 (x3)
分析 (x4)
代码
影响
我有话要说
前言
emmmmmm,大家好,我叫山年。基本上我每天更新一个实际的Python爬虫文章,但是反响好像不是很好,看了几百篇,我觉得我每篇文章文章都解释的很仔细,大家觉得兴趣可以被评估:
[Python]绕过防爬,开发音乐爬虫,完美采集
【Python】纯干货,5000字博文教你采集整站小说(附源码)
【Python】绕过X调_signature签名,完美采集全站视频,个人视频
好坏都能接受,勤奋是我们一直在做的
开始
目标网址
搜索 Python 相关工作
嗯,这个页面是我们想要的一些数据采集。
分析 (x0)
这次直接点击,查看网页源码,搜索我们需要的内容采集,查看源码中是否有我们需要的数据:
显示结果为0,表示数据不在我们网页的源代码中。
但是是在我们的element 网页元素中,这也是我反复强调的:网页源代码是服务器端向浏览器传输的原创数据,网页元素是网页源代码生成后的数据由浏览器渲染(可能是浏览源代码中一些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,然后使用cookies去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!
有大牛解答!
``
<br />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("爬取完成")
影响
我有话要说
- 有些人,
他们赤脚走过你的生活,
笑脸,不短,不长。
但这足以让你感到快乐,
欣赏痛苦,记住一生。
文章的话现在就写好了,每一个文章我都会讲的很仔细,所以要花很长时间,一般两个多小时。
原创不容易,再次感谢大家的支持。
①2000多本Python电子书(主流经典书籍都有)
②Python标准库资料(最全中文版)
③项目源码(四十或五十个有趣经典的动手项目和源码)
④Python基础、爬虫、Web开发、大数据分析视频(适合小白学习)
⑤ Python 学习路线图(告别不受影响的学习)
在代码中