爬虫之战
作者:互联网
网络爬虫基本原理
开始之前先放一下爬虫的基本原理或者说大体过程:
- 获取初始URL。
- 根据初始URL爬取页面并获得新的URL。爬取了对应的URL地址中的网页后,对网页中所需数据进行解析,将数据存储到数据库中,并且在爬取网页的同时,发现新的URL地址,同时将已爬取的URL地址存放到已爬取URL列表中,用于去重及判断爬取的进程。
- 将新的URL放到待抓取URL队列中。
- 从待抓取URL队列中读取新的URL。重复上述的爬取过程。
- 满足爬虫系统设置的停止条件时,停止爬取。
Web爬虫需要解决的问题:
一、是否为公开网站/站点?(=是否需要登录?)
不需要登录是如何标记各个用户的:1、session 2、cookies 3、IP地址。
登录的目的是什么?(=是否一定需要登录?=是否每次都需要登录?)
每次都要登录、如何登录(=验证码)
二、页面是如何加载的?(=动态加载问题)
所需的数据在什么地方可以找到:1、html内 2、json内。
如果是动态记载Ajax怎么办?
三、可以直接请求的页面怎么请求?(=请求头怎么构造?=请求头的内容是否必要?)
怎样优雅地爬虫
精准:请求到的每个字节都是我们想要的数据,不会请求到多余的垃圾。
速度:拥有最优数据解析策略、查重策略、存储策略等。
稳定:完善的异常处理机制,程序崩溃后断点重启。
素质:绝不影响目标站点正常运行。
抓取策略
在爬虫系统中,待抓取URL队列是很重要的一部分。因为涉及到里面的URL以什么样的顺序排列,显著去哪个页面后抓取那个页面的问题,决定这些URL排列顺序的方法,叫做抓取策略。下面重点介绍几种常见的抓取策略:
1.深度优先遍历策略
深度优先遍历策略是指网络爬虫会从起始页开始,一个链接一个链接跟踪下去,处理完这条线路之后再转入下一个起始页,继续跟踪链接。
遍历的路径:A-F-G E-H-I B C D
2.宽度优先遍历策略
宽度优先遍历策略的基本思路是,将新下载网页中发现的链接直接插入待抓取URL队列的末尾。也就是指网络爬虫会先抓取起始网页中链接的所有网页,然后再选择其中的一个链接网页,继续抓取在此网页中链接的所有网页。还是以上面的图为例:
遍历路径:A-B-C-D-E-F G H I
3.反向链接数策略
反向链接数是指一个网页被其他网页链接指向的数量。反向链接数表示的是一个网页的内容受到其他人的推荐的程度。因此,很多时候搜索引擎的抓取系统会使用这个指标来评价网页的重要程度,从而决定不同网页的抓取先后顺序。
在真实的网络环境中,由于广告链接、作弊链接的存在,反向链接数不能完全等他我那个也的重要程度。因此,搜索引擎往往考虑一些可靠的反向链接数。
4.Partial PageRank策略
Partial PageRank算法借鉴了PageRank算法的思想:对于已经下载的网页,连同待抓取URL队列中的URL,形成网页集合,计算每个页面的PageRank值,计算完之后,将待抓取URL队列中的URL按照PageRank值的大小排列,并按照该顺序抓取页面。
如果每次抓取一个页面,就重新计算PageRank值,一种折中方案是:每抓取K个页面后,重新计算一次PageRank值。但是这种情况还会有一个问题:对于已经下载下来的页面中分析出的链接,也就是我们之前提到的未知网页那一部分,暂时是没有PageRank值的。为了解决这个问题,会给这些页面一个临时的PageRank值:将这个网页所有入链传递进来的PageRank值进行汇总,这样就形成了该未知页面的PageRank值,从而参与排序。下面举例说明:
5.OPIC策略策略
该算法实际上也是对页面进行一个重要性打分。在算法开始前,给所有页面一个相同的初始现金(cash)。当下载了某个页面P之后,将P的现金分摊给所有从P中分析出的链接,并且将P的现金清空。对于待抓取URL队列中的所有页面按照现金数进行排序。
6.大站优先策略
对于待抓取URL队列中的所有网页,根据所属的网站进行分类。对于待下载页面数多的网站,优先下载。这个策略也因此叫做大站优先策略。
一整套爬虫思路流程
关于提取数据,也就是上图中的第一层,策略如下:
登录分析:
登录的目的分为两种
第一种是为了确保数据安全性,也就是网页中的数据访问权限并不是均等的,不同的用户有不同的权限,每个用户上传的数据可以选择共享,或者私密,类似于QQ空间。
第二种是为了取保用户安全性,这种网页一般属于‘Web个人主页’,每个用户都享用网站的功能,但各自的数据是不会外泄,类似于支付宝。
虽然说各个网站的登录操作各有不同,各大网站为了防止爬虫可谓是无所不用其极,但是在Web系统中,能维持登录状态只有两种:Cookies和Session(这里如果你有过web开发经验就很好理解),那么我们只要模拟出服务器想要识别出的Cookie和对应的值就可以给服务器一种已经登录的‘错觉’。但是总是需要登录一次才能获得登录过后产生的Cookies。所以接下来的问题就是如何登录。
登录策略:
让各位望而却步的无非不就是登录时的验证码。其实网上有很多公开的策略,例如识别图片验证码、自动滑动验证码。最难的不过是手机验证码。
但是我要说的并不是这些方法。
现如今在国内网络环境下,BAT就像是一个大的生态圈,他们手中攥着大量的用户,所有很多网站为了降低网站门槛,常与他们合作,就像我们常常可以看到使用QQ登录,或者微信登录、淘宝登录,诸如此类。所以我们完全可以通过直接访问这些接口登录,并且网上针对这些网站的自动登录策略可谓非常成熟。
构造请求:
'Host': 'search.originoo.cn',
'User-Agent':' Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:65.0) Gecko/20100101 Firefox/65.0',
'Accept':' application/json, text/javascript, */*; q=0.01',
'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
'Accept-Encoding': 'gzip, deflate',
'Referer':' http://www.originoo.com/ws/p.topiclist.php?cGljX2tleXdvcmRzPeW3peS6uiZtZWRpdW1fdHlwZT1waWMtdmVjdG9y',
'Content-Type':' application/x-www-form-urlencoded; charset=UTF-8',
'Content-Length':' 213',
'Origin': 'http://www.originoo.com',
'Connection': 'keep-alive',
'Cache-Control':' max-age=0',
'pic_keywords':'%E5%B7%A5%E4%BA%BA',
'medium_type':'pic-vector',
'pic_quality':'all',
'sort_type':'4',
'pic_orientation':'',
'pic_quantity':'',
'pic_gender':'',
'pic_age':'',
'pic_race':'',
'pic_color':'',
'pic_url':'',
'user_id':'0',
'company_id':'0',
'page_index':str(i),
'page_size':'40'
这是一个典型的POST的请求头,POST的请求特点就是后面带上参数以表明本次请求的数据是什么。
并不是所有的请求都很长,请求的内容是根据服务器决定的,服务器设计的复杂,那么请求就很相应变得很复杂,反之亦然:
data = { "keyword":"工人",
"color":"0",
"type":"6"
}
以上就是某网站的POST请求data部分。
其实复杂一点也就是请求中有大量服务器生成的校验参数,例如:
headers = {
'Host': 'dpapi.dispatch.paixin.com',
'User-Agent':'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:65.0) Gecko/20100101 Firefox/65.0',
'Accept':'application/json, text/plain, /',
'Accept-Language':'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
'Accept-Encoding': 'gzip, deflate, br',
'Referer': 'https://v.paixin.com/media/photo/standard/%E5%B7%A5%E4%BA%BA/1',
'Content-Type': 'application/json;charset=utf-8',
'Content-Length': '43',
'Origin': 'https://v.paixin.com',
'Connection': 'keep-alive',
'Cookie': 'Hm_lvt_8a9ebc00eda51ba9f665488c37a93f41=1552048374; Hm_lpvt_8a9ebc00eda51ba9f665488c37a93f41=1552048386; Qs_lvt_169722=1552048378; Qs_pv_169722=4547593134179576000%2C332112608763589300; Hm_lvt_f72440517129ff03cc6f22668c61aef3=1552048378; Hm_lpvt_f72440517129ff03cc6f22668c61aef3=1552048386; _ga=GA1.2.1067225704.1552048380; _gid=GA1.2.1727359604.1552048380; _gat=1',
'Cache-Control':'max-age=0',
}
这个请求头中的Cookie值显然不是人看的,其实我们在抓包时看到一些莫名奇妙的参数不要觉得恐惧,因为这是别的程序员写的,他们有他们自己的命名方法和策略,我们只要确认这个值是否必须就可以了。方法很简单,每次请求就删除一部分参数,看看是否可以正常请求,如果可以,那么就继续删,再请求,直到无法访问未知,如果无法访问,就说明你刚才删掉的参数是非常重要的,这个时候再去寻找这个参数的来源。
参考:
通用爬虫编写思路 Vision_Tung:https://blog.csdn.net/Vision_Tung/article/details/88591726
标签:网页,登录,URL,爬虫,抓取,之战,链接,页面 来源: https://www.cnblogs.com/lskreno/p/11521343.html