全自动采集最新行业文章(【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("爬取完成")

  

  影响

  

  来源:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线