以前在《如何开始写你的第一个python脚本——简单爬虫入门!》中给你们分享了一下写一个爬虫脚本的基本步骤,今天继续分享给你们在初期遇到的一个很烦人的问题——反爬及处理办法!python
咱们的工具及库为:python3.六、pycharm、requests库浏览器
基本步骤:获取网页源代码——匹配须要的内容——提取并保存。在这中间常常遇到这么几类问题:服务器
脚本中获取的网页源代码和网页右键查看的源代码不一样(编码格式的问题除外),或者返回400状态码cookie
须要登陆才能获取,不登陆不能查看源代码,网页中也是须要登陆才能够访问的网络
有验证码session
开始能够获取内容,运行一段时间后报错(具体状况有:服务器拒绝链接,即ip被封等)通常为HTTPError多线程
咱们逐条看看dom
某些网站反感爬虫的到访,因而直接拒绝全部爬虫的请求,或者返回其余的网页源码好比:链接频繁稍后在访问,或者直接返回403的状态码,好比抓取简书主页的时候出现下图函数
这是由于咱们在访问网站服务器的时候,没有作任何的假装,就至关于告诉服务器“我是个脚本”,那么服务器固然不客气的拒绝你了!工具
处理方法其实很简单,咱们在代码中假装本身是个浏览器就能够了,requests库提供了相应的方法,headers参数,咱们从新请求简书主页,加入个人headers参数,在看看结果
这样就实现了网页源代码的获取,这里用到了User-Agent这个参数,它的做用就是告诉HTTP服务器, 客户端使用的操做系统和浏览器的名称和版本值,获取它也很简单,好比我用的火狐浏览器,打开网页后,用F12打开开发者工具,而后选择网络,当访问简书主页的时候,会出现不少的情请求,随便找一个点击一下,右边就会出现请求头了,以下图:
python直播学习群542110741
而这个请求头中的其余参数也很重要,具体咱们在随后的讲解中慢慢解释
在咱们想抓取某些须要登陆才能够访问的网页时,就须要带上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的方法,就是指定ip代理的功能,它的格式是{"http": "http://10.10.10.10:3128"}这样的,注意key值部分,必定要正确,不然会报错。
而不用代理的话,也能够在程序中人工加入休眠时间的方式来强制脚本不那么快的运行,这就须要用到time库了,好比每次请求间隔0.5秒:time.sleep(0.5),或者加上random库,这样:time.sleep(random.random()*2)
为何要把selenium放到最后呢,由于用它能够解决大部分的反爬!是的,这个库就是这么厉害!
这里就不详细讲了,随后开个单篇,咱们慢慢说!仍是那句话,学习自己是一个漫长的过程,咱们须要不断的练习来加强咱们的学习兴趣,以及学到更扎实的知识!你们加油!