Python开发爬虫之理论篇
爬蟲簡介
?爬蟲:一段自動抓取互聯網信息的程序。
什么意思呢?
互聯網是由各種各樣的網頁組成。每一個網頁對應一個URL,而URL的頁面上又有很多指向其他頁面的URL。這種URL之間相互的指向關系就形成了一個網絡,這就是互聯網。
正常情況下就是我們采用人工點擊的方式,去獲取互聯網上指定的信息,這種方式的特點是覆蓋面小。
那有沒有可能有一種方式,是當我們設定了一個互聯網上感興趣的目標,然后自動地從互聯網上去獲取我們所需要的數據呢?
有,這就是爬蟲。它可以從一個URL出發訪問該URL所關聯的所有URL,并且從每個頁面上提取出我們所需要的價值數據。
也就是說,爬蟲就是自動訪問互聯網,并且提取數據的程序。
?
爬蟲技術的價值
?互聯網數據,為我所用。
?
Python簡單爬蟲架構
1)首先,我們需要一個爬蟲調度端。爬蟲調度端的作用:啟動爬蟲,停止爬蟲,監視爬蟲運行情況。
2)在爬蟲程序中有三個模塊:URL管理器、網頁下載器、網頁解析器。
3)URL管理器:對將要爬取的和已經爬取過的URL進行管理;可取出待爬取的URL,將其傳送給“網頁下載器”。
4)網頁下載器:將URL指定的網頁下載,存儲成一個字符串,在傳送給“網頁解析器”。
5)網頁解析器:解析網頁可解析出
?、儆袃r值的數據
?、诹硪环矫?#xff0c;每個網頁都包含有指向其他網頁的URL,解析出來后可補充進“URL管理器”
此時,這三個模塊就形成了一個循環,只要有感興趣的URL,這三個模塊就會一直循環下去。
?
?Python簡單爬蟲架構的動態運行流程(以時序圖的方式展示)
?
?
?Python爬蟲URL管理
?URL管理器:管理待抓取URL集合和已抓取URL集合。
目的:防止重復抓取、防止循環抓取。
?
Python爬蟲URL管理器的實現方式
?Python爬蟲URL管理器的實現方式具體有三種:
1)使用內存,在Python中主要使用set集合(方便去除重復的元素)
2)使用關系數據庫,使用兩個字段:url和is_crawled(用來標記是否被爬取)
3)使用緩存數據庫,同樣使用set集合
其中,大型公司一般選擇高性能的緩存數據庫。個人,小公司一般使用內存。若是想永久存儲,常使用關系數據庫。
?
Python爬蟲網頁下載器簡介
網頁下載器:一個工具,通過URL將互聯網上對應的的網頁以HTML的形式下載到本地存儲成本地文件或內存字符串,后進行后續處理;
Python有哪幾種網頁下載器:urllib2(Python官方模塊,基礎模塊)、requests(第三方模塊,功能強大)。
?
Python爬蟲urlib2下載器網頁的三種方法
?1)urllib2下載網頁方法1:最簡潔方法
將url直接傳給urllib2的urlopen()方法。
對應代碼:
?
2)urllib2下載網頁方法2:除url外,添加data、http header。
進行增強處理。
其中,data向服務器提交需要用戶輸入的數據。
http header用來向服務器提交http的頭信息。
對應代碼:
代碼中request.add_data('a','1') #添加的數據類型為鍵值對,即a=1。
request.add_header() #可以對url請求進行偽裝
?
3)urllib2下載網頁方法3:添加特殊情景的處理器
更大更強的功能處理能力。
對應代碼(舉例:增強cookie的處理)
?
Python爬蟲urlib2實例代碼演示
import urllib2, cookielib
url ="http://www.baidu.com"
print '第一種方法' respones1 = urllib2.urlopen(url) print respones1.getcode() print len(respones1.read())
print "第二種方法" request = urllib2.Request(url) request.add_header("user-agent","Mozillla/5.0") respones2 = urllib2.urlopen(request) print respones2.getcode() print len(respones2.read())print '第三種方法' cj =cookielib.CookieJar() opener = urllib2.bulid_opener(urllib2.HTTPCookieProcessor(cj)) urllib2.install_opener(opener) print respones3.getcode() print cj print respones3.read()
?
Python爬蟲網頁解析器簡介
?
網頁解析器:從網頁中提取有價值數據的工具。
功能:
1)提取出新的待爬取URL列表;
2)解析出有價值的數據:
網頁解析器會以下載好的html網頁字符串作為輸入,提取出有價值的數據以及新的待爬取的URL列表。
Python有哪些網頁解析器呢?
1)正則表達式。最直觀的一種。將網頁文檔down成一個字符串,采用模糊匹配的方式進行提取有價值的數據。雖然直觀,但是當網頁文檔十分復雜的時候,這種方式將十分復雜。
2)使用Python自帶的html.parser模塊進行解析。
3)使用Beautiful Soup這個第三方插件來解析網頁。功能強大的Beautiful Soup可以用html.parser或者lxml作為它的解析器。
4)使用lxml這個第三方插件來解析html網頁或者xml文檔。
結構化解析——DOM(DOcument Object Model)樹
?
BeautifulSoup第三方模塊
BeautifulSoup官網:https://www.crummy.com/software/BeautifulSoup/
安裝BeautifulSoup:
如果你安裝了pip,那么就簡單了,無需從官網下載,打開命令提示符頁面。
進入到Python安裝目錄下的Scripts文件夾路徑下,輸入“pip install beautifulsoup4”,即可進行自動安裝。
安裝完,在eclipse中進行測試,新建一個Python模塊,輸入:
import bs4 print bs4輸出為:
證明安裝成功。
?
BeautifulSoup的語法
?
其中搜索節點的find_all()方法可以搜索出所有符合要求的節點,而find()方法則只是搜索出符合條件的第一個節點。但是兩個函數的參數是完全相同的。
對應代碼:
1)創建BeautifulSoup對象
2)搜索節點(find_all、find)
其中紅色部分為正則表達式形式。
最后一句之所以"class_"要加上下劃線是因為要和Python的關鍵字"class"進行區分。
3)訪問節點信息
4)BeautifulSoup的實例測試
# coding:utf-8 from bs4 import BeautifulSoup import re print("Python3 的代碼如下") html_doc = """ 因字數限制,省略。請到 http://www.crummy.com/software/BeautifulSoup/bs4/doc/#searching-the-tree 復制吧 """soup = BeautifulSoup(html_doc, 'html.parser') print("獲取所有的鏈接") links = soup.find_all('a') for link in links:print(link.name, link['href'], link.get_text())print("獲取lacie的鏈接") link_node = soup.find('a', href="http://example.com/lacie") print(link_node.name, link_node['href'], link_node.get_text()) print("正則匹配") link_node = soup.find('a', href=re.compile(r"ill")) print(link_node.name, link_node['href'], link_node.get_text())print("獲取p段落文字") p_node = soup.find('p', class_="title") print(p_node.name, p_node.get_text())?
實戰演練:爬取百度百科1000個頁面的數據
1)?實例爬蟲操作步驟
2)Python爬蟲實例-分析目標
?
?
?
?
?
?
?本篇博客參考慕課網課程:https://www.imooc.com/video/10683
?
轉載于:https://www.cnblogs.com/dudududu/p/8780442.html
總結
以上是生活随笔為你收集整理的Python开发爬虫之理论篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql sql left right
- 下一篇: 要考试了四年级下册如何四天内速学英语