python通過鏈接抓取網(wǎng)站詳解
在本篇文章里,你將會學(xué)習(xí)把這些基本方法融合到一個(gè)更靈活的網(wǎng)站 爬蟲中,該爬蟲可以跟蹤任意遵循特定 URL 模式的鏈接。
這種爬蟲非常適用于從一個(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, 'h1', '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)模式。
以上就是關(guān)于python抓取網(wǎng)站的相關(guān)知識點(diǎn)內(nèi)容,感謝大家的學(xué)習(xí)和對腳本之家的支持。
相關(guān)文章
Python/MySQL實(shí)現(xiàn)Excel文件自動處理數(shù)據(jù)功能
在沒有服務(wù)器存儲數(shù)據(jù),只有excel文件的情況下,如何利用SQL和python實(shí)現(xiàn)數(shù)據(jù)分析和數(shù)據(jù)自動處理的功能?本文就來和大家聊聊解決辦法2023-02-02python繪制發(fā)散型柱狀圖+誤差陰影時(shí)間序列圖+雙坐標(biāo)系時(shí)間序列圖+繪制金字塔圖
這篇文章主要介紹了python繪制發(fā)散型柱狀圖+誤差陰影時(shí)間序列圖+雙坐標(biāo)系時(shí)間序列圖+繪制金字塔圖,詳細(xì)的內(nèi)容需要的小伙伴可以參考一下下面文章內(nèi)容2022-08-08R vs. Python 數(shù)據(jù)分析中誰與爭鋒?
R和Python兩者誰更適合數(shù)據(jù)分析領(lǐng)域?在某些特定情況下誰會更有優(yōu)勢?還是一個(gè)天生在各方面都比另一個(gè)更好?2017-10-10caffe的python接口生成配置文件學(xué)習(xí)
這篇文章主要介紹了caffe的python接口生成配置文件學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06Python Web框架Flask中使用新浪SAE云存儲實(shí)例
這篇文章主要介紹了Python Web框架Flask中使用新浪SAE云存儲實(shí)例,本文是對SAE云存儲的簡單封裝,需要的朋友可以參考下2015-02-02