网络爬虫

使用第三方模块快速抓取与解析:

https://jecvay.com/2015/02/python3-web-bug-series5.html

1.Python 3开发网络爬虫(一)

1.1 抓取指定页面

•#encoding:UTF-8

•importurllib.request

•url ="http://www.baidu.com"

•data= urllib.request.urlopen(url).read()

•data= data.decode('UTF-8')

•print(data)

•解析:urlopen()函数,这个函数返回一个http.client.HTTPResponse对象:

•urllib.request.urlopen(url,

data=None, [timeout, ]*,cafile=None,capath=None,cadefault=False)

[if ppt]•[endif]

•>>>a = urllib.request.urlopen(full_url)>>> type(a)

'http.client.HTTPResponse'>

•>>>a.geturl() # 'http://www.baidu.com/s?word=Jecvay'

•>>>a.info() #

•>>>a.getcode()  # 200


1.2 简单处理URL

•importurllib

•importurllib.request

•data={}

•data['word']='JecvayNotes'

•url_values=urllib.parse.urlencode(data)

•url="http://www.baidu.com/s?"

•full_url=url+url_values

•data=urllib.request.urlopen(full_url).read()

•data=data.decode('UTF-8')

•print(data)

•解析:字典data转换为'word=Jecvay+Notes'的字符串

urllib.parse.urlencode(query,

doseq=False, safe='', encoding=None, errors=None)

urllib.parse.quote_plus(string,

safe='', encoding=None, errors=None)


2. https://jecvay.com/2014/09/python3-web-bug-series2.html


3.https://jecvay.com/2014/09/python3-web-bug-series3.html

3.1添加超时跳过功能

首先, 我简单地将

urlop = urllib.request.urlopen(url)

改为

urlop = urllib.request.urlopen(url, timeout = 2)

运行后发现, 当发生超时, 程序因为exception中断. 于是我把这一句也放在try .. except 结构里, 问题解决.

3.2 支持自动跳转

在爬 http://baidu.com 的时候, 爬回来一个没有什么内容的东西, 这个东西告诉我们应该跳转到 http://www.baidu.com . 但是我们的爬虫并不支持自动跳转, 现在我们来加上这个功能, 让爬虫在爬 baidu.com 的时候能够抓取 www.baidu.com 的内容.

首先我们要知道爬 http://baidu.com 的时候他返回的页面是怎么样的, 这个我们既可以用 Fiddler 看, 也可以写一个小爬虫来抓取. 这里我抓到的内容如下, 你也应该尝试一下写几行 python 来抓一抓.

3.3伪装浏览器

HTTP 报文分两种:请求报文响应报文

请求报文的请求行首部行

GET,POST, HEAD, PUT, DELETE 方法

我用 IE 浏览器访问百度首页的时候, 浏览器发出去的请求报文如下:

GET http://www.baidu.com/ HTTP/1.1

Accept: text/html, application/xhtml+xml, */*

Accept-Language: en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3

User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko

Accept-Encoding: gzip, deflate

Host: www.baidu.com

DNT: 1

Connection: Keep-Alive

Cookie: BAIDUID=57F4D171573A6B88A68789EF5DDFE87:FG=1; uc_login_unique=ccba6e8d978872d57c7654130e714abd; BD_UPN=11263145; BD

然后百度收到这个消息后, 返回给我的的响应报文如下(有删节):

HTTP/1.1 200 OK

Date: Mon, 29 Sep 2014 13:07:01 GMT

Content-Type: text/html; charset=utf-8

Connection: Keep-Alive

Vary: Accept-Encoding

Cache-Control: private

Cxy_all: baidu+8b13ba5a7289a37fb380e0324ad688e7

Expires: Mon, 29 Sep 2014 13:06:21 GMT

X-Powered-By: HPHP

Server: BWS/1.1

BDPAGETYPE: 1

BDQID: 0x8d15bb610001fe79

BDUSERID: 0

Set-Cookie: BDSVRTM=0; path=/

Set-Cookie: BD_HOME=0; path=/

Content-Length: 80137

百度一下,你就知道 ..........这里省略两万字................ 在 GET 的时候添加 header 有很多方法, 下面介绍两种方法.

第一种方法比较简便直接, 但是不好扩展功能, 代码如下:

import urllib.request

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

req=urllib.request.Request(url,headers={

'Connection':'Keep-Alive',

'Accept':'text/html, application/xhtml+xml, */*',

'Accept-Language':'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3',

'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko'

})

oper=urllib.request.urlopen(req)

data=oper.read()

print(data.decode())

第二种方法使用了 build_opener 这个方法, 用来自定义 opener, 这种方法的好处是可以方便的拓展功能, 例如下面的代码就拓展了自动处理 Cookies 的功能.

import urllib.request

import http.cookiejar

# head: dict of header

defmakeMyOpener(head={

'Connection':'Keep-Alive',

'Accept':'text/html, application/xhtml+xml, */*',

'Accept-Language':'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3',

'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko'

}):

cj=http.cookiejar.CookieJar()

opener=urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))

header=[]

forkey,valueinhead.items():

elem=(key,value)

header.append(elem)

opener.addheaders=header

returnopener

oper=makeMyOpener()

uop=oper.open('http://www.baidu.com/',timeout=1000)

data=uop.read()

print(data.decode())

上述代码运行后通过 Fiddler 抓到的 GET 报文如下所示:

GET http://www.baidu.com/ HTTP/1.1

Accept-Encoding: identity

Connection: close

Host: www.baidu.com

User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko

Accept: text/html, application/xhtml+xml, */*

Accept-Language: en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3

3.4保存抓回来的报文

顺便说说文件操作. Python 的文件操作还是相当方便的. 我们可以讲抓回来的数据 data 以二进制形式保存, 也可以经过 decode() 处理成为字符串后以文本形式保存. 改动一下打开文件的方式就能用不同的姿势保存文件了. 下面是参考代码:

defsaveFile(data):

save_path='D:\temp.out'

f_obj=open(save_path,'wb')# wb 表示打开方式

f_obj.write(data)

f_obj.close()

# 这里省略爬虫代码

# ...

# 爬到的数据放到 dat 变量里

# 将 dat 变量保存到 D 盘下

saveFile(dat)


4.https://jecvay.com/2014/10/python3-web-bug-series4.html#more-372


5.使用第三方模块快速抓取与解析

https://jecvay.com/2015/02/python3-web-bug-series5.html

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