此篇内容小结:
基本网页获取
首先向一个 Url 地址发送请求,随后远端服务器将会返回整个网页。
常规情况下,当我们使用浏览器访问网站也是这么一个流程:用户在浏览器输入一个地址,浏览器将会发送一个服务器请求,服务器返回请求的内容,随后浏览器解析内容。其次,发送请求后,将会得到整个网页的内容。最后,通过我们的需求去解析整个网页,通过正则或其它方式获取需要的数据。
- requests.get() ----get请求方法
- post请求方法
最简单的一个爬虫示例:获取百度页面
- import requests:引入 requests 模块
- url=“[https://www.baidu.com/]”:设置要请求的url值,这里为百度。
- headers:为了更好的伪造自己是浏览器访问的,需要加一个头,让自己看起来是通过浏览器访问。
- html=requests.get(url,headers=headers):requests使用get方法,请求网站为url设置的值,头部为headers。
- print(html.text):显示返回的值html中的text文本,text文本则为网页的源代码。
接下来使用BeautifulSoup库解析,使用bs4可以快速的让我们获取网页中的一般信息,例如我们需要获取刚刚得到网页源码中的title标题,首先引入 bs库。
随后使用 beautifulsoup 进行解析,html.parser 代表html的解析器,可以解析html代码;其中 html.text 为网页源码为html。
完整代码示例
以上代码可能会出现编码不一致,出现“乱码”的情况,可以通过以下方式解决:
以上是最最简单的一个爬虫示例,仅针对刚学爬虫的新手,对已入门的朋友们没有什么挑战性,跟高手过招才过瘾呀。
爬虫ip被封的6个解决方法
方法1
- IP必须需要,如果有条件,建议一定要使用代理IP
- 在有外网IP的机器上,部署爬虫代理服务器
- 你的程序使用轮训替换代理服务器来访问想要采集的网站,就算具体IP被屏蔽了,你可以直接把代理服务器下线就OK,程序逻辑不需要变化。
方法2
- ADSL+脚本,监测是否被封,然后不断切换ip
- 设置查询频率限制,调用该网站提供的服务接口
方法3
- useragent伪装和轮换
- cookies的处理,有的网站对登陆用户没有那么严
方法4
尽可能的模拟用户行为,比如:
- UserAgent经常换一换
- 访问时间间隔设长一点,访问时间设置为随机数;
- 访问页面的顺序也可以随机来
方法5
网站封IP的依据一般是单位时间内特定IP的访问次数;
将采集的任务按目标站点的IP进行分组,通过控制每个IP在单位时间内发出任务的个数来避免被封。当然,这个前提是采集很多网站,如果只需要采集一个网站,那么只能通过多外部IP的方式来实现了。
方法6
对爬虫抓取进行压力控制,可以考虑使用代理的方式访问目标站点。例如:
- 降低抓取频率,时间设置长一些,访问时间采用随机数
- 频繁切换UserAgent(模拟浏览器访问)
- 多页面数据,随机访问然后抓取数据
- 更换用户IP,这是最直接有效的方法!
在requests模块中如何设置代理?
爬虫绕过登录
有时候做 Python 爬虫时经常会卡在登录,登录验证码是最头疼的事情,特别是现在的文字验证码和图形验证码。
第一种方法是登录后查看网站的 cookie,请求 url 的时候把 cookie 带上;
cookie 方法我们要分析别人网站的 cookie 值,找出相应的值然后添加进去,对于我们不熟的网站,他们可能也会做加密或者动态处理,所以有些网站也不是那么好操作。如果是自己公司的网站需要测试,我们可以询问对应的开发那个 cookie 值是区分独立用的值,拿出来放在请求里面就行。
第二种方法是启动浏览器带上浏览器的全部信息,包括添加的书签和访问网页的 cookie 信息;
添加 cookie 绕过登录
我们用 selenium 启动浏览器时,需要下载后对应的驱动文件并放在 Python 安装的根目录下,比如我会用到谷歌 Chrome 浏览器。
谷歌浏览器驱动下载地址:
启动 Chrome 浏览器绕过登录
我们每次打开浏览器做相应操作时,对应的缓存和 cookie 会保存到浏览器默认的路径下,我们先查看个人资料路径,以 chrome 为例,我们在地址栏输入 chrome://version/
图中的个人资料路径就是我们需要的,我们去掉后面的 Default,然后在路径前加上「–user-data-dir=」就拼接出我们要的路径了。
Cookies处理
cookies是某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密);
python提供了cookielib模块用于处理cookies,cookielib模块的主要作用是提供可存储cookie的对象。
在python2.0版本导入cookielib直接import cookielib
python3中为http.cookiejar
在爬虫中如果遇到了cookie的反爬如何处理?
- 手动处理
在抓包工具中捕获cookie,将其封装在headers中
应用场景:cookie没有有效时长且不是动态变化
- 自动处理
使用session机制
使用场景:动态变化的cookie
session对象:该对象和requests模块用法几乎一致.如果在请求的过程中产生了cookie,如果该请求使用session发起的,则cookie会被自动存储到session中。
需要注意的一点:并不是所有网站都适合保存cookies进行登录!
怎么检查哪些网站可以使用保存cookies进行登录呢?
我们可以在浏览器中进行登录操作,登录成功后,关闭浏览器,然后重新打开浏览器以后访问此网站,看看是否处于登录状态,如果是登录状态,那么这个网站很大程度上是可以使用cookies进行访问操作的。
应对反爬的小招
爬取人家网站的时候控制一下频率,有事没事睡一会,睡久了没效率,睡短了,被反爬搞掉了那也不行……
随机数更具有欺骗性,random可以用得上了!
可以试着在爬虫代码加入这句代码,安心喝茶无后顾之忧!
模拟浏览器访问页面
User-Agent中文名为用户代理,简称 UA;
它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。
简单来说就是我们经常说到的模拟浏览器去访问页面,避免被被网站反爬到。
fake-useragent:一个非常好用的伪装请求头的库,你绝对值得拥有!
安装fake-useragent库
获取各浏览器的fake-useragent
看看下面的示例:够用不?
所以可以试着在爬虫代码加入一下代码,让 UA更具有欺骗性;
在一些网站服务中,除了对 user-agent 的身份信息进行检测、也对客户端的 ip 地址做了限制,如果是同一个客户端访问此网站服务器的次数过多就会将其识别为爬虫,因而,限制其客户端 ip 的访问。
这样的限制给我们的爬虫带来了麻烦,所以使用代理 ip 在爬虫中是非常有必要的。
由Urllib提供urllib.request.ProxyHandler()方法可动态设置代理IP池,代理IP主要以字典格式写入方法
还有headers这也是最常见的,最基本的反爬虫手段,主要是初步判断你是否是真实的浏览器在操作。
遇到这类反爬机制,可以直接在自己写的爬虫中添加Headers,将浏览器的User-Agent复制到爬虫的Headers中。
验证码处理
验证码我们在很多网站会遇到,如果请求量大了之后就会遇到验证码的情况。
列举三种最常见的验证码:
解决思路:这种是最简单的一种,只要识别出里面的内容,然后填入到输入框中即可,这种识别技术叫OCR,推荐使用Python的第三方库tesserocr,对于没有什么背影影响的验证码如图2,直接通过这个库来识别就可以。
简单的OCR识别验证码:
解决思路:对于这种验证码就比较复杂一点,但也是有相应的办法。我们直接想到的就是模拟人去拖动验证码的行为,点击按钮,然后看到了缺口 的位置,最后把拼图拖到缺口位置处完成验证。
③ 点击式的图文验证和图标选择
这两种原理相似,只不过是一个是给出文字,点击图片中的文字,一个是给出图片,点出内容相同的图片。
gzip 压缩
有没有遇到过某些网页,不论怎么转码都是一团乱码哈哈,那说明你还不知道许多web服务具有发送压缩数据的能力,这可以将网络线路上传输的大量数据消减 60% 以上。
这尤其适用于 XML web 服务,因为 XML 数据 的压缩率可以很高。
但是一般服务器不会为你发送压缩数据,除非你告诉服务器你可以处理压缩数据。
于是需要这样修改代码:
关键:创建Request对象,添加一个 Accept-encoding 头信息告诉服务器你能接受 gzip 压缩数据;
然后就是解压缩数据:
爬虫中文乱码问题
写爬虫时肯定是要去考虑乱码的问题,可以参考一下以下思路:
1)解析服务端返回的header中content-type. 得到编码,改编码是什么就按照什么去解析返回的字节流。
2)如果服务端header中没有content-type 信息,就按照 utf-8 解析返回的内容 。
再去解析meta标签得到编码,并作为最终的解析服务端返回字节流的编码。(因为按照gbk 或者 utf-8 还是其他的编码 解析charset=utf-8 的结果都是一样的,因为它们都兼容ascii编码,也就是前2个字节的码表都一样)
3)如果标签meta中也没有编码的话,那么可以尝试着去得到 en ,zh-CN ,zh. 然后用相应的编码解析返回的内容。
4)如果上面条件1,2,3都不满足的话,可以通过智能探测,如cpdetector,有些特殊网页,它确实是不准确的,如网页的meta中charset和实际的浏览器识别的正常显示的charset不相同的情况,它的识别也是错误的。所以这种办法会有误判的的情况。
不过经过前面的3步也基本能得到编码类型了。
5)还有一种情况就是国内的网页写的不规范,比如实际类型是utf-8,但是写成charset=gbk….这种情况也要考虑。
对于有些网页编码为utf-8的网址,输出时发现中文为乱码,此时我们需要进行两次重编码。
一些琐碎的个人经验:
代码规范;这本身就是一个非常好的习惯,如果开始不注意,以后会很痛苦。
多动手;很多人学Python就一味的看书,这不是学数理化,看看例题可能就会了,学习Python主要还是靠实践。
勤练习;学完新的知识点,一定要记得如何去应用,不然学完就会忘。
学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!