久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

經(jīng)驗(yàn) | Python爬蟲(chóng)基礎(chǔ)

 書*金 2017-02-27

本文梳理了網(wǎng)頁(yè)解析,、抓包,、爬蟲(chóng)基本流程等基礎(chǔ)知識(shí)。全文約 6250 字,,讀完可能需要 9 分鐘,。 

作者:voidking 

原文:https://segmentfault.com/a/1190000008191015

前言

Python 非常適合用來(lái)開(kāi)發(fā)網(wǎng)頁(yè)爬蟲(chóng),理由如下:

1,、抓取網(wǎng)頁(yè)本身的接口

相比與其他靜態(tài)編程語(yǔ)言,,如 java , c#,, c ++,, python 抓取網(wǎng)頁(yè)文檔的接口更簡(jiǎn)潔;相比其他動(dòng)態(tài)腳本語(yǔ)言,,如 perl ,, shell ,, python 的 urllib 包提供了較為完整的訪問(wèn)網(wǎng)頁(yè)文檔的 API 。(當(dāng)然 ruby 也是很好的選擇)

此外,,抓取網(wǎng)頁(yè)有時(shí)候需要模擬瀏覽器的行為,,很多網(wǎng)站對(duì)于生硬的爬蟲(chóng)抓取都是封殺的。這是我們需要模擬 user agent的行為構(gòu)造合適的請(qǐng)求,,譬如模擬用戶登陸,、模擬session/cookie的存儲(chǔ)和設(shè)置。在python里都有非常優(yōu)秀的第三方包幫你搞定,,如Requests,,mechanize。

2,、網(wǎng)頁(yè)抓取后的處理

抓取的網(wǎng)頁(yè)通常需要處理,,比如過(guò)濾 html 標(biāo)簽,提取文本等,。 python 的 beautifulsoap 提供了簡(jiǎn)潔的文檔處理功能,,能用極短的代碼完成大部分文檔的處理。

其實(shí)以上功能很多語(yǔ)言和工具都能做,,但是用 python 能夠干得最快,,最干凈。

Life is short , you need python. 


PS :python 2. x 和 python 3. x 有很大不同,,本文只討論 python 3. x 的爬蟲(chóng)實(shí)現(xiàn)方法,。

爬蟲(chóng)架構(gòu)

架構(gòu)組成

URL 管理器:管理待爬取的 url 集合和已爬取的 url 集合,傳送待爬取的 url 給網(wǎng)頁(yè)下載器,。

網(wǎng)頁(yè)下載器( urllib ):爬取 url 對(duì)應(yīng)的網(wǎng)頁(yè),,存儲(chǔ)成字符串,傳送給網(wǎng)頁(yè)解析器,。

網(wǎng)頁(yè)解析器( BeautifulSoup ):解析出有價(jià)值的數(shù)據(jù),,存儲(chǔ)下來(lái),,同時(shí)補(bǔ)充 url 到 URL 管理器,。

運(yùn)行流程

URL 管理器

基本功能

  • 添加新的 url 到待爬取 url 集合中。

  • 判斷待添加的 url 是否在容器中(包括待爬取 url 集合和已爬取 url 集合),。

  • 獲取待爬取的 url ,。

  • 判斷是否有待爬取的 url 。

  • 將爬取完成的 url 從待爬取 url 集合移動(dòng)到已爬取 url 集合,。

存儲(chǔ)方式

1,、內(nèi)存( python 內(nèi)存) 待爬取 url 集合:set() 已爬取 url 集合:set()

2、關(guān)系數(shù)據(jù)庫(kù)( mysql ) urls( url , is_crawled)

3,、緩存( redis ) 待爬取 url 集合: set() 已爬取 url 集合: set()

大型互聯(lián)網(wǎng)公司,,由于緩存數(shù)據(jù)庫(kù)的高性能,,一般把 url 存儲(chǔ)在緩存數(shù)據(jù)庫(kù)中。小型公司,,一般把 url 存儲(chǔ)在內(nèi)存中,,如果想要永久存儲(chǔ),則存儲(chǔ)到關(guān)系數(shù)據(jù)庫(kù)中,。

網(wǎng)頁(yè)下載器( urllib )

將 url 對(duì)應(yīng)的網(wǎng)頁(yè)下載到本地,,存儲(chǔ)成一個(gè)文件或字符串。

基本方法

新建 baidu.py ,,內(nèi)容如下:

  1. import urllib.request

  2. response = urllib.request.urlopen('http://www.baidu.com')

  3. buff = response.read()

  4. html = buff.decode('utf8')

  5. print(html)

命令行中執(zhí)行 python baidu.py ,,則可以打印出獲取到的頁(yè)面。

構(gòu)造 Request

上面的代碼,,可以修改為:

  1. import urllib.request

  2. request = urllib.request.Request('http://www.baidu.com')

  3. response = urllib.request.urlopen(request)

  4. buff = response.read()

  5. html = buff.decode('utf8')

  6. print(html)

攜帶參數(shù)

