解读:Python精彩解析反反爬虫,采集各行业招聘数据,分析行业行情
优采云 发布时间: 2022-11-12 07:52解读:Python精彩解析反反爬虫,采集各行业招聘数据,分析行业行情
目录
前言
开始
分析 (x0)
分析 (x1)
分析 (x2)
分析 (x3)
分析 (x4)
代码
影响
我有话要说
前言
emmmmmm,大家好,我叫珊年。基本上我每天更新一个Python爬虫实战文章,但是反响好像不是很好,都是上百读,我觉得我每一个文章都解释的很仔细,大家感觉有兴趣的可以去看看:
【Python】绕过反爬,开发音乐爬虫,做到完美采集
【Python】纯干货,5000字博文教你采集全站小说(附源码)
[Python]绕过X音_signature签名,完美采集全站视频,个人视频
好的坏的都能接受,勤奋是我们一直在做的
开始
目标网址
搜索 Python 相关工作
嗯,这个页面是我们想要的一些数据采集。
分析 (x0)
这次直接点击,查看网页源码,搜索我们需要的内容采集,看看源码里面有没有我们需要的数据:
显示结果为0,表示数据不在我们网页的源代码中。
但是在我们的element中就是web page element,这是我反复强调的:web页面的源码是服务器传给浏览器的原创数据,web page element是web页面渲染出来的数据源码通过浏览器(可以浏览浏览器执行源码中的一些JavaScript脚本达到的效果)
分析 (x1)
既然没有网页源码,但是有元素,那么我们可以用selenium来进行一个数据采集,因为selenium的数据采集就是元素里面的数据,但是缺点是不是 采集 慢。
如果不想速度慢,我们继续分析。我们抓包看看浏览器是否执行了网页源码中的JavaScript脚本,并调用了一个接口api来生成我们需要的数据。刷新当前页面抓包:
哎,可以看到禁止调试了。如果开发者写了一个 JavaScript 语句来阻止我们调试呢?
单击右箭头以打开忽略断点,然后再次单击运行。
emmmmm 看看抓到的数据
已经确认这个包是,然后我们分析请求
post请求,然后有这三个参数:
我不知道 first 是什么意思,pn 是 1(这是第一页) kd 是 Python(关键词 搜索的是 Python)。
指示?只要我们请求这个链接,就可以得到我们想要的数据!
这里要小心,服务器会检测cookies,也就是我们必须在请求头中携带cookies!自己去测试一下吧。
分析 (x2)
然后我们愉快地采集下第一页,使用抽取规则抽取出想要的数据。
然后分析X1中的一个点,重复一遍,服务器会检测到cookies,也就是我们必须在请求头中携带cookies!
而且cookies是时间敏感的(比如你登录了某个网站,那么你短时间内就不需要再登录了,十点之后你可能需要重新登录天半月,就是这个原因)
然后说明:在我们采集数据之前,我们首先自动获取网页的cookies,然后使用cookies来采集数据。这允许完全自动化,而不是手动复制 cookie
那么思路就明确了:先是白用户(不带cookie),请求访问网站首页获取服务器返回的cookie,然后使用cookie去post接口获取我们需要的数据
到目前为止,我们只有采集到第一页的数据,但是如果我们需要采集所有的数据呢?
我们继续分析,如果要采集页码上的所有数据,我经常告诉你的思路:先看看我们的网站翻页后的变化,显然我们可以' t在这里工作,因为数据是由接口api生成的。所以,我们换个思路,翻页后抓取第二页的api,看看和第一页的api有什么区别。
可以看出有几个点是变化的,也有几个点是不变的。首先,post的地址没有变,只是参数变了。
first 变为 false,pn 变为 2 为页码,关键词 在 Python 中保持不变,并添加了 sid 参数。
分析 (x3)
再看第三页,不管是第一页还是FALSE,sid值不变。找到变化的模式。
看了第三页的包后,我知道事情会变得很容易。
规则总结:参数frist的第一页为真,其他所有页为FALSE,pn随页码变化,kd为自己搜索到的关键词,sid的第一页为空,如下页码是固定值(这里我想给大家解释一下,其实如果在第一页传入这个sid参数,也是可以访问的。别问为什么,这是一种直觉高级爬行动物)。
当我们翻到第一页时,它确实携带了 sid……而且首先变成了 FALSE,这太神奇了。
魔法点在哪里?当我们抓取首页的包时,可以看到first为TRUE,而sid没有这个参数,也就是说访问第一页后生成了sid参数,然后将sid传入到第二页页码。在接口的参数中。
如果说直接把页码接口的所有参数都写成四个,第一个不为TRUE,而sid是固定的,是否可行?
不可行,除非你手动抓包复制sid,因为sid是访问第一页数据后生成的……
看不懂的看魔术点所在的段落。
综上所述,我们现在要做的就是弄清楚 sid 的值是从哪里来的。
分析 (x4)
可以直接ctrl+f搜索。可以知道sid是第一页获取数据的post。
那么大体思路就是,先访问首页获取cookies,然后post首页获取sid。第一页参数first为TRUE,sid为空,后面的页码first为FALSE,sid为第一页post后得到的值。
...当我手动翻页时
醉了,网站的版本已经改版了。如果未登录的用户操作次数过多,它会直接让你登录……也就是说,cookies只能在手动登录后复制,因为这个登录也有那个特殊的功能。验证码无法访问。不值得找个编码表……
没办法,对不起手动cookies。
代码
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',
<p>
'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("爬取完成")
</p>
影响
我有话要说
- 有些人,
他们赤脚走过你的生活,
眉头带着笑意,不短也不长。
但足以让你感到幸福,
欣赏痛苦,铭记人生。
文章的字现在都写好了,每一个文章我都会说的很详细,所以需要的时间比较长,一般两个多小时。
原创不容易,再次感谢大家的支持。
①2000多本Python电子书(主流经典书籍应该都有)
②Python标准库资料(最全中文版)
③项目源码(四十或五十个有趣经典的培训项目及源码)
④Python基础、爬虫、web开发、大数据分析视频介绍(适合初学者学习)
⑤ Python学习路线图(告别无经验学习)
私信编辑器001
汇总:网站日志采集和分析流程
现场搜索页面、注册表单页面和购物车页面是典型的功能页面,而产品详情页面、新闻和文章页面是典型的内容页面。导航页面的目的是引导访问者获取信息,
功能页的目的是帮助访问者完成特定的任务,内容页的目的是向访问者展示信息,帮助访问者做出决定。例如,从内容导航分析来看,以下两类行为是网站运营商不希望看到的行为:
第一个问题:访问者从导航页(首页)进入,从导航页(列表页)离开网站,才看到内容页(详情页)。本次访问期间,访问者没有完成任务,导航页也没有将访问者引导到内容页(详情页)。因此,有必要分析导航页(列表页)导致访问者中途离开的原因。
第二个问题:访问者从导航页(首页或列表页)进入网站,从内容页(详情页)返回到导航页(首页)。看似访问者完成了本次访问的任务(如果浏览内容页面是本次网站的最终目的),但实际上访问者返回首页开始新的导航或任务。说明需要分析内容页面的初始设计和考虑的内容页面,以提供跨信息推荐。
2.4. 网站转化与漏斗分析(转化分析)
转化是指网站业务流程中的一个封闭通道,引导用户按照流程最终实现业务目标(如商品交易);完成转化目标。
下图描述了转化率分析中的一个常见场景。分析访问路径“首页-搜索-菜品-下单-支付”,依次统计访问各层节点的用户数,得到访问过程的转化率。
统计有一些维度约束,比如日期、时间窗口(整个访问过程在规定时间内完成,否则统计无效)、城市或操作系统等,所以这也是典型的OLAP分析需求。另外,每个接入节点可能都有埋点属性,比如搜索页面的关键词属性,支付页面的价格属性等。从结果来看,用户数逐层收敛,形成可视化中的漏斗形状,所以这类需求也称为“有序漏斗”。
对于转化漏斗,分析有两个主要部分:流失和访客流失。
拒绝转换是访客流失的主要原因之一。这里的阻力包括:
错误设计、错误引导 错误设计包括访客在转换过程中找不到下一步动作的按钮、无法确认订单信息、无法完成支付等流程,如不合适的产品或活动推荐、支付过程中专业名称的解释、帮助信息等。
造成损失的原因有很多,例如: 产品或活动推荐不当 支付环节专业术语和帮助信息解释不当
迷路的主要原因是转化流量设计不合理,访问者无法在某个阶段获得自己需要的信息,无法根据现有信息做出决策,比如在线购买演唱会门票,看不到在线座位选择直到付款。这个时候,你很可能会迷路,回去查看。
三、总体技术流程及结构 3.1.数据处理流程
网站交通日志数据分析是一个纯数据分析项目,其整体流程基本以数据处理流程为主。通俗的可以概括为:数据从哪里来,数据到哪里去,可以分为以下几个主要步骤:
1.1。数据采集
数据采集的概念目前业界有两种解释:
首先,从头开始生成数据的过程(服务器打印的日志、自定义采集的日志等)称为data采集;
另一方面,使用 Flume 等工具将 data采集 移动到指定位置的过程称为 data采集。关于具体含义,需要分析具体语境,理解语境中的具体含义。
1.2. 数据预处理
数据预处理是指在正式处理之前对数据进行一些处理。现实世界中的数据一般都是不完整的、不一致的、脏的数据,不能直接分析,或者不利于分析。为了提高数据分析的质量和便利性,人们开发了数据预处理技术。
数据预处理有多种方法:数据清洗、数据整合、数据转换等。这些数据处理技术在正式数据分析之前使用,大大提高了后续数据分析的质量和便利性,减少了实际分析所需的时间。
从技术上讲,任何可以接受待处理数据并输出数据的语言技术都可以用于数据预处理。如java、Python、shell等。在本项目中,通过MapReduce程序对采集接收到的原创日志数据进行预处理,如数据清洗、日期格式排序、过滤掉非法数据等,并将其排序为点击流模型数据。使用MapReduce的优点是:一是对java语言的熟悉度高,有很多开源的数据处理工具库;其次,MR可以进行分布式计算,并发处理效率高。
1.3. 数据存储
通常将预处理后的结构化数据导入Hive数据仓库,并建立相应的库和表进行映射关联。这允许使用 Hive SQL 对数据进行后续分析。所以这里所说的存储是把数据添加到面向分析的数据仓库,而不是数据库。因为项目中的数据格式比较清晰简洁,可以直接加载到数据仓库中。其实仓储流程还有一个更专业的名字——ETL。ETL是对业务系统的数据进行提取、清洗和转换,然后加载到数据仓库中的过程。
ETL的设计分为数据抽取、数据清洗与转换、数据加载三个部分。我们在设计ETL时也是从这三个部分入手。数据提取是从各种数据源中提取到ODS(Operational Data Store,操作数据存储)——这个过程还可以做一些数据清洗和转换),在提取过程中,需要选择不同的提取方式,以提高操作性尽可能提高 ETL 的效率。在ETL的三个部分中,时间最长的是“T”(Transform,cleaning,conversion)部分。一般这部分的工作量是整个ETL的2/3。数据加载一般是在数据清洗干净后直接写入DW(Data Warehousing,数据仓库)。
1.4. 数据分析
该阶段是项目的核心内容,即使用Hive SQL根据需求分析语句,得到各项指标的统计结果。
1.5。数据可视化
数据可视化是对分析得到的数据结果进行可视化,通常以图表的形式展示。数据可视化可以帮助您更轻松地解读趋势和统计数据。
3.2. 系统架构
与传统BI数据处理相比,流程几乎是一样的,但因为是处理大数据,所以流程的各个环节使用的技术与传统BI完全不同:
4. 模块开发----Data采集
1、网站交通日志数据的获取随着网站在技术和运营上的不断技术进步,人们对数据的要求也越来越高,以实现更精细化的运营提升网站 质量。因此,数据获取方式也随着网站技术的进步和人们对网站数据需求的加深而不断发展。从使用和开发的角度来看,主要分为两大类:网站日志文件和页面嵌入js定制采集。
1.1。网站日志文件记录网站日志文件的方式是最原创的数据获取方式,主要在服务器端完成。可以通过在 网站 的应用服务器中配置相应的日志写入功能来实现,很多web应用服务器都有日志功能。比如 Nginx 的 access.log 日志等。
好处是获取数据时不需要在页面上做相关处理,直接开始统计相关请求信息即可。缺点是有些信息不能采集,比如用户在页面上的操作(如点击、ajax使用等)无法记录。部分指标的统计和计算受到限制。
1.2. 页面埋js定制采集
自定义采集用户行为数据,通过在页面中嵌入自定义的javascript代码获取用户访问行为(如鼠标悬停位置、点击页面组件等),然后通过ajax请求在后台记录日志、信息那可以采集这种方式比较全面。在实践中,可以自定义以下几个方面的数据采集:
系统特性:如使用的操作系统、浏览器、域名、访问速度等。
访问特性:包括被点击的URL、被点击的“页面标签”以及标签的属性等。
来源特征:包括访问URL、访问IP等。
产品特征:包括访问的产品编号、产品类别、产品颜色、产品价格、产品利润、产品数量和特价等级等。以电子商务网站为例,当用户点击一个相关产品页面,其自定义的采集系统会采集相关的行为数据并发送给后端服务器。采集的数据日志格式如下:
所谓代码嵌入,就是在需要统计数据的地方植入N行代码,统计用户的关键行为。例如,如果要统计首页banner的点击次数,上报的数据可以是KEY-VALUE的形式。我们将KEY定义为“CLICK_ADD_BTN”,VALUE的值为点击次数。当用户点击banner时,会通过按钮的“回调”触发并执行banner详情的代码。业务代码执行完毕后,程序员添加统计代码,将“CLICK_ADD_BTN”对应的VALUE加1,banner统计为一次使用。
五、js自定义数据采集采集 一、原理分析
埋点采集数据的过程:提前在网页中添加一小段javascript代码,这段代码片段一般会动态创建一个script标签,并将src属性指向一个单独的js文件。这时,这个单独的js文件(图中绿色节点)就会被浏览器请求并执行。这个js往往是真正的数据采集脚本。
数据采集完成后,js会请求一个后端数据采集脚本(图中的backend),一般是伪装成图片的动态脚本,js会通过http参数将采集到的数据传给后端。脚本,后端脚本解析参数并以固定格式记录到访问日志中,并可能在http响应中为客户端植入一些cookies进行跟踪。
问题解决1:将采集到的数据的js提取出来,单独文件,通过js script标签引入,减少耦合,提高代码复用性
问题解决2:部署两台服务器,一台专门接收采集数据的响应;
跨域问题:跨域的本质是限制JS请求的不安全性。这是对 JS 的限制。在页面采集领域,通常以请求图片的形式绕过所谓的跨域问题。
跨域问题解决:以伪装成请求图片的形式,将采集采集的数据以参数的形式拼接在请求图片的URL后面,从而传递采集数据到指定服务器()