常用的爬虫模块及使用方法

常用的爬虫模块及使用方法

python的urllib和urllib2模块都做与请求URL相关的操作,但他们提供不同的功能。他们两个最显著的差异如下:

urllib2可以接受一个Request对象,并以此可以来设置一个URL的headers,但是urllib只接收一个URL。这意味着,你不能伪装你的用户代理字符串等。

分析:

:打开https://www.tmall.com/网站,再按F12,可以查看该网页的源代码。

:打开天猫网站

常用的爬虫模块及使用方法

 

referer:有的源代码有,有的没有;它代表的是你是从哪个页面跳转到这个页面的,即:你的下一个页面。

user-agent:每个源代码都有这一项;

cookie:绝大部分是通过我们访问页面的时候给我们返回来的;

urllib是不能进行反爬的;

urllib模块可以提供进行urlencode的方法,该方法用于GET查询字符串的生成,urllib2的不具有这样的功能。这就是urllib与urllib2经常在一起使用的原因。

例:

import urllib,urllib2

#https://www.baidu.com/s?ie=utf-8&f=8(这是一个真正的完整的我们可以请求的参数)

a={

   ‘username’:’qiangzi’,

   ‘password’:’123456’

}

#post请求只能接受两种类型的参数值:1.字符串;2.二进制码;

print urllib. urlencode(a)  #把字典转换成查询字符串

结果:

username= qiangzi&password=123456

 

常用的方法:

1.  urllib2.urlopen(url[,data][,timeout])

urlopen方法是urllib2模块最常用也是最简单的方法,它打开URL网址,url参数可以是一个字符串url或者是一个Request对象。URL没什么可说的,Request对象和data在request类中说明,定义都是一样的。

:data是作为参数来提交的,当data值为空的时候,说明这个请求是get请求;当data有值的时候,说明这个请求是request请求。

 

对于可选的参数timeout,阻塞操作以秒为单位。

例:

urllib2.urlopen(‘http://www.baidu.com’,data=’a=1’,timeout=5)

意思是:这个请求在开始请求以后5秒钟之后还没有响应,这个时候我们就放弃这个请求了,直接返回结果。

 

urlopen方法也可通过建立一个Request对象来明确指明想要获取的url。调用urlopen函数对请求的url返回一个response对象,这个response类似于一个file对象,所以用.read()函数可以操作这个response对象。

例:

import urllib2

response= urllib2. urlopen(’http://python.org/’)

html=response.read()

 

2.  urllib2.Request(url[,data][,headers][,origin_req_host][,unverifiable])

Request类是一个抽象的URL请求。

这里用到了urllib2.Request类,对于下例,我们只通过了URL实例化了Request类的对象,其实Request类还有其他的参数。

data是作为参数请求,如果data不等于None,则该请求为POST,否则为GET。

例:

import urllib2

req= urllib2.Request(’http://python.org/’)

response= urllib2. urlopen(req,data-‘abc’)

the_page=response.read()

 

例:

import urllib

import urllib2

url=’http://www.baidu.com’

values={‘name’:’qiangzi’,’age’:27,’id’:1}

data=urllib.urlencode(values)

req= urllib2.Request(url,data)

response=urllib2.urlopen(req)

the_page=response.read()

 

headers是字典类型,头字典可以作为参数在request时直接传入,也可以把每个键和值作为参数调用add_headers()方法来添加。

例:

req=urllib2.Request(‘http://www.baidu.com’,headers={‘a’:1})

req.add_header(‘a’,1)

这两种添加方式是一样的。

 

作为辨别浏览器身份的User-Agent header是经常被用来恶搞和伪装的,因为一些HTTP服务只允许某些请求来自常见的浏览器而不是脚本,或是针对不同的浏览器返回不同的脚本。例如,Mozilla Firefox浏览器被识别为“Mozilla/5.0(X11;U;Linuxi686)Gecko/20071127Firefox/2.0.0.11”。默认情况下,urllib2把自己识别为Python-urllib/x.y(这里的xy是Python发行版的主要或次要的版本号),如在Python2.6中,urllib2的默认用户代理字符串是“Python-urllib/2.6”。

下面的例子和上面的区别就是在请求时加了一个headers,模仿IE浏览器提交请求。

例:

import urllib

import urllib2

url=’http://www.baidu.com’

user_agent=’Mozilla/4.0 (compatible;MSIE5.5;Windows NT)’

values={‘name’:’qiangzi’,’age’:27,’id’:1}

headers={‘User-Agent’:user_agent}

data=urllib.urlencode(values)

req= urllib2.Request(url,data,headers)

response=urllib2.urlopen(req)

the_page=response.read()

 

3.  其他的一些常用方法

geturl()-返回检索的URL资源,这个是返回的真正url,通常是用来鉴定是否重定向的。

如下面代码4行url如果等于http://www.python.org/说明没有被重定向。如果被重定向了,有可能这个被重定向的值是需要用的,比如下载的时候如果我们要获取那个最终的下载地址。

getcode()-返回响应的HTTP状态代码,运行下面的代码可以得到code=20。如果等于200,说明我这个请求是成功的,如果不等于200,说明我这个请求是有问题的。

例:

import cookielib

import urllib2

cookies=cookielib.CookieJar()

cookieHandler=urllib2.HTTPCookieProcessor(cookiejar=cookies)

opener=urllib2.build_opener(cookieHandler)

request=urllib2.Request(“http://www.baidu.com”)

urllib2.urlopen(request)

for cookie in cookies:

printcookie.name,cookie.value

 

4.  HTTPCookieProcessor(如果要登录、要用到cookie的时候需要用HTTPCookieProcessor,读懂下面这段话需要了解后端才能看得懂哦)

很多网站的资源需要用户登录之后才能获取。

我们一旦登录后再访问其他被保护的资源的时候,就不再需要再次输入账号、密码,那么网站是怎么办到的呢?

一般来说,用户在登录之后,服务器端会为该用户创建一个Session。Session相当于该用户的档案,该档案就代表着该用户。

登陆的时候服务器要求浏览器储存了一个Session ID的Cookie值。每一个访问都带上了该Cookie,服务器将Cookie中的SessionID与服务器中的Session ID比对就知道该请求是来自哪个用户了。

 

opener(能够完成一个浏览器的功能)

我们在调用urllib2.urlopen(url)的时候,其实urllib2在open函数内部创建了一个默认的opener对象,然后调用opener.open()函数。

但是默认的opener并不支持cookie。

那么我们先新建一个支持cookie的opener。urllib2中供我们使用的是HTTPCookieProcessor。

 

创建HTTPCookieProcessor需要一个存放cookie的容器。

Python提供的存放cookie的容器位于cookielib,有以下几个:

Cookie.Jar->FileCookieJar->MozillaCookieJar/LWPCookieJar

 

urllib2.install_opener(opener)

会设置urllib2的全局opener

 

json包

json.dumps将Python对象编码成JSON字符串;

json.loads将已编码的JSON字符串解码为Python对象;