资讯专栏INFORMATION COLUMN

爬虫养成记 - 网络下载器urllib2伪装术

Darkgel / 723人阅读

摘要:发送请求方不希望被跟踪。主要用来将伪装成一个正常的浏览器。该字典就是说是网络协议名称,是代理的。另外一般会明确指定资源存放的位置。意思是将现在提交的数据存放于下第篇。请求删除某一个资源。向服务器提交数据。

前一个教程我们涉及到了urllib2的一些高级应用。这一片文章我们来比较系统的介绍一下。

该篇教程参考了静觅的博文:http://cuiqingcai.com/954.html。
写这篇文章的目的仅仅是加深自己的印象。

Header

很多网站对我们用urllib2发起的请求进行辨别,所以我们需要对我们的请求做一定的伪装。

我打开一个Chrome开发者工具的Network Tab。

查看一个Request Headers

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch, br
Accept-Language:zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4
Cache-Control:max-age=0
Connection:keep-alive
Cookie:__jsluid=237f8e30a392dd2dc08dda3c008b89bc; editor-code-detect-disabled=1; PHPSESSID=web1~1f6bt88ejrrdj2mgchjgfhi3c5; _gat=1; _ga=GA1.2.1502881944.1485175337; Hm_lvt_e23800c454aa573c0ccb16b52665ac26=1485175337,1485352359,1485352371; Hm_lpvt_e23800c454aa573c0ccb16b52665ac26=1485610162; sf_remember=f464bd79380df4d3c64702ba71d500f2
DNT:1
Host:segmentfault.com
Referer:https://segmentfault.com/u/charliecharlie/articles
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36

Accept: 客户端可以响应的数据类型

Accept-Encoding: 客户端可以接受的编码类型

Accept-Language: 客户端可以允许的语言

Cache-Control: 如果制定了max-age=5,则访问过某一个连接5秒内,再访问则不会再请求服务器。

Connection: 如果指定keep-alive则客户端请求长链接。

Cookie: 指定Cookie

DNT: 即Do not Tack。 发送请求方不希望被跟踪。

Host: 即主机。在http 1.0的加强版和http 1.1中加入了Host行。用于区分同一个ip的不同域名。

Referer: 即该请求的来源

Upgrade_Insecure-Requests: 可以阅读https://segmentfault.com/q/10...了解详情。

User-Agent: 即发出请求的用户信息。

Content-Type: 在使用REST接口的时候,服务器会检查该值。用来确定HTTP Body内容该如何解析。主要的值有 application/xml application/json application/x-www-form-urlencoded等

上面对于爬虫比较重要的有User-Agent、Referer。
User-Agent主要用来将Python urllib2伪装成一个正常的浏览器。
Referer主要用来应对有些网站的防盗链措施,给Referer指定一个网址,就是告诉服务器该请求来自域名内的某一个页面。

import urllib2

url = "http://www.baidu.com"
headers = {
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36",
    "Referer": "http://www.baidu.com"
}
request = urllib2.Request(url, headers=headers)
response = urllib2.urlopen(request)
print response.read()
Proxy(代理)设置

上面我们将urllib2通过设置headers将自己伪装成一个正常的浏览器,但是如果我们频繁快速地访问某一个域名,那么服务器就会很快发现我们是一个爬虫,因为正常的一个用户不会如此频繁快速地访问一个网站。

那么,我们就得将自己伪装成好几个用户(IP). 这时候就需要用到代理。
urllib2 默认会使用环境变量 http_proxy 来设置 HTTP Proxy。
但是我们需要更加灵活的切换代理。我们用一个代理访问一段时间后,就需要切换到其他代理再访问。
我们可以给urllib2安装ProxyHandler。ProxyHandler需要传入一个字典。该字典:it must be a dictionary mapping protocol names to URLs of proxies. . 就是说key是网络协议名称,value是代理的url。
例如:

proxies = {
    "http":"http://some_proxy.com:8080",
    "https":"https://some_proxy.com:8080"
}

下面是一个示例代码,展示了如何使用ProxyHandler。

import urllib2

proxy_handler = urllib2.ProxyHandler(proxies={"http": "http://124.88.67.54:80"})

opener = urllib2.build_opener(proxy_handler)
urllib2.install_opener(opener)

response = urllib2.urlopen("http://www.baidu.com")
print response.getcode()
DELETE 和 PUT 函数

http协议有六种请求方法,get,head,put,delete,post,options。

GET 客户端发送一个请求来获取服务器的资源。 服务器返回一组headers和呈现数据(html、图片资源等)给客户端。

HEAD 客户端发送一个请求来获取服务器资源等头信息。服务器只headers信息但是不返回呈现数据。主要的应用场景是用于判断某一个资源是否存在。

PUT 客户端请求新增一个资源。PUT与POST类似,但是表单不支持PUT。另外PUT一般会明确指定资源存放的位置。例如"http://www.myblog.com/articles/2100"。意思是将现在提交的数据存放于articles下第2100篇。由于表单不支持PUT操作,很多框架则是在form表单中设置一个隐藏的input来标示该请求应该是PUT。

DELETE 请求删除某一个资源。

POST 向服务器提交数据。

OPTIONS 向服务器查询该链接支持哪些请求方法。

理论上urllib2只支持GET、POST方法。并不支持http的其他方法。通过源码可知,Request判断采用哪种请求方式是通过判断是否设置了data。

    def get_method(self):
        if self.has_data():
            return "POST"
        else:
            return "GET"

因此我们可以临时覆写request的get_method方法来更改请求方法。例如

request = urllib2.Request("http://www.baidu.com")
request.get_method = lambda: "PUT" # 用匿名函数覆写request的get_method方法。

response = urllib2.urlopen(request)
print response.info()

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/38380.html

相关文章

  • 爬虫养成 - 网络下载urllib2初认识

    摘要:申明本系列文章借鉴了慕课网的课程,。慕课网是一个非常赞的学习网站。是下的一个模块,在中,被拆分成和实现一个最简单的下载器使用函数可以给服务器发送一个请求。该函数返回一个该返回的对象有三个额外的函数取得服务器返回的。默认没有的,请求方式为。 申明:本系列文章借鉴了慕课网的课程,http://www.imooc.com/learn/563。慕课网是一个非常赞的学习网站。 urllib2是p...

    AlphaWallet 评论0 收藏0
  • 爬虫养成 - 什么是网络爬虫

    摘要:趁着春节,希望能写一个小小的网络爬虫框架。网页下载器接收,将页面内容下来。可以定义一个表,定义两个字段和缓存数据库网页下载器网页下载器就是更具下载网页内容等。常见的网页下载器有是官方的基础模块。 趁着春节,希望能写一个小小的网络爬虫框架。先定一个小目标,希望能比较优雅地将某个网站上的所有图片爬下来。暂时先将这个爬虫的名字叫做Squirrel,小松鼠吧。 什么是爬虫 爬虫其实是一种从互联...

    lucas 评论0 收藏0
  • 爬虫养成 - urllib2的调试和错误处理

    摘要:设置和处理事实上,并不是所有发起的请求都能得到服务器的回应。例如网络无链接连接不到服务器链接不存在请求的方法不对等情况都会造成抛出错误。上面说到的出错就会抛出。用于处理相关的错误。 urllib2的timeout timeout参数用于设置超时。我们在爬取一些响应较慢的网站的时候,需要设置一个比较长的超时时间。 response = urllib2.urlopen(request, t...

    CoffeX 评论0 收藏0
  • 爬虫养成 - urllib2的HTTPCookieProcessor

    摘要:相当于该用户的档案。上述的文字对机制描述的比较简单也并不一定完全正确。但是默认的并不支持。中供我们使用的是。创建需要闯入一个存放的容器。即过期的也保存。目前博主只知道链接后带的参数需要与相匹配。但是并不知道两者具体的关系。 很多网站的资源需要用户登录之后才能获取。我们一旦登录后再访问其他被保护的资源的时候,就不再需要再次输入账号、密码。那么网站是怎么办到的呢?一般来说,用户在登录之后,...

    gnehc 评论0 收藏0
  • Python入门网络爬虫之精华版

    摘要:学习网络爬虫主要分个大的版块抓取,分析,存储另外,比较常用的爬虫框架,这里最后也详细介绍一下。网络爬虫要做的,简单来说,就是实现浏览器的功能。 Python学习网络爬虫主要分3个大的版块:抓取,分析,存储 另外,比较常用的爬虫框架Scrapy,这里最后也详细介绍一下。 首先列举一下本人总结的相关文章,这些覆盖了入门网络爬虫需要的基本概念和技巧:宁哥的小站-网络爬虫,当我们在浏览器中输入...

    Bmob 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<