200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > python爬虫 入门+进阶_python爬虫入门到进阶(三)

python爬虫 入门+进阶_python爬虫入门到进阶(三)

时间:2019-02-02 23:49:54

相关推荐

python爬虫 入门+进阶_python爬虫入门到进阶(三)

本节:

带Cookies的访问

设置headers访问绕过网站检测

设置Headers

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

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

(允许我皮一下)

第一个请求返回的状态码是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 = "/"

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':'',

'Referer':''}

#头中多个数据用','相隔

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

9import urllib2

enable_proxy = True

proxy_handler = urllib2.ProxyHandler({"http" : 'http://some-: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

2import urllib2

response = urllib2.urlopen('', timeout=10)

1

2import urllib2

response = urllib2.urlopen('',data, 10)

URLError

网络异常捕获

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17import urllib

import urllib2

url = "/"

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':''}

#头中多个数据用','相隔

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

13import 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('')

for item in cookie:

print 'Name = '+item.name

print 'Value = '+item.value

2.保存Cookie到文件1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22import 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('')

#保存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文件中

具体讲解都写在了注释里

3.从文件获取Cookie1

2

3

4

5

6

7

8

9

10

11

12

13import cookielib

import urllib2

#创建MozillaCookieJar实例对象

cookie = cookielib.MozillaCookieJar()

#从文件中读取Cookie信息到变量

cookie.load('cookie.txt',ignore_expires=True,ignore_discard=True)

#创建请求的request

req = urllib2.Request("")

#利用urllib2的build_opener方法创建一个opener

opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))

response = opener.open(req)

print response.read()

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

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

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。