創(chuàng)新互聯(lián)www.cdcxhl.cn八線動(dòng)態(tài)BGP香港云服務(wù)器提供商,新人活動(dòng)買多久送多久,劃算不套路!
創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供資興網(wǎng)站建設(shè)、資興做網(wǎng)站、資興網(wǎng)站設(shè)計(jì)、資興網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、資興企業(yè)網(wǎng)站模板建站服務(wù),10多年資興做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。這篇文章主要介紹Python異步新聞爬蟲之網(wǎng)絡(luò)請(qǐng)求函數(shù)的優(yōu)化案例,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
前面我們實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的再也不能簡(jiǎn)單的新聞爬蟲,這個(gè)爬蟲有很多槽點(diǎn),估計(jì)大家也會(huì)鄙視這個(gè)爬蟲。上一節(jié)最后我們討論了這些槽點(diǎn),現(xiàn)在我們就來(lái)去除這些槽點(diǎn)來(lái)完善我們的新聞爬蟲。
問(wèn)題我們前面已經(jīng)描述清楚,解決的方法也有了,那就廢話不多講,代碼立刻上(Talk is cheap, show me the code!)。
downloader 的實(shí)現(xiàn)
import requests import cchardet import traceback def downloader(url, timeout=10, headers=None, debug=False, binary=False): _headers = { 'User-Agent': ('Mozilla/5.0 (compatible; MSIE 9.0; ' 'Windows NT 6.1; Win64; x64; Trident/5.0)'), } redirected_url = url if headers: _headers = headers try: r = requests.get(url, headers=_headers, timeout=timeout) if binary: html = r.content else: encoding = cchardet.detect(r.content)['encoding'] html = r.content.decode(encoding) status = r.status_code redirected_url = r.url except: if debug: traceback.print_exc() msg = 'failed download: {}'.format(url) print(msg) if binary: html = b'' else: html = '' status = 0 return status, html, redirected_url if __name__ == '__main__': url = 'http://news.baidu.com/' s, html,lost_url_found_by_大大派 = downloader(url) print(s, len(html),lost_url_found_by_大大派)
這個(gè)downloader()函數(shù),內(nèi)置了默認(rèn)的User-Agent模擬成一個(gè)IE9瀏覽器,同時(shí)接受調(diào)用者自定義的headers和timeout。使用cchardet來(lái)處理編碼問(wèn)題,返回?cái)?shù)據(jù)包括:
狀態(tài)碼:如果出現(xiàn)異常,設(shè)置為0
內(nèi)容: 默認(rèn)返回str內(nèi)容。但是URL鏈接的是圖片等二進(jìn)制內(nèi)容時(shí),注意調(diào)用時(shí)要設(shè)binary=True
重定向URL: 有些URL會(huì)被重定向,最終頁(yè)面的url包含在響應(yīng)對(duì)象里面
新聞URL的清洗
我們先看看這兩個(gè)新聞網(wǎng)址:
http://xinwen.eastday.com/a/n181106070849091.html?qid=news.baidu.com http://news.ifeng.com/a/20181106/60146589_0.shtml?_zbs_baidu_news
上面兩個(gè)帶?的網(wǎng)站來(lái)自百度新聞的首頁(yè),這個(gè)問(wèn)號(hào)?的作用就是告訴目標(biāo)服務(wù)器,這個(gè)網(wǎng)址是從百度新聞鏈接過(guò)來(lái)的,是百度帶過(guò)來(lái)的流量。但是它們的表示方式不完全一樣,一個(gè)是qid=news.baidu.com, 一個(gè)是_zbs_baidu_news。這有可能是目標(biāo)服務(wù)器要求的格式不同導(dǎo)致的,這個(gè)在目標(biāo)服務(wù)器的后臺(tái)的瀏覽統(tǒng)計(jì)程序中可能用得到。
然后去掉問(wèn)號(hào)?及其后面的字符,發(fā)現(xiàn)它們和不去掉指向的是相同的新聞網(wǎng)頁(yè)。
從字符串對(duì)比上看,有問(wèn)號(hào)和沒(méi)問(wèn)號(hào)是兩個(gè)不同的網(wǎng)址,但是它們又指向完全相同的新聞網(wǎng)頁(yè),說(shuō)明問(wèn)號(hào)后面的參數(shù)對(duì)響應(yīng)內(nèi)容沒(méi)有任何影響。
正在抓取新聞的大量實(shí)踐后,我們發(fā)現(xiàn)了這樣的規(guī)律:
新聞?lì)惥W(wǎng)址都做了大量SEO,它們把新聞網(wǎng)址都靜態(tài)化了,基本上都是以.html, .htm, .shtml等結(jié)尾,后面再加任何請(qǐng)求參數(shù)都無(wú)濟(jì)于事。
但是,還是會(huì)有些新聞網(wǎng)站以參數(shù)id的形式動(dòng)態(tài)獲取新聞網(wǎng)頁(yè)。
那么我們抓取新聞時(shí),就要利用這個(gè)規(guī)律,防止重復(fù)抓取。由此,我們實(shí)現(xiàn)一個(gè)清洗網(wǎng)址的函數(shù)。
g_bin_postfix = set([ 'exe', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'pdf', 'jpg', 'png', 'bmp', 'jpeg', 'gif', 'zip', 'rar', 'tar', 'bz2', '7z', 'gz', 'flv', 'mp4', 'avi', 'wmv', 'mkv', 'apk', ]) g_news_postfix = [ '.html?', '.htm?', '.shtml?', '.shtm?', ] def clean_url(url): # 1. 是否為合法的http url if not url.startswith('http'): return '' # 2. 去掉靜態(tài)化url后面的參數(shù) for np in g_news_postfix: p = url.find(np) if p > -1: p = url.find('?') url = url[:p] return url # 3. 不下載二進(jìn)制類內(nèi)容的鏈接 up = urlparse.urlparse(url) path = up.path if not path: path = '/' postfix = path.split('.')[-1].lower() if postfix in g_bin_postfix: return '' # 4. 去掉標(biāo)識(shí)流量來(lái)源的參數(shù) # badquery = ['spm', 'utm_source', 'utm_source', 'utm_medium', 'utm_campaign'] good_queries = [] for query in up.query.split('&'): qv = query.split('=') if qv[0].startswith('spm') or qv[0].startswith('utm_'): continue if len(qv) == 1: continue good_queries.append(query) query = '&'.join(good_queries) url = urlparse.urlunparse(( up.scheme, up.netloc, path, up.params, query, '' # crawler do not care fragment )) return url
清洗url的方法都在代碼的注釋里面了,這里面包含了兩類操作:
判斷是否合法url,非法的直接返回空字符串
去掉不必要的參數(shù),去掉靜態(tài)化url的參數(shù)
網(wǎng)絡(luò)爬蟲知識(shí)點(diǎn)
1. URL清洗
網(wǎng)絡(luò)請(qǐng)求開始之前,先把url清洗一遍,可以避免重復(fù)下載、無(wú)效下載(二進(jìn)制內(nèi)容),節(jié)省服務(wù)器和網(wǎng)絡(luò)開銷。
2. cchardet 模塊
該模塊是chardet的升級(jí)版,功能和chardet完全一樣,用來(lái)檢測(cè)一個(gè)字符串的編碼。由于是用C和C++實(shí)現(xiàn)的,所以它的速度非常快,非常適合在爬蟲中用來(lái)判斷網(wǎng)頁(yè)的編碼。
切記,不要相信requests返回的encoding,自己判斷一下更放心。上一節(jié),我們已經(jīng)列舉了一個(gè)例子來(lái)證明requests對(duì)編碼識(shí)別的錯(cuò)誤,如果忘了的話,可以再去回顧一下。
3. traceback 模塊
我們寫的爬蟲在運(yùn)行過(guò)程中,會(huì)出現(xiàn)各種異常,而且有些異常是不可預(yù)期的,也不知道它會(huì)出現(xiàn)在什么地方,我們就需要用try來(lái)捕獲異常讓程序不中斷,但是我們又需要看看捕獲的異常是什么內(nèi)容,由此來(lái)改善我們的爬蟲。這個(gè)時(shí)候,就需要traceback模塊。
比如在downloader()函數(shù)里面我們用try捕獲了get()的異常,但是,異常也有可能是cchardet.detect()引起的,用traceback.print_exc()來(lái)輸出異常,有助于我們發(fā)現(xiàn)更多問(wèn)題。
以上是Python異步新聞爬蟲之網(wǎng)絡(luò)請(qǐng)求函數(shù)的優(yōu)化案例的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道!
分享標(biāo)題:Python異步新聞爬蟲之網(wǎng)絡(luò)請(qǐng)求函數(shù)的優(yōu)化案例-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)鏈接:http://vcdvsql.cn/article38/dshjsp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、網(wǎng)站導(dǎo)航、網(wǎng)站收錄、品牌網(wǎng)站建設(shè)、全網(wǎng)營(yíng)銷推廣、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容