User-Agent字段
先来瞄一眼RFC里关于User-Agent字段的描述:
14.43 User-Agent
user agent originating the request. This is for statistical purposes,
the tracing of protocol violations, and automated recognition of user
agents for the sake of tailoring responses to avoid particular user
agent limitations. User agents SHOULD include this field with
requests. The field can contain multiple product tokens (section 3.8)
and comments identifying the agent and any subproducts which form a
significant part of the user agent. By convention, the product tokens
are listed in order of their significance for identifying the
application.
User-Agent = "User-Agent" ":" 1*( product | comment )
Example:
User-Agent: CERN-LineMode/2.15 libwww/2.17b3
大概就是说这是一个用来标识客服端采用了什么样的Agent向服务端发送请求的字段。为什么提到这个字段,因为它在整个爬虫技术里占了很重要的位置。
如果不在Python代码里标注这个字段,我们看下用这个程序发出的报文里User-Agent字段是什么样的?
Python爬虫User-Agent.jpg显然服务端一眼就认出了你的身份,它也可以利用这点拒绝你的访问达到反爬虫的目的。解决方法很简单,如前文所属,采用add_header()函数为request添加User-Agent字段。代码上篇文章有,就不贴了。
IP代理
<s>IP代理简单来说就是在你和目标服务器之前加一层代理,你把你的GET请求发送给代理,代理会修改报文中的源IP地址,然后把请求转发给你要访问的服务器,服务器会把请求的回复返回给代理(返回的报文的目标IP地址是代理的地址),代理再把报文的目标地址改成你本地的IP地址,然后把报文传给你。在整个过程中,从你的角度上看,你访问的服务器,代理对你来说是透明的;从代理的角度来看,它作为你和服务器的桥梁;从服务器的角度上来看,是代理在访问它。</s>
** 这个地方完全写错了,我所描述的是路由器传递报文的过程,而代理和路由器并不是一回事,代理所在的网络结构层比路由更高,具体可以参见我另一篇日志:**爬虫和IP代理。
用IP代理的目的很明确,就是防止因为同一个IP地址因为短时间多次访问同一个服务器,导致IP被服务器封禁,不再回应。但是据我所知,在使用代理的整个过程中,虽然代理会修改报文中的IP地址字段,但是底层网络结构中的MAC地址是不会修改的,我不确定这里会不会成为反爬虫的一个新切入口,这是个问题?或者高层协议是不会去检查mac地址的,我不太懂。
构建代理访问的Python代码如下(参照:Python3网络爬虫(四):使用User Agent和代理IP隐藏身份)
from urllib import request
#访问网址
url = 'http://www.whatismyip.com.tw'
#这是代理IP
proxy = {'http':'39.106.153.112:80'}
#创建ProxyHandler
proxy_support = request.ProxyHandler(proxy)
#创建Opener
opener = request.build_opener(proxy_support)
#添加User Angent
opener.addheaders = [('User-Agent','Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36')]
#安装OPener
request.install_opener(opener)
#使用自己安装好的Opener
response = request.urlopen(url)
#读取相应信息并解码
html = response.read().decode("utf-8")
#打印信息
print(html)
这里提一点,就是无论是西祠代理还是快代理啊,页面上的IP地址大多数是不能用的。我一开始用这段代码一直不能成功,我查了下说是代理IP有问题,我就一个一个换,还是不行。后来花5块钱买了2W个IP,第一个就能用。
Scrapy
安装过程我就不赘述了,我并没有遇到原作者那么多的问题,我直接执行了pip install scrapy
然后提出少了Microsoft Visual C++ Build Tools
,根据提示信息里的地址安装一下,再执行上面那条指令就能成功了。我感觉这个爬虫技术日新月异,一年多前的代码现在很多都不能直接执行了。真刺激。
关于Scrapy,我推荐两份文档:
- Scrapy 1.3 文档,但这篇文档后半部都是空的,也就是说作者还没有更新完,我看了下最后更新时间是2017-02-10,估计烂尾了。光看已有的部分,感觉作者还是讲的很细的,值得一看。
- Scrapy爬虫框架教程,这文档目前作者只写了四篇,粗读了一下感觉质量很高,推荐。其中就包含了关于Scrapy的理论知识。
- Python3网络爬虫(十二):初识Scrapy之再续火影情缘
- Scrapy 0.24 文档
本文最后一部分,我就简单介绍下Scrapy。
目前关于Scrapy的结构我看到最多的就是这张图:
Python爬虫Scrapy结构.jpg这个架构还是比较典型的,其中Scrapy引擎是整个系统的中枢,负责调度其他几个模块。整个流程从Spiders开始到Item Pipeline结束,会不停的重复直到调度器中没有更多的请求了。
接下来几篇文章我会逐个写一下关于Scrapy的用法和实际的例子,熟练无他,唯练尔。
网友评论