常用的爬虫模块及使用方法
常用的爬虫模块及使用方法
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对象;