爬虫入门-02-爬虫模块介绍

来源:互联网 发布:传智播客7月-8月大数据 编辑:程序博客网 时间:2024/06/06 12:57

爬虫入门-爬虫模块介绍

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

  • urllib2可以接受一个Request对象,并以此可以来设置一个URL的headers,但是urllib只接收一个URL。
    这意味着,你不可以通过urllib模块伪装你的User Agent字符串等(伪装浏览器)。
  • urllib2模块比较优势的地方是urlliburllib2.urlopen可以接受Request对象作为参数,从而可以控制HTTP Request的header部。

  • urllib模块可以提供进行urlencode的方法,该方法用于GET查询字符串的生成,urllib2的不具有这样的功能。

  • urllib.urlretrieve函数以及urllib.quote等一系列quote和unquote功能没有被加入urllib2中,因此有时也需要urllib的辅助。

这就是urllib与urllib2经常在一起使用的原因。

Google调试:F12
爬虫常用:
1) Sources (js源码)
2) Elements(页面元素)
3) Network(网络请求)

  • user-agent 电脑打开微信网页显示无法打开,就是修改了user-agent参数
  • referer参数地址,是上一个页面的地址链接,简单反扒处理
  • cookie 服务器返回的cookie,保存一些参数,下一次请求会覆盖旧的cookie

常用的方法

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

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

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

import urllib2response = urllib2.urlopen('http://python.org/')html = response.read()

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

import urllib2req = urllib2.Request('http://python.org/')response = urllib2.urlopen(req,data='abc')the_page = 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 urllibimport urllib2url = 'http://www.baidu.com'values = {'name' : 'test',          'age' : 27,          'id' :1}data = urllib.urlencode(values)req = urllib2.Request(url, data)response = urllib2.urlopen(req)the_page = response.read()

headers——是字典类型,头字典可以作为参数在request时直接传入,也可以把每个键和值作为参数调用add_header()方法来添加。作为辨别浏览器身份的User-Agent header是经常被用来恶搞和伪装的,因为一些HTTP服务只允许某些请求来自常见的浏览器而不是脚本,或是针对不同的浏览器返回不同的版本。例如,Mozilla Firefox浏览器被识别为“Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11”。默认情况下,urlib2把自己识别为Python-urllib/x.y(这里的xy是python发行版的主要或次要的版本号,如在Python 2.6中,urllib2的默认用户代理字符串是“Python-urllib/2.6。下面的例子和上面的区别就是在请求时加了一个headers,模仿IE浏览器提交请求。

import urllibimport urllib2url = 'http://www.baidu.com'user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'values = {'name' : 'test',          '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()

添加header也可以采用另一种方案

req.add_header('Referer', 'http://www.python.org/')

3)其他的一些常用方法
geturl() — 返回检索的URL资源,这个是返回的真正url,通常是用来鉴定是否重定向的,如下面代码4行url如果等于“http://www.python.org/ ”说明没有被重定向。如果被重定向了,有可能这个被重定向的值是需要用的,比如下载的时候如果我们要获取那个最终的下载地址
getcode() — 返回响应的HTTP状态代码,运行下面代码可以得到code=200,具体各个code代表的意思请参见文后附录。

4)HTTPCookieProcessor
很多网站的资源需要用户登录之后才能获取。
我们一旦登录后再访问其他被保护的资源的时候,就不再需要再次输入账号、密码。那么网站是怎么办到的呢?
一般来说,用户在登录之后,服务器端会为该用户创建一个Session。Session相当于该用户的档案。该档案就代表着该用户。
那么某一次访问请求是属于该用户呢?登录的时候服务器要求浏览器储存了一个Session ID的Cookie值。每一个访问都带上了该Cookie。服务器将Cookie中的Session ID与服务器中的Session ID比对就知道该请求来自哪个用户了。

opener
我们在调用urllib2.urlopen(url)的时候,其实urllib2在open函数内部创建了一个默认的opener对象。然后调用opener.open()函数。
但是默认的opener并不支持cookie。
那么我们先新建一个支持cookie的opener。urllib2中供我们使用的是HTTPCookieProcessor。

创建HTTPCookieProcessor需要一个存放cookie的容器。
Python提供的存放cookie的容器位于cookielib,有以下几个。
CookieJar -> FileCookieJar -> MozillaCookieJar / LWPCookieJar

import cookielibimport urllib2cookies = 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:    print cookie.name, cookie.value

上面的代码显示,urllib2的确帮我们把cookie从response中提取出来。但是如何保存在一个文件中呢?

urllib2.install_opener(opener)

会设置 urllib2 的全局 opener

最后来讲解下这个json包
json.dumps 将 Python 对象编码成 JSON 字符串
json.loads 将已编码的 JSON 字符串解码为 Python 对象

原创粉丝点击