python通過(guò)鏈接抓取網(wǎng)站詳解
在本篇文章里,你將會(huì)學(xué)習(xí)把這些基本方法融合到一個(gè)更靈活的網(wǎng)站 爬蟲中,該爬蟲可以跟蹤任意遵循特定 URL 模式的鏈接。
這種爬蟲非常適用于從一個(gè)網(wǎng)站抓取所有數(shù)據(jù)的項(xiàng)目,而不適用于從特 定搜索結(jié)果或頁(yè)面列表抓取數(shù)據(jù)的項(xiàng)目。它還非常適用于網(wǎng)站頁(yè)面組織 得很糟糕或者非常分散的情況。
這些類型的爬蟲并不需要像上一節(jié)通過(guò)搜索頁(yè)面進(jìn)行抓取中采用的定位 鏈接的結(jié)構(gòu)化方法,因此在 Website 對(duì)象中不需要包含描述搜索頁(yè)面 的屬性。但是由于爬蟲并不知道待尋找的鏈接的位置,所以你需要一些 規(guī)則來(lái)告訴它選擇哪種頁(yè)面。你可以用 targetPattern(目標(biāo) URL 的 正則表達(dá)式)和布爾變量 absoluteUrl 來(lái)達(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)站的主頁(yè)開始,定位內(nèi)鏈,并解析在每個(gè)內(nèi)鏈頁(yè)面 發(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)站主頁(yè)的頁(yè)面鏈接
"""
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 對(duì)象(在這個(gè)例 子中是變量 reuters)是 Crawler 對(duì)象本身的一個(gè)屬性。這樣做的作 用是將已訪問(wèn)過(guò)的頁(yè)面存儲(chǔ)在爬蟲中,但是也意味著必須針對(duì)每個(gè)網(wǎng)站 實(shí)例化一個(gè)新的爬蟲,而不是重用一個(gè)爬蟲去抓取網(wǎng)站列表。
不管你是選擇一個(gè)與網(wǎng)站無(wú)關(guān)的爬蟲,還是將網(wǎng)站作為爬蟲的一個(gè)屬 性,這都是一個(gè)需要根據(jù)自身需求進(jìn)行權(quán)衡的決定。兩種方法在功能實(shí) 現(xiàn)上都是沒有問(wèn)題的。
另外需要注意的是,這個(gè)爬蟲會(huì)從主頁(yè)開始抓取,但是在所有頁(yè)面都被 記錄后,就不會(huì)繼續(xù)抓取了。你可能希望編寫一個(gè)爬蟲,將第 3 章中介 紹的某種模式融合進(jìn)來(lái),然后查看所訪問(wèn)的每個(gè)頁(yè)面中更多的目標(biāo) URL。你甚至還可以跟蹤每個(gè)頁(yè)面中涉及的所有 URL(不僅僅是匹配 目標(biāo)模式的 URL),然后查看這些 URL 是否包含目標(biāo)模式。
以上就是關(guān)于python抓取網(wǎng)站的相關(guān)知識(shí)點(diǎn)內(nèi)容,感謝大家的學(xué)習(xí)和對(duì)腳本之家的支持。
相關(guān)文章
django2.2安裝錯(cuò)誤最全的解決方案(小結(jié))
這篇文章主要介紹了django2.2安裝錯(cuò)誤最全的解決方案(小結(jié)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
Python根據(jù)區(qū)號(hào)生成手機(jī)號(hào)碼的方法
這篇文章主要介紹了Python根據(jù)區(qū)號(hào)生成手機(jī)號(hào)碼的方法,涉及Python隨機(jī)數(shù)與字符串的相關(guān)操作技巧,需要的朋友可以參考下2015-07-07
Python序列對(duì)象與String類型內(nèi)置方法詳解
這篇文章主要介紹了Python序列對(duì)象與String類型內(nèi)置方法,結(jié)合實(shí)例形式分析了Python序列對(duì)象與String類型各種常見內(nèi)置方法相關(guān)使用技巧及操作注意事項(xiàng),需要的朋友可以參考下2019-10-10
Python NumPy實(shí)現(xiàn)數(shù)組搜索示例詳解
NumPy是一個(gè)開源的Python科學(xué)計(jì)算庫(kù),使用NumPy可以很自然地使用數(shù)組和矩陣,這篇文章主要介紹了使用NumPy實(shí)現(xiàn)數(shù)組搜索,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2023-05-05
Python數(shù)據(jù)分析之真實(shí)IP請(qǐng)求Pandas詳解
這篇文章主要給大家介紹了Python數(shù)據(jù)分析之真實(shí)IP請(qǐng)求Pandas,文中通過(guò)示例嗲嗎給大家介紹的很詳細(xì),相信對(duì)大家的學(xué)習(xí)或者理解具有一定的參考借鑒價(jià)值,有需要的朋友們可以參考借鑒,下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2016-11-11
Python利用Selenium實(shí)現(xiàn)自動(dòng)觀看學(xué)習(xí)通視頻
Selenium是一個(gè)用于Web應(yīng)用程序測(cè)試的工具。Selenium測(cè)試直接運(yùn)行在瀏覽器中,就像真正的用戶在操作一樣。本文主要介紹了利用Selenium實(shí)現(xiàn)自動(dòng)觀看學(xué)習(xí)通視頻,需要的同學(xué)可以參考一下2021-12-12