新建 baidu 2. py ,,內(nèi)容如下:

  1. import urllib.request

  2. import urllib.parse

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

  4. values = {'name': 'voidking', 'language': 'Python'}

  5. data = urllib.parse.urlencode(values).encode(

  6.    encoding='utf-8', errors='ignore')

  7. headers = {

  8.    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0'}

  9. request = urllib.request.Request(

  10.    url=url, data=data, headers=headers, method='GET')

  11. response = urllib.request.urlopen(request)

  12. buff = response.read()

  13. html = buff.decode('utf8')

  14. print(html)

使用 Fiddler 監(jiān)聽(tīng)數(shù)據(jù)

我們想要查看一下,我們的請(qǐng)求是否真的攜帶了參數(shù),,所以需要使用 fiddler ,。 打開(kāi) fiddler 之后,卻意外發(fā)現(xiàn),,上面的代碼會(huì)報(bào)錯(cuò)504,,無(wú)論是 baidu.py 還是 baidu 2. py 。

雖然 python 有報(bào)錯(cuò),,但是在 fiddler 中,,我們可以看到請(qǐng)求信息,確實(shí)攜帶了參數(shù),。

經(jīng)過(guò)查找資料,,發(fā)現(xiàn)python以前版本的Request都不支持代理環(huán)境下訪問(wèn)https。但是,,最近的版本應(yīng)該支持了才對(duì),。那么,最簡(jiǎn)單的辦法,,就是換一個(gè)使用http協(xié)議的url來(lái)爬取,,比如,換成 http://www.csdn.net,。結(jié)果,,依然報(bào)錯(cuò),只不過(guò)變成了400錯(cuò)誤,。

然而,,然而,然而。,。,。神轉(zhuǎn)折出現(xiàn)了!??!

當(dāng)我把url換成 http://www.csdn.net/后,請(qǐng)求成功,!沒(méi)錯(cuò),,就是在網(wǎng)址后面多加了一個(gè)斜杠 /。同理,,把 http://www.baidu.com改成 http://www.baidu.com/,,請(qǐng)求也成功了!神奇?。,。?/p>

添加處理器

  1. import urllib.request

  2. import http.cookiejar

  3. # 創(chuàng)建cookie容器

  4. cj = http.cookiejar.CookieJar()

  5. # 創(chuàng)建opener

  6. opener = urllib.request.build_opener(

  7.    urllib.request.HTTPCookieProcessor(cj))

  8. # 給urllib.request安裝opener

  9. urllib.request.install_opener(opener)

  10. # 請(qǐng)求

  11. request = urllib.request.Request('http://www.baidu.com/')

  12. response = urllib.request.urlopen(request)

  13. buff = response.read()

  14. html = buff.decode('utf8')

  15. print(html)

  16. print(cj)

網(wǎng)頁(yè)解析器( BeautifulSoup )

從網(wǎng)頁(yè)中提取出有價(jià)值的數(shù)據(jù)和新的 url 列表,。

解析器選擇

為了實(shí)現(xiàn)解析器,,可以選擇使用正則表達(dá)式、 html.parser ,、 BeautifulSoup ,、 lxml 等,這里我們選擇 BeautifulSoup ,。

其中,,正則表達(dá)式基于模糊匹配,而另外三種則是基于 DOM 結(jié)構(gòu)化解析,。

BeautifulSoup

安裝測(cè)試

1,、安裝,在命令行下執(zhí)行 pip install beautifulsoup4 ,。 2,、測(cè)試

  1. import bs4

  2. print(bs4)

使用說(shuō)明

基本用法

1、創(chuàng)建 BeautifulSoup 對(duì)象

  1. import bs4

  2. from bs4 import BeautifulSoup

  3. # 根據(jù)html網(wǎng)頁(yè)字符串創(chuàng)建BeautifulSoup對(duì)象

  4. html_doc = '''

  5. The Dormouse's story

  6. The Dormouse's story

  7. Once upon a time there were three little sisters; and their names were

  8. Elsie,

  9. Lacie and

  10. Tillie;

  11. and they lived at the bottom of a well.

  12. ...

  13. '''

  14. soup = BeautifulSoup(html_doc)

  15. print(soup.prettify())

2,、訪問(wèn)節(jié)點(diǎn)

  1. print(soup.title)

  2. print(soup.title.name)

  3. print(soup.title.string)

  4. print(soup.title.parent.name)

  5. print(soup.p)

  6. print(soup.p['class'])

3,、指定 tag 、 class 或 id

  1. print(soup.find_all('a'))

  2. print(soup.find('a'))

  3. print(soup.find(class_='title'))

  4. print(soup.find(id='link3'))

  5. print(soup.find('p', class_='title'))

4,、從文檔中找到所有 < a=""> 標(biāo)簽的鏈接

  1. for link in soup.find_all('a'):

  2.    print(link.get('href'))

出現(xiàn)了警告,,根據(jù)提示,我們?cè)趧?chuàng)建 BeautifulSoup 對(duì)象時(shí),,指定解析器即可。

  1. soup = BeautifulSoup(html_doc, 'html.parser')

5、從文檔中獲取所有文字內(nèi)容

  1. print(soup.get_text())

6,、正則匹配

  1. link_node = soup.find('a', href=re.compile(r'til'))

  2. print(link_node)

后記

python 爬蟲(chóng)基礎(chǔ)知識(shí),,至此足夠,接下來(lái),,在實(shí)戰(zhàn)中學(xué)習(xí)更高級(jí)的知識(shí),。


題圖:pexels,CC0 授權(quán),。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多