零基础小白如何在最短的时间快速入门python爬虫?

urllib提供了一些工具方法,用于对发送请求时的字符串进行转义或编码 。
发送get/post请求则需要用到urllib2中提供的几个类
在掌握了如何在python中构造http请求后,下一步需要做的就是结合具体的网页,分析出web页面的请求方式、参数传递方式和必要的header信息(如cookie等) 。chrome控制台的network分析基本上可以满足需求,但一款抓包利器无疑可以提升我们的效率 。推荐使用fiddler进行抓包和解包,可以更清晰第看到http中所用的不同请求方式 。
字符串查找、正则表达式、html解析
http请求的response通常包含两种:json字符串,或html代码片段,信息的提取就转变成了字符串处理 。此时无论是通过字符串查找、正则表达式匹配,只要能定位到目标字段即可 。
但更好的方法是对html的Dom树进行解析,尤其是存在多个目标字段需要抓取时,解析html的方式能够对特殊格式的字段信息进行批量解析 。
这里使用python自带的htmlparser进行解析,htmlparser对html片段进行深度优先的遍历 , 在遍历的过程中可以识别出开始标签、结束标签和标签中的内容,因此提供了一种基于标签tag的编程方式 。看下面的例子
需要提取手机的操作系统、核心数、cpu型号等信息 , 根据html的标签、属性名称,代码如下:
针对中关村上的某个手机详细
handle_data可以提取html标签中的数据,但handle_data存在两个问题 。
(1)当标签内容为空时,handle_data自动跳过该标签 。这里的标签为空是指标签中不包含任意字符串内容、不包含其他的子标签 。注意,当标签中含有&nb等空白字符串时,handle_data可以解析出其中的data 。比如以下结构中,电话号码一列允许为空 , 通过html_parser解析后只得到4个的标签内容 。
由于会跳过内容为空的标签的解析,就会打乱html的结构,由于数据的缺失返回的list长度不定,导致无法将list中每项内容与html中的内容对应起来 。
(2)标签中包含子标签时,内容会被分割到不同的handle_data函数中,比如
由于handle_data是针对每个标签返回数据,以上的td里包含了一个span子标签,handle_data分为2次返回数据 。即第一次调用handle_data返回状态:,第二次调用handle_data返回已拒绝 。我们希望标签中的内容作为整体返回,而现在被分割成了两块 , 同样会破坏结构 。
解决以上两个问题的关键方法在于,使用cache缓存字符串 , 把对数据的处理从handle_data推迟到handle_endtag 。只有遇到end_tag时,才能确定标签闭合,使数据完整 。
爬虫被屏蔽后怎么办
【零基础小白如何在最短的时间快速入门python爬虫?】服务器会通过一些策略屏蔽恶意爬虫,以避免对服务器资源的消耗 , 如检查同一IP的访问频率、访问间隔等 。
所以我们也应该使用一些简单策略,使我们的爬虫看起来更像是人的行为,以绕开服务器的检测机制 。常用的方法包括延长相邻请求的间隔 , 相邻间隔使用随机时长 。
在请求的header字段中包含了user-agent字段,服务器通过检测user-agent字段确定客户端的类型 。如果不指定user-agent字段,请求时脚本会默认填充该字段,如下图
# python中默认的user-agent字段
网上有一些说法user-agent的值会影响爬虫是否能够抓取web内容,为了避免爬虫被屏蔽js网页验证码有什么用js网页验证码有什么用,将user-agent的值设为浏览器的类型:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36
但在实际抓取的几个web站点中,user-agent的值对爬虫被屏蔽没有影响 , 在使用时不用刻意设置user-agent的值 。
以上的方法都是避免爬虫被屏蔽掉 。但万一很不幸爬虫已经被屏蔽了,发出请求返回的结果是输入验证码的页面,此时该如何解决呢?
本文到此结束 , 希望对大家有所帮助!

猜你喜欢