1. 程式人生 > >python爬蟲筆記-持續更新

python爬蟲筆記-持續更新

爬蟲主要分為兩個部分,第一個是網頁介面的獲取,第二個是網頁介面的解析;爬蟲的原理是利用程式碼模擬瀏覽器訪問網站,與瀏覽器不同的是,爬蟲獲取到的是網頁的原始碼,沒有了瀏覽器的翻譯效果。


這裡我們使用urllib2進行網站頁面的獲取;首先匯入urllib2模組包
import urllib2 
呼叫urllib2中的urlopen方法連結網站,程式碼如下repr=urllib2.urlopen("XXXXXX"),XXXXXX代表的是網站名稱。 
repr = urllib2.urlopen("http://www.baidu.com")
得到網站的響應之後,然後就是將頁面的原始碼讀取出來,呼叫read方法
html=repr.read()
將自己想要的資料從html介面原始碼中解析出來,解析介面的模組包有很多,原始的re
import re
進行利用re進行搜尋,這裡我有使用正則表示式
url = re.search(r'<img hidefocus="true" src="(.*?)".*?',html).group(1)
列印除url
print url










url管理器:用來管理將要抓取的url和已經抓取過的
-防止重複抓取,防止迴圈抓取
-新增新的url到待爬取集合中,判斷待新增url是否在容器中
-判斷是否有待爬取url,獲取待爬取url,將url從待爬取移動到已爬取
--儲存1-記憶體中包含待爬取url集合set()和已爬取url集合set(),可自動去重
--儲存2-關係型資料庫中mysql中包含表urls(url,is_crawled)
--儲存3-快取資料庫中redis包含待爬取url集合set和已爬取的url集合set


網頁下載器:urllib2
--核心元件,將網際網路上url對應的網頁下載到本地的工具
--urllib2 為python官方基礎模組
--requests 為第三方包更強大
例項1:import urllib2  --匯入包
response = urllib2.urlopen("www.baidu.com")  --請求
print response.getcode() --獲取狀態碼,如果是200代表成功
response.read()




例項2:import urllib2  --匯入包
request = urllib2.Request(url)  --建立request物件
request.add_data('a',1)  --新增資料
request.add_header('User-Agent','Mozilla/5.0')--新增header,偽裝成mozilla瀏覽器
response = urllib2.urlopen(request)傳送請求獲取結果


特殊情景
1-需要登陸的網站則用 HTTPCookieProcessor
2-需要代理的網站則用 ProxyHandler 
3-需要https協議登陸網站則用HTTPSHandler
4-需要自動跳轉網站則用HTTPRedirectHandler
先呼叫opener = urllib2.build_opener(1/2/3/4)
urllib2.install_opener(opener)


import urllib2, cookielib
cj = cookielib.CookieJar() --建立cookie容器
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))--建立opener
urllib2.install_opener(opener) --安裝opener
response = urllib2.urlopen("http://www.baidu.com/")傳送請求獲取結果




網頁解析器:beautifulsoup
--從網頁中提取有價值資料的工具,包括資料和新的url
1-正則表示式  模糊匹配
2-官方 html.parser 結構化解析
3-第三方 BeautifulSoup  強大結構化解析,包括2/3/4 功能
4-第三方 lxml 結構化解析




beautifulsoup語法
建立beautifulsoup物件--》搜尋節點find_all,find--》訪問節點名稱,屬性,文字








爬蟲:一段自動抓取網際網路資訊的程式
從一個url出發,自動提取關聯url的程式


價值:網際網路資料,為我所用,分析爬取的資料
做成爆笑故事的app,對比圖書價格,新聞聚合閱讀器


爬蟲排程端--》url管理器--》網頁下載器--》網頁解析器--》價值資料








抓取百度百科  
目標地址  http://baike.baidu.com/item/Python


links = soup.find_all('a', href=re.compile(r"/item/(.*)"))








使用的python3.5,在window下,我在除錯的時候遇到裡編碼出錯的問題,找了很久,終於解決裡。這此分享出來,給可能遇到同樣問題的同學。 當把抓取出來的內容顯示在網頁上時,這個地方是出錯的關鍵點。在windows下面,新檔案的預設編碼是gbk,這樣的話,python直譯器會用gbk編碼去解析我們的網路資料流txt,然而txt此時已經是decode過的unicode編碼,這樣的話就會導致解析不了,出現問題。應寫為: fout = open('output.html','w',encoding='utf-8') 同時在html中宣告<meta charset='utf-8'>