python通過鏈接抓取網(wǎng)站的示例分析-創(chuàng)新互聯(lián)

這篇文章主要介紹了python通過鏈接抓取網(wǎng)站的示例分析,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

創(chuàng)新互聯(lián)建站主要從事網(wǎng)站建設(shè)、成都做網(wǎng)站、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)無極,十余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18980820575

這種爬蟲非常適用于從一個(gè)網(wǎng)站抓取所有數(shù)據(jù)的項(xiàng)目,而不適用于從特 定搜索結(jié)果或頁面列表抓取數(shù)據(jù)的項(xiàng)目。它還非常適用于網(wǎng)站頁面組織 得很糟糕或者非常分散的情況。

這些類型的爬蟲并不需要像上一節(jié)通過搜索頁面進(jìn)行抓取中采用的定位 鏈接的結(jié)構(gòu)化方法,因此在 Website 對象中不需要包含描述搜索頁面 的屬性。但是由于爬蟲并不知道待尋找的鏈接的位置,所以你需要一些 規(guī)則來告訴它選擇哪種頁面。你可以用 targetPattern(目標(biāo) URL 的 正則表達(dá)式)和布爾變量 absoluteUrl 來達(dá)成這一目標(biāo):

class Website:  
def __init__(self, name, url, targetPattern, absoluteUrl,    
titleTag, bodyTag):    
self.name = name    
self.url = url    
self.targetPattern = targetPattern    
self.absoluteUrl=absoluteUrl    
self.titleTag = titleTag    
self.bodyTag = bodyTag
class Content:  
def __init__(self, url, title, body):    
self.url = url    
self.title = title    
self.body = body
def print(self):    
print("URL: {}".format(self.url))    
print("TITLE: {}".format(self.title))    
print("BODY:\n{}".format(self.body))

Content 類和第一個(gè)爬蟲例子中使用的是一樣的。

Crawler 類從每個(gè)網(wǎng)站的主頁開始,定位內(nèi)鏈,并解析在每個(gè)內(nèi)鏈頁面 發(fā)現(xiàn)的內(nèi)容:

import re
class Crawler:  
def __init__(self, site):    
self.site = site    
self.visited = []
def getPage(self, url):    
try:
req = requests.get(url)    
except requests.exceptions.RequestException:      
return None
return BeautifulSoup(req.text, 'html.parser')
def safeGet(self, pageObj, selector):
selectedElems = pageObj.select(selector)
if selectedElems is not None and len(selectedElems) > 0:
return '\n'.join([elem.get_text() for
elem in selectedElems])
return ''
def parse(self, url):
bs = self.getPage(url)
if bs is not None:
title = self.safeGet(bs, self.site.titleTag)
body = self.safeGet(bs, self.site.bodyTag)
if title != '' and body != '':
content = Content(url, title, body)
content.print()
def crawl(self):
"""
獲取網(wǎng)站主頁的頁面鏈接
"""
bs = self.getPage(self.site.url)
targetPages = bs.findAll('a',
href=re.compile(self.site.targetPattern))
for targetPage in targetPages:
targetPage = targetPage.attrs['href']
if targetPage not in self.visited:
self.visited.append(targetPage)
if not self.site.absoluteUrl:
targetPage = '{}{}'.format(self.site.url, targetPage)
self.parse(targetPage)
reuters = Website('Reuters', 'https://www.reuters.com', '^(/article/)', False,
'h2', 'div.StandardArticleBody_body_1gnLA') 
crawler = Crawler(reuters) 
crawler.crawl()

與前面的例子相比,這里的另外一個(gè)變化是:Website 對象(在這個(gè)例 子中是變量 reuters)是 Crawler 對象本身的一個(gè)屬性。這樣做的作 用是將已訪問過的頁面存儲在爬蟲中,但是也意味著必須針對每個(gè)網(wǎng)站 實(shí)例化一個(gè)新的爬蟲,而不是重用一個(gè)爬蟲去抓取網(wǎng)站列表。

不管你是選擇一個(gè)與網(wǎng)站無關(guān)的爬蟲,還是將網(wǎng)站作為爬蟲的一個(gè)屬 性,這都是一個(gè)需要根據(jù)自身需求進(jìn)行權(quán)衡的決定。兩種方法在功能實(shí) 現(xiàn)上都是沒有問題的。

另外需要注意的是,這個(gè)爬蟲會從主頁開始抓取,但是在所有頁面都被 記錄后,就不會繼續(xù)抓取了。你可能希望編寫一個(gè)爬蟲,將第 3 章中介 紹的某種模式融合進(jìn)來,然后查看所訪問的每個(gè)頁面中更多的目標(biāo) URL。你甚至還可以跟蹤每個(gè)頁面中涉及的所有 URL(不僅僅是匹配 目標(biāo)模式的 URL),然后查看這些 URL 是否包含目標(biāo)模式。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“python通過鏈接抓取網(wǎng)站的示例分析”這篇文章對大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

分享名稱:python通過鏈接抓取網(wǎng)站的示例分析-創(chuàng)新互聯(lián)
URL地址:http://muchs.cn/article16/pdpdg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)網(wǎng)頁設(shè)計(jì)公司、網(wǎng)站排名、網(wǎng)站收錄面包屑導(dǎo)航、網(wǎng)站營銷

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司