python爬虫—基本使用整理

都说好记性不如烂笔头,这是真真实实的硬道理。反观自己,不论是在学校的时候还是现在工作,你会发现很多时候很多东西明明以前会,但是因为没有去记录,等再遇到不会了;很多问题以前碰到过,解决了,还是因为没有整理记录,最后遇到同样的问题时,也许还会记得,也许只能心里暗暗悔恨没有整理记录,但是不管那种,为了给自己省去不必要的麻烦,多多记录总是好的。

最近一直在爬虫,然而代码是“代码一般仿”,一份代码成功后,一直就copy,但是突然发现其实自己并没有去深入或者说简单的了解,所以简单的记录下也让自己重新了解下基本的知识。

用到的库:urllib2

urllib2提供一个基础函数urlopen,通过向指定的URL发出请求来获取数据。
原型:urllib2.urlopen(url[, data[, timeout[, cafile[, capath[, cadefault[, context]]]]])

案例1:基本的网页抓取
import urllib2
response=urllib2.urlopen('http://www.baidu.com')
html=response.read()
#重定向的url
print response.geturl()
#响应状态码
print response.code()
#print response.getcode()
#响应信息
print response.info()

HTTP是基于请求—响应模型的,即客户端提出请求,服务端提供响应。urllib2用一个Request对象来映射你提出的HTTP请求,在它最简单的使用形式中你将用你要请求的地址创建一个Request对象,并通过调用urlopen传入该Request对象,然后返回一个相关请求response对象,可以在Response中调用read()获取到的网页内容。

response=urllib2.urlopen("http://www.baidu.com"),实际上可以看作两个步骤:

import urllib2
#指定一个域名并发送请求 
request=urllib2.request('http://www.baidu.com')
#服务端响应来自客户端的请求 
response=urllib2.urlopen(request)
#获取网页内容
html=response.read()
案例2:动态网页抓取

现在大多数网站都是动态网页,需要动态地传递参数给它,然后做出对应的响应。因此,在访问时需要传递数据给它。最常见的情况如登录、注册。

数据传送分为POST和GET两种方式:GET方式是直接以链接形式访问,链接中包含了所有的参数

  • POST方式:
import urllib
import urllib2
values = {"username":"aaa","password":"1234"}
data = urllib.urlencode(values) 
url = "https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn"
request = urllib2.Request(url,data)
response = urllib2.urlopen(request)
html = response.read()
  • GET方式:
import urllib
import urllib2
values = {"username":"aaa","password":"1234"}
data = urllib.urlencode(values) 
#python2的编码:data = urllib.quote(values) 
url = "http://passport.csdn.net/account/login"
geturl = url + "?"+data
request = urllib2.Request(geturl)
response = urllib2.urlopen(request)
html = response.read()
案例3:添加Headers

有些网站不能直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,因此为了完全模拟浏览器的工作,需要设置一些Headers 的属性。

import urllib  
import urllib2  
url = 'http://xxx.xxx.com/xxx'
cookie_str=""
headers = {
        'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.9 Safari/537.36',
        #Referer是用来应付防盗链,服务器会识别headers中的referer是不是它自己,如果不是,有的服务器不会响应
        'Referer' : 'http://xxx.xxx.com/xxx/xxx.jsp?city=SZ',
        'Connection': 'keep-alive',
        'Cookie':cookie_str
    }
request = urllib2.Request(url, None, headers) 
#request = urllib2.Request(url) 
#也可这样添加header:request.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.9 Safari/537.36')
#或者request.addheaders = [('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.9 Safari/537.36'))
response = urllib2.urlopen(request)  
html = response.read()
案例4:获取Cookie

案例3中headers包含了cookie,有些场景下需要把cookie传入进去,因此需要获取cookie。

当获取一个URL使用的opener(一个urllib2.OpenerDirector的实例)是urlopen。它是一个特殊的opener,可以理解成opener的一个特殊实例,但是如果需要用到Cookie,只用这个opener是不能达到目的的,所以我们需要创建更一般的opener来实现对Cookie的设置。

基本流程:创建CookieJar对象→HTTPCookieProcessor对象来创建cookie处理器→构建opener→创建请求→读取数据(保存数据)

打印cookie信息:

import urllib2
import cookielib
#声明一个CookieJar对象实例来保存cookie
cookie = cookielib.CookieJar()
#cookie = cookielib.LWPCookieJar()
#利用urllib2库的HTTPCookieProcessor对象来创建cookie处理器
handler=urllib2.HTTPCookieProcessor(cookie)
#通过handler来构建opener
opener = urllib2.build_opener(handler)
#创建一个请求,原理同urllib2的urlopen,也可以传入request
response = opener.open('http://www.baidu.com')
for item in cookie:
    print 'Name = '+item.name
    print 'Value = '+item.value

保存cookie到文件:

import cookielib
import urllib2
#设置保存cookie的文件,比如保存在同级目录下的cookie.txt
filename = './cookie.txt'
#声明一个MozillaCookieJar对象实例来保存cookie,之后写入文件
cookie = cookielib.MozillaCookieJar(filename)
#利用urllib2库的HTTPCookieProcessor对象来创建cookie处理器
handler = urllib2.HTTPCookieProcessor(cookie)
#通过handler来构建opener
opener = urllib2.build_opener(handler)
#创建一个请求,原理同urllib2的urlopen
response = opener.open("http://www.baidu.com")
#保存cookie到文件
cookie.save(ignore_discard=True, ignore_expires=True)

使用urlopen创建请求

import cookielib
import urllib2
from urllib2 import urlopen, Request
cookieFile = "cookies.txt"
testURL = 'http://maps.google.com/'
#为cookie jar 创建实例
cJar = cookielib.LWPCookieJar()
#创建HTTPCookieProcessor的opener对象
opener = urllib2.build_opener( urllib2.HTTPCookieProcessor(cJar))
#安装HTTPCookieProcessor的opener
urllib2.install_opener(opener)
#创建一个Request对象
r = Request(testURL)
#打开HTML文件
h = urlopen(r)
print "页面的头部\n======================"
print h.info()
print "页面的Cookies\n======================"
for ind, cookie in enumerate(cJar):
  print "%d - %s" % (ind, cookie)
  #保存cookies
cJar.save(cookieFile)

从文件中读取cookie

import cookielib
import urllib2 
#创建MozillaCookieJar实例对象
cookie = cookielib.MozillaCookieJar()
#从文件中读取cookie内容到变量
cookie.load('cookie.txt', ignore_discard=True, ignore_expires=True)
#创建请求的request
req = urllib2.Request("http://www.baidu.com")
#利用urllib2的build_opener方法创建一个opener
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
response = opener.open(req)
print response.read()
参考:

https://docs.python.org/2/library/urllib2.html
http://python.jobbole.com/81334/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,711评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,079评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,194评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,089评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,197评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,306评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,338评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,119评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,541评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,846评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,014评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,694评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,322评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,026评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,257评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,863评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,895评论 2 351

推荐阅读更多精彩内容

  • 一、网络爬虫的定义 网络爬虫,即Web Spider,是一个很形象的名字。把互联网比喻成一个蜘蛛网,那么Spide...
    随风化作雨阅读 1,087评论 0 0
  • 一、概述 urllib2是Python的一个针对URLs的库。他以urlopen函数的形式提供了一个非常简单的...
    MiracleJQ阅读 1,485评论 0 5
  • Python学习网络爬虫主要分3个大的版块:抓取,分析,存储 另外,比较常用的爬虫框架Scrapy,这里最后也详细...
    楚江数据阅读 1,468评论 0 6
  • 用python也差不多一年多了,python应用最多的场景还是web快速开发、爬虫、自动化运维:写过简单网站、写过...
    蝴蝶兰玫瑰阅读 475评论 0 1
  • 2016年9月,结束了感情之后 开始用健身来完善自己。 2016年12月末,只身一人来到南方(贵阳)发展! 201...
    許小鑫阅读 224评论 0 1