国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

python通過(guò)鏈接抓取網(wǎng)站詳解

2020-02-15 21:29:53
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

在本篇文章里,你將會(huì)學(xué)習(xí)把這些基本方法融合到一個(gè)更靈活的網(wǎng)站 爬蟲(chóng)中,該爬蟲(chóng)可以跟蹤任意遵循特定 URL 模式的鏈接。

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

這些類(lèi)型的爬蟲(chóng)并不需要像上一節(jié)通過(guò)搜索頁(yè)面進(jìn)行抓取中采用的定位 鏈接的結(jié)構(gòu)化方法,因此在 Website 對(duì)象中不需要包含描述搜索頁(yè)面 的屬性。但是由于爬蟲(chóng)并不知道待尋找的鏈接的位置,所以你需要一些 規(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 = bodyTagclass Content:  def __init__(self, url, title, body):    self.url = url    self.title = title    self.body = bodydef print(self):    print("URL: {}".format(self.url))    print("TITLE: {}".format(self.title))    print("BODY:/n{}".format(self.body))

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

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

import reclass Crawler:  def __init__(self, site):    self.site = site    self.visited = []def getPage(self, url):    try:req = requests.get(url)    except requests.exceptions.RequestException:      return Nonereturn 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() forelem 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è)屬性。這樣做的作 用是將已訪(fǎng)問(wèn)過(guò)的頁(yè)面存儲(chǔ)在爬蟲(chóng)中,但是也意味著必須針對(duì)每個(gè)網(wǎng)站 實(shí)例化一個(gè)新的爬蟲(chóng),而不是重用一個(gè)爬蟲(chóng)去抓取網(wǎng)站列表。

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 北票市| 内江市| 德格县| 凤台县| 简阳市| 巍山| 交城县| 阿图什市| 香港| 新竹县| 泌阳县| 阳山县| 怀仁县| 舞钢市| 元谋县| 卓尼县| 潞城市| 嘉兴市| 洮南市| 田东县| 徐州市| 突泉县| 青川县| 锡林浩特市| 道真| 察隅县| 类乌齐县| 朝阳市| 崇州市| 肃北| 山西省| 六盘水市| 达拉特旗| 莱西市| 夏邑县| 肥东县| 伊通| 凤台县| 济阳县| 宝丰县| 兴国县|