转载本文请以链接形式注明出处。
1.前言
Python的网络抓取有很多包可以实现,比如:urllib、urllib2、httplib、httplib2。其中httplib、httplib2是专门处理与http相关的;而urllib、urllib2是借助于httplib、httplib2实现的,相当于在httplib、httplib2上又封装了一层来进行处理web数据。而urllib2是urllib的高版本,httplib2是httplib的高版本。
这里我给出一个学习python库的网址,里面有各种lib库的讲解:http://docs.python.org/library/index.html 。有兴趣的读者可以看一下。
由于最近在使用httplib2进行网上抓取数据,所以下面对httplib2进行介绍。
2.httplib2
(1)安装
httplib2的安装:首先下载python的httplib2的安装包,下载地址为:http://code.google.com/p/httplib2/downloads/list;其次, 在dos窗口下进入httplib2的解压目录,执行命令:python setup.py install 。 即完成安装。
(2)使用讲解
下面再给出一个httplib2的学习地址,是httplib2的一个wiki,里面有几个httplib2的简单例子:http://code.google.com/p/httplib2/wiki/Examples 。
(a)下面给出第一个httplib2的例子,根据weibo用户的ID,抓取用户相关信息:
这个例子涉及到cookies的使用,下面简单介绍一下cookies的问题:
当用户抓取的网页需要登陆时,一般的登录页面只需要用户名和密码,此时我们可以采用username和password的python代码抓取网页。但是当用户频繁的登录抓取时,此时登录页面就需要输入用户名、密码和一个随机数字图片验证,图片验证无法屏蔽掉。此时,我们这里可以采用先获取用户登陆后的cookies,再以http的get请求的方式向用户发送headers(该headers包含用户登陆后的cookies信息),这样就避免了登陆。
获取cookies的方法我感觉有2种,一种是手工方式:通过fiddler软件来查看,当用户在浏览器里输入请求的网址时,通过fiddler就可以查看用户的http的响应,具体的过程如下面2张图片所示,第一张图片是fiddler查看cookies的header,第二张图是拷贝该header:
第二种获取cookies的方式,可以第一次通过用户名和密码向url发出请求,然后将请求后的response中的headers的cookies保存下来,下次就可以根据cookies去登录该url并获取页面内容。
好,cookies介绍完毕,咱们回来,下面给出第一个demo(通过cookie登陆获取微博页面,并抓取微博用户信息):
#!/usr/bin/python
# -*-coding:utf-8 -*-
import httplib2
import urllib2
import re #正则表达式模块
class WeiboClass: #定义一个weibo类
#获取指定url的网页内容
def get_content(self,url,headers,id):
http=httplib2.Http()
response,content=http.request(url+str(id),'GET',headers=headers)
#print url+str(id)
return content.decode('unicode-escape').encode('utf-8')
#判断weibo的用户是否是企业用户
def is_company(self,url,headers,id):
content=self.get_content(url,headers,id)
title=r'行业'
company_title=re.compile(title)
if company_title.search(content): #使用正则表达式对title进行匹配
return 1
else:
return 0
#获取用户的weibo信息:ID,主页url,昵称
def get_info(self, url,headers,id):
flag=self.is_company(url,headers,id)
content=self.get_content(url,headers,id)
if flag==0: #如果用户是个人用户
#print content
#微博ID
id_flag=r'\$CONFIG\[\'oid\'\] = \'([0-9].+?)\';'
id_re=re.compile(id_flag)
id_regx=id_re.search(content)
id=id_regx.group(1)
print id
#微博url
url_flag=r'<meta http-equiv="mobile-agent" content="format=xhtml;" url="weibo.cn/(.+?)\?'
url_re=re.compile(url_flag)
url_regx=url_re.search(content)
url_0=url_regx.group(1)
url='http://weibo.com/'+url_0
print url
#昵称
name_flag='<div class="name clearfix">.+?<div class="left">(.+?)<'
name_re=re.compile(name_flag,re.S)
name_regx=name_re.search(content)
name=name_regx.group(1)
name=name.decode('utf-8').encode('GBK')
print name
def main():
headers={"cookie":'NSC_wjq_xfjcp.dpn_w3.6