python爬虫零基础入门——反爬的简单说明

之前在《如何开始写你的第一个python脚本——简单爬虫入门!》中给大家分享了一下写一个爬虫脚本的基本步骤,今天继续分享给大家在初期遇到的一个很烦人的问题——反爬及处理办法!

我们的工具及库为:python3.6、pycharm、requests库

基本步骤:获取网页源代码——匹配需要的内容——提取并保存。在这中间经常遇到这么几类问题:

脚本中获取的网页源代码和网页右键查看的源代码不同(编码格式的问题除外),或者返回400状态码

需要登录才能获取,不登录不能查看源代码,网页中也是需要登录才可以访问的

有验证码

开始可以获取内容,运行一段时间后报错(具体情况有:服务器拒绝连接,即ip被封等)一般为HTTPError

我们逐条看看

Headers的使用

某些网站反感爬虫的到访,于是直接拒绝所有爬虫的请求,或者返回其他的网页源码比如:连接频繁稍后在访问,或者直接返回403的状态码,比如抓取简书主页的时候出现下图

这是因为我们在访问网站服务器的时候,没有做任何的伪装,就相当于告诉服务器“我是个脚本”,那么服务器当然不客气的拒绝你了!

处理方法其实很简单,我们在代码中伪装自己是个浏览器就可以了,requests库提供了相应的方法,headers参数,我们重新请求简书主页,加入我的headers参数,在看看结果

这样就实现了网页源代码的获取,这里用到了User-Agent这个参数,它的作用就是告诉HTTP服务器, 客户端使用的操作系统和浏览器的名称和版本值,获取它也很简单,比如我用的火狐浏览器,打开网页后,用F12打开开发者工具,然后选择网络,当访问简书主页的时候,会出现很多的情请求,随便找一个点击一下,右边就会出现请求头了,如下图:

python直播学习群542110741

而这个请求头中的其他参数也很重要,具体我们在随后的讲解中慢慢解释

requests.session方法

在我们想抓取某些需要登录才可以访问的网页时,就需要带上cookie参数,这个参数在请求头中,它记录了我们的账号信息,具体实现的方法有2个,1就是加入header参数中或者独立写到requests中,代码为requests.get(url,cookie=cookie)。而requests库还提供了另外一个方法:

session,自动保存cookies,可以设置请求参数,下次请求自动带上请求参数

session可以用来提供默认数据,函数参数级别的数据会和session级别的数据合并,如果key重复,函数参数级别的数据将覆盖session级别的数据。如果想取消session的某个参数,可以在传递一个相同key,value为None的dict.

也就是说,我们使用session提交cookie后,服务器如果对cookie有变动,那么session也会自动记录,非常方便,代码实现:

s = requests.Session()

r = s.get(url,cookie=cookie)

print(r.text)

验证码的处理

对于一些简单的验证码,可以进行简单的识别,但是有些反人类的比如12306的验证码,要么直接程序中显示并手工验证,要么通过第三方的打码平台进行验证,当然这个是要收费的。

requests.proxies方法、time模块

我们经常会遇到,脚本可以正常运行,但是很快就出现了报错,远程服务器断开连接或者拒绝访问等等情况,这是因为好多网站都有设定访问速度、次数、流量之类的。

同时这里也希望大家控制住自己,不要多线程不限制的下载,那样对网站很不好的!

这种情况下,requests库提供了一个proxies的方法,就是指定ip代理的功能,它的格式是{"http": "http://10.10.10.10:3128"}这样的,注意key值部分,一定要正确,否则会报错。

而不用代理的话,也可以在程序中人工加入休眠时间的方式来强制脚本不那么快的运行,这就需要用到time库了,比如每次请求间隔0.5秒:time.sleep(0.5),或者加上random库,这样:time.sleep(random.random()*2)

自动化测试工具 selenium

为什么要把selenium放到最后呢,因为用它可以解决大部分的反爬!是的,这个库就是这么厉害!

这里就不详细讲了,随后开个单篇,我们慢慢说!还是那句话,学习本身是一个漫长的过程,我们需要不断的练习来增强我们的学习兴趣,以及学到更扎实的知识!大家加油!

posted on 2018-06-15 20:03  python小玩家  阅读(386)  评论(0编辑  收藏  举报

导航