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

