-
爬蟲簡(jiǎn)介:
查看全部 -
爬蟲的調(diào)度端來啟動(dòng)爬蟲,停止爬蟲,或監(jiān)視爬蟲的運(yùn)行情況;
爬蟲程序有三個(gè)模塊:URL管理器、網(wǎng)頁下載器、網(wǎng)頁解析器
URL管理器用來管理已經(jīng)抓取過得URL和將要抓取的URL
查看全部 -
urllib2下載網(wǎng)頁方法1
查看全部 -
# -*- coding: gb2312 -*-
import urllibclass HtmlDownloader(object):
???
???
??? def download(self,url):
??????? if url is None:
??????????? return None
??????? response = urllib.request.urlopen(url)??? #請(qǐng)求這個(gè)URL的內(nèi)容結(jié)果存在respon'
??????? # 如果值不等于200則請(qǐng)求失敗
??????? if response.getcode() != 200:??
??????????? return
??????? return response.read()?? #返回下載好的內(nèi)容
???查看全部 -
class UrlManager(object):
???
??? def __init__(self):
??????? """URL管理器需要維護(hù)兩個(gè)列表,①待爬取的URL列表new_urls;②已爬取的URL列表old_urls"""
??????? self.new_urls = set()
??????? self.old_urls = set()
???
??? def add_new_url(self,url):
??????? """ 向管理器中添加一個(gè)新的URL,"""
??????? if url is None:???????????? #如果URL為空,不進(jìn)行添加
??????????? return
??????? if url not in self.new_urls and url not in self.old_urls:
??????????? self.new_urls.add(url)? #如果URL就沒在待爬取的URL列表里面,又沒在已爬取的URL列表里面,將其添加到待爬取的URL列表中
?????
??? def add_new_urls(self,urls):
??????? """ 向管理器中添加批量的URL"""
??????? if urls is None or len(urls)==0:
??????????? return????????????????? #如果URL列表不存在或?yàn)榭眨贿M(jìn)行添加
??????? for url in urls:
??????????? self.add_new_url(url)?? #如果存在,單個(gè)添加到待爬取的URL
????
??? def has_new_url(self):
??????? """判斷管理器中是否有新的URL"""
??????? return len(self.new_urls)!=0??????? #如果new_url列表部位空,就說明還有待爬取的URL,??? def get_new_url(self):
??????? """從URL管理器中獲取一個(gè)新的待爬取的URL"""
??????? new_url = self.new_urls.pop()?????? #獲取一個(gè)待爬取的URL,pop會(huì)講待爬取的URL取出,然后移除該URL
??????? self.old_urls.add(new_url)????????? #將這個(gè)待爬取的URL添加到已爬取的URL列表
??????? return new_url查看全部 -
from baike_spider import html_downloader, html_outputer, url_manager
from lxml.html import html_parser
from astropy.units import countclass SpiderMain(object):
??? """爬蟲總調(diào)度程序,會(huì)使用HTML的下載器,解析器,輸出器來完成功能"""
??? def __init__(self):
??????? """在構(gòu)造函數(shù)中初始化所需要的各個(gè)對(duì)象"""
??????? self.urls = url_manager.UrlManager()????????????????? #URL管理器
??????? self.downloader = html_downloader.HtmlDownloader()??? #URL下載器
??????? self.parser = html_parser.HtmlParser()??????????????? #URL解析器
??????? self.output = html_outputer.HtmlOutputer()??????????? #URL輸出器
???
??? def craw(self,root_url):
??????? """爬蟲的調(diào)度程序,root_url就是入口url,將其添加到URL管理器"""
??????? count = 1
??????? self.urls.add_new_url(root_url)??????????????????????????? #添加一個(gè)新的未爬取的URL
??????? while self.urls.has_new_url():
??????????? try:
??????????????? """設(shè)置一個(gè)異常處理,用來處理網(wǎng)頁中已經(jīng)失效的URL和空的URL"""
??????????????? new_url = self.urls.get_new_url()????????????????? #獲取一個(gè)待爬取的URL
??????????????? print("crow %d: %s"%(count,new_url))
??????????????? html_cont = self.downloader.download(new_url)????? #下載URL頁面
??????????????? new_urls, new_data =self.parser.parse(new_url,html_cont)???
??????????????? #調(diào)用解析器解析頁面數(shù)據(jù),得到新的URL列表和新的數(shù)據(jù),傳入兩個(gè)參數(shù),傳入該URL,和下載的數(shù)據(jù)
??????????????? self.urls.add_new_urls(new_urls)?????????????????? #新的URL列表補(bǔ)充到URLS
??????????????? self.output.collect_data(new_data)???????????????? #收集數(shù)據(jù)
???????????????
??????????????? if count == 100:
??????????????????? """設(shè)置一個(gè)循環(huán)控制URL的爬取個(gè)數(shù)"""
??????????????????? break
???????????????
??????????????? count? += 1
??????????? except:
??????????????? print("craw failed")
??????? self.outputer.output_html()if __name__ == '__main__':
??? root_url = "??? obj_spider = SpiderMain()????? #調(diào)用主函數(shù)
??? obj_spider.craw(root_url)????? #啟動(dòng)爬蟲查看全部 -
class UrlManeger(object):
??? def __init__(self):
??????? self.new_urls = set()
??????? self.old_urls = set()
???
??? def add_new_url(self,url):
??????? # 如果沒有URL就返回
??????? if url is None:
??????????? return
??????? # 如果URL既沒有在待爬取的URL又沒有在已爬取的URL,則添加到待爬取 的URL
??????? if url not in self.new_urls and url not in self.old_urls:
??????????? self.new_urls.add(url)
???
??? def add_new_urls(self,urls):
??????? # 如果urls不存在或列表為空,不進(jìn)行添加
??????? if urls is None or len(urls)==0:
??????????? return
??????? # 將urls列表總的URL逐個(gè)添加到new_urls
??????? for url in urls:
??????????? self.add_new_url(url)
???
??? def has_new_url(self):
??????? return len(self.new_urls) != 0
???
??? def get_new_url(self):
??????? # pop會(huì)從列表中獲取一個(gè)URL,并將其移除
??????? new_url = self.new_urls.pop()
??????? self.old_urls.add(new_url )查看全部 -
該下載器有以下三種下載方法:
①最簡(jiǎn)潔的方法:給定一個(gè)URL,將其傳送給urllib2的urlopen方法,就可以實(shí)現(xiàn)。對(duì)應(yīng)代碼如下:
?
?
②添加http header向服務(wù)器提交http的頭信息,添加data可以向服務(wù)器提交需要用戶輸入的數(shù)據(jù),
?
我們生成三個(gè)參數(shù),將其傳送給request類,生成一個(gè)request對(duì)象,再用urllib2的urlopen方法以request為參數(shù),發(fā)送網(wǎng)頁請(qǐng)求。
?
?
③添加特殊情景的處理器:
例:有的網(wǎng)頁需要用戶登錄才能訪問,我們就需要添加cookie的處理,我們使用HTTPCookieProcessor;有的網(wǎng)頁需要代理才能訪問,我們使用ProxyHandle;有的網(wǎng)頁的協(xié)議是HTTPS加密訪問的,我們使用HTTPSHandler;有的網(wǎng)頁的URL是相互自動(dòng)的跳轉(zhuǎn),我們使用HTTPRedirectHandler。
將這些handler傳送給urllib2的bulid_opener方法來創(chuàng)建對(duì)象,我們給urllib2再install這個(gè)opener,這樣這個(gè)urllib2就具有了處理這些場(chǎng)景的能力,然后依然并用urlopen方法來請(qǐng)求一個(gè)URL,或請(qǐng)求一個(gè)request實(shí)現(xiàn)網(wǎng)頁的下載。
查看全部 -
Python爬蟲URL管理器的實(shí)現(xiàn)方式(三種)
(一)將已爬取或和待爬取的URL集合存放在內(nèi)存中,用Python語言的話,可以將這兩個(gè)URL集合放在set()數(shù)據(jù)結(jié)構(gòu)中,Python的set結(jié)構(gòu)可以自動(dòng)去除重復(fù)的內(nèi)容,
(二)將URL存放在關(guān)系數(shù)據(jù)庫中,建立一個(gè)表,有兩個(gè)字段(url,is_crawled),is_crawled字段標(biāo)志這個(gè)URL的狀態(tài)是待爬取還是已爬取。
(三)將URL存放在一個(gè)緩存數(shù)據(jù)庫中,比如redis,本身支持set的結(jié)構(gòu),所以我們可以將待爬取的和已爬取的URL存放在set中。
查看全部 -
爬蟲URL管理
URL管理器用來管理已經(jīng)抓取過得URL集合和將要抓取的URL集合,主要是為了防止循環(huán)抓取和重復(fù)抓取,
URL管理器需要支持如下功能:
添加新URL到待爬取集合中;在添加的過程中判斷是否已經(jīng)存在該URL在管理器中;支持從容器中獲取一個(gè)待爬取的URL;獲取時(shí)需要判斷容器中是否還有待爬取的URL;該URL被爬取后,我們需要將其移動(dòng)到已爬取集合。
查看全部 -
首先,調(diào)度器詢問URL管理器有沒有待爬取的URL,URL管理器向調(diào)度器返回是或否,若為是,則調(diào)度器從URL管理器中獲取一個(gè)待爬URL,URL管理器將這個(gè)URL返回給調(diào)度器,,,然后調(diào)度器將這個(gè)URL傳送給下載器,讓下載器開始下載,下載完成后,下載器將URL內(nèi)容返回給調(diào)度器,,,然后調(diào)度器將URL內(nèi)容傳輸給解析器進(jìn)行解析,解析后,解析器返回有價(jià)值的數(shù)據(jù)和新URL列表給調(diào)度器,,,調(diào)度器將價(jià)值數(shù)據(jù)給應(yīng)用去收集價(jià)值數(shù)據(jù),將新的URL列表補(bǔ)充給URL管理器,直到URL全部爬取完畢。
查看全部 -
爬蟲的調(diào)度端來啟動(dòng)爬蟲,停止爬蟲,或監(jiān)視爬蟲的運(yùn)行情況;
爬蟲程序有三個(gè)模塊:URL管理器、網(wǎng)頁下載器、網(wǎng)頁解析器
URL管理器用來管理已經(jīng)抓取過得URL和將要抓取的URL,從中取出一個(gè)待爬取的URL將其傳送給網(wǎng)頁下載器,網(wǎng)頁下載器將指定網(wǎng)頁內(nèi)容下載為一個(gè)字符串,并將字符串傳送給網(wǎng)頁解析器進(jìn)行解析,會(huì)解析出有價(jià)值的數(shù)據(jù)和獲取該網(wǎng)頁中指向其他網(wǎng)頁的URL,將新獲取的URL補(bǔ)充到URL管理器中,
查看全部 -
(二)爬蟲簡(jiǎn)介
? 爬蟲是一段獲取自動(dòng)抓取互聯(lián)網(wǎng)頁面信息的程序,
互聯(lián)網(wǎng)的每個(gè)網(wǎng)頁上都有一個(gè)其對(duì)應(yīng)的URL,每個(gè)URL又會(huì)指向其他的URL,URL的指向關(guān)系是錯(cuò)綜復(fù)雜的,正常情況下我們用人工的方法去獲取信息,但是覆蓋面太??;
爬蟲可以根據(jù)關(guān)鍵詞從一個(gè)人為指定的URL出發(fā),提取到有關(guān)聯(lián)的網(wǎng)頁上的信息,并且提取數(shù)據(jù);
查看全部 -
(一)本課程僅介紹簡(jiǎn)單的靜態(tài)網(wǎng)頁爬蟲設(shè)計(jì)
URL管理器用來管理已經(jīng)抓取過得URL和將要抓取的URL;
網(wǎng)頁下載器:給定一個(gè)URL,需要將網(wǎng)頁下載在你到本地以后才能去分析,使用urllib2這個(gè)包;
網(wǎng)頁解析器:得到網(wǎng)頁之后用解析器提取出我們想要的內(nèi)容;
查看全部 -
(十五)實(shí)例爬蟲
確定目標(biāo)--->分析目標(biāo)(URL格式,數(shù)據(jù)格式,網(wǎng)頁編碼)--->編寫代碼
分析目標(biāo):制定抓取網(wǎng)站數(shù)據(jù)的策略;
URL格式:用來限定我們要抓取的頁面的范圍,如果范圍不進(jìn)行限定的話就會(huì)抓取去多不相關(guān)的網(wǎng)頁,造成資源浪費(fèi)。
數(shù)據(jù)格式:分析每個(gè)詞條頁面的標(biāo)題等,數(shù)據(jù)所在的標(biāo)簽的格式。
網(wǎng)頁編碼:在代碼解析器上指定網(wǎng)頁的編碼格式,然后才能進(jìn)行正確的解析。
詞條頁面URL不是一個(gè)完整的URL,所以需要在代碼中補(bǔ)全;
數(shù)據(jù)格式在<h1>標(biāo)簽中,
查看全部
舉報(bào)