tsvico的博客

好的代码像粥一样,都是用时间熬出来的

python爬虫入门到进阶(三)

本节:

带Cookies的访问

设置headers访问绕过网站检测

 

设置Headers

有些网站会验证访问者是否合法,所以上一节的访问方式在一些网站就会失灵 ,网站对请求不予以响应,为了模拟浏览器工作,我们需要设置一些Headers属性。

我们再来看一下访问网站的一些请求,打开Chrome浏览器,按F12打开 开发者工具

image

(允许我皮一下)

第一个请求返回的状态码是302,是一个网页跳转,我截图让大家看的是Request Headers,这里包含了文件编码、压缩方式、cookie、Host、UA等一些信息,大部分网站只要传入一个UA就可以啦,当然有些网站会加入防盗链,如果遇到,还要加入Referer字段,后边的实战例子会说

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# encoding: utf-8
#有header
import urllib
import urllib2
url = "http://www.baidu.com/"
value = {'username':'tsvico','password':'123456789'}#如果提交数据中需要传参,在这里填入
header = {'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36',
'host':'www.baidu.com',
'Referer':'http://www.baidu.com'}
#头中多个数据用','相隔
data = urllib.urlencode(value)
request = urllib2.Request(url,data,header)
response = urllib2.urlopen(request)
print response.read()

上边的例子中传递了参数和headers,大体格式就是这个样子。

如果请求不需要传递参数直接置空就可以

我们设置了一个Headers,在构建request时传入,在请求时,就加入了headers传送,服务器若识别了是浏览器发来的请求,就会得到响应。

特别的,这里要写一下这些属性的意思

User-Agent: 有些服务器或 Proxy 会通过该值来判断是否是浏览器发出的请求 Content-Type : 在使用 REST 接口时,服务器会检查该值,用来确定 HTTP Body 中的内容该怎样解析。

application/xml: 在 XML RPC,如 RESTful/SOAP 调用时使用

application/json: 在 JSON RPC 调用时使用

application/x-www-form-urlencoded : 浏览器提交 Web 表单时使用 在使用服务器提供的 RESTful 或 SOAP 服务时, Content-Type 设置错误会导致服务器拒绝服务

Proxy(代理)的设置

urllib2 默认会使用环境变量 http_proxy 来设置 HTTP Proxy。假如一个网站它会检测某一段时间某个IP 的访问次数,如果访问次数过多,它会禁止你的访问。所以你可以设置一些代理服务器来帮助你做工作,每隔一段时间换一个代理

下面一段代码说明了代理的设置用法

1
2
3
4
5
6
7
8
9
import urllib2
enable_proxy = True
proxy_handler = urllib2.ProxyHandler({"http" : 'http://some-proxy.com:8080'})
null_proxy_handler = urllib2.ProxyHandler({})
if enable_proxy:
opener = urllib2.build_opener(proxy_handler)
else:
opener = urllib2.build_opener(null_proxy_handler)
urllib2.install_opener(opener)

Timeout 设置

上一节已经说过urlopen方法了,第三个参数就是timeout的设置,可以设置等待多久超时,为了解决一些网站实在响应过慢而造成的影响。

例如下面的代码,如果第二个参数data为空那么要特别指定是timeout是多少,写明形参,如果data已经传入,则不必声明。

1
2
import urllib2
response = urllib2.urlopen('http://www.baidu.com', timeout=10)
1
2
import urllib2
response = urllib2.urlopen('http://www.baidu.com',data, 10)

URLError

网络异常捕获

这里在调试程序时作用很大,有助于分析源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import urllib
import urllib2
url = "http://www.baidu.com/"
value = {}#如果提交数据中需要传参,在这里填入
header = {'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36',
'host':'www.baidu.com'}
#头中多个数据用','相隔
data = urllib.urlencode(value)
request = urllib2.Request(url,data,header)
#异常处理
try:
response = urllib2.urlopen(request)
except urllib2.URLError,e:
print e.code
print e.reason
print data
print response.read()

上边代码加入了异常捕获

Cookie保存

Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)。定义于 RFC2109 和 2965 中的都已废弃,最新取代的规范是 RFC6265 。(可以叫做浏览器缓存)

有些网站内容时要在登陆后才能展示的,我们可以利用Urllib2库保存登录的Cookie,并请求Headers时加入,达到获取数据的目的

Cookielib

cookielib模块的主要作用是提供可存储cookie的对象,以便于与urllib2模块配合使用来访问Internet资源。Cookielib模块非常强大,我们可以利用本模块的CookieJar类的对象来捕获cookie并在后续连接请求时重新发送,比如可以实现模拟登录功能。该模块主要的对象有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。

它们的关系:CookieJar —-派生—->FileCookieJar —-派生—–>MozillaCookieJar和LWPCookieJar

1.获取Cookie保存到变量

1
2
3
4
5
6
7
8
9
10
11
12
13
import urllib2
import cookielib
#声明一个CookieJar对象实例来保存Cookie
cookie = cookielib.CookieJar();
#利用urllib库的HTTPCookieProcessor对象来创建cookie处理器
handle = urllib2.HTTPCookieProcessor(cookie)
#通过handle来个构建opener
opener = urllib2.build_opener(handle)
#此处的open方法同urllib2的urlopen方法,也可以传入request
response = opener.open('http://www.baidu.com')
for item in cookie:
print 'Name = '+item.name
print 'Value = '+item.value

image

2.保存Cookie到文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import cookielib
import urllib2

#设置保存cookie的文件
filenme = 'cookie.txt'
#声明一个MozillaCookieJar对象实例来保存cookie,之后写入文件
cookie = cookielib.MozillaCookieJar(filenme)
#利用urllib2库的HTTPCookieProcessor对象来创建cookie处理器
handle = urllib2.HTTPCookieProcessor(cookie)
#通过handle来构建opener
opener = urllib2.build_opener(handle)
#此处的open方法同urllib2的urlopen方法,也可以传入request
response = opener.open('http://www.baidu.com')
#保存cookie到文件
cookie.save(ignore_discard=True,ignore_expires=True)
#关于最后save方法的两个参数在此说明一下:
#官方解释如下:
#ignore_discard: save even cookies set to be discarded.
#ignore_expires: save even cookies that have expiredThe file is overwritten if it already exists
#由此可见,ignore_discard的意思是即使cookies将被丢弃也将它保存下来,
#ignore_expires的意思是如果在该文件中 cookies已经存在,则覆盖原文件写入,
#在这里,我们将这两个全部设置为True。运行之后,cookies将被保存到cookie.txt文件中

具体讲解都写在了注释里

image

3.从文件获取Cookie

1
2
3
4
5
6
7
8
9
10
11
12
13
import cookielib
import urllib2

#创建MozillaCookieJar实例对象
cookie = cookielib.MozillaCookieJar()
#从文件中读取Cookie信息到变量
cookie.load('cookie.txt',ignore_expires=True,ignore_discard=True)
#创建请求的request
req = urllib2.Request("http://www.baidu.com")
#利用urllib2的build_opener方法创建一个opener
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
response = opener.open(req)
print response.read()

有了Cookie就能对大多数网站进行操作了

本文写作方式以及部分内容借鉴静觅博客

下一节HTML解析,与妹子图爬取

坚持原创技术分享,您的支持将鼓励我继续创作!