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

首頁 > 編程 > Python > 正文

Python爬蟲包 BeautifulSoup 遞歸抓取實例詳解

2020-02-23 04:19:22
字體:
來源:轉載
供稿:網友

Python爬蟲包 BeautifulSoup  遞歸抓取實例詳解

概要:

爬蟲的主要目的就是為了沿著網絡抓取需要的內容。它們的本質是一種遞歸的過程。它們首先需要獲得網頁的內容,然后分析頁面內容并找到另一個URL,然后獲得這個URL的頁面內容,不斷重復這一個過程。

讓我們以維基百科為一個例子。

我們想要將維基百科中凱文·貝肯詞條里所有指向別的詞條的鏈接提取出來。

# -*- coding: utf-8 -*-# @Author: HaonanWu# @Date:  2016-12-25 10:35:00# @Last Modified by:  HaonanWu# @Last Modified time: 2016-12-25 10:52:26from urllib2 import urlopenfrom bs4 import BeautifulSouphtml = urlopen('http://en.wikipedia.org/wiki/Kevin_Bacon')bsObj = BeautifulSoup(html, "html.parser")for link in bsObj.findAll("a"):  if 'href' in link.attrs:    print link.attrs['href']

上面這個代碼能夠將頁面上的所有超鏈接都提取出來。

/wiki/Wikipedia:Protection_policy#semi#mw-head#p-search/wiki/Kevin_Bacon_(disambiguation)/wiki/File:Kevin_Bacon_SDCC_2014.jpg/wiki/San_Diego_Comic-Con/wiki/Philadelphia/wiki/Pennsylvania/wiki/Kyra_Sedgwick

首先,提取出來的URL可能會有一些重復的

其次,有一些URL是我們不需要的,如側邊欄、頁眉、頁腳、目錄欄鏈接等等。

所以通過觀察,我們可以發現所有指向詞條頁面的鏈接都有三個特點:

它們都在id是bodyContent的div標簽里 URL鏈接不包含冒號 URL鏈接都是以/wiki/開頭的相對路徑(也會爬到完整的有http開頭的絕對路徑)
from urllib2 import urlopenfrom bs4 import BeautifulSoupimport datetimeimport randomimport repages = set()random.seed(datetime.datetime.now())def getLinks(articleUrl):  html = urlopen("http://en.wikipedia.org"+articleUrl)  bsObj = BeautifulSoup(html, "html.parser")  return bsObj.find("div", {"id":"bodyContent"}).findAll("a", href=re.compile("^(/wiki/)((?!:).)*$"))links = getLinks("/wiki/Kevin_Bacon")while len(links) > 0:  newArticle = links[random.randint(0, len(links)-1)].attrs["href"]  if newArticle not in pages:    print(newArticle)    pages.add(newArticle)    links = getLinks(newArticle)

其中getLinks的參數是/wiki/<詞條名稱>,并通過和維基百科的絕對路徑合并得到頁面的URL。通過正則表達式捕獲所有指向其他詞條的URL,并返回給主函數。

主函數則通過調用遞歸getlinks并隨機訪問一條沒有訪問過的URL,直到沒有了詞條或者主動停止為止。

這份代碼可以將整個維基百科都抓取下來

from urllib.request import urlopenfrom bs4 import BeautifulSoupimport repages = set()def getLinks(pageUrl):  global pages  html = urlopen("http://en.wikipedia.org"+pageUrl)  bsObj = BeautifulSoup(html, "html.parser")  try:    print(bsObj.h1.get_text())    print(bsObj.find(id ="mw-content-text").findAll("p")[0])    print(bsObj.find(id="ca-edit").find("span").find("a").attrs['href'])  except AttributeError:    print("This page is missing something! No worries though!")  for link in bsObj.findAll("a", href=re.compile("^(/wiki/)")):    if 'href' in link.attrs:      if link.attrs['href'] not in pages:        #We have encountered a new page        newPage = link.attrs['href']        print("----------------/n"+newPage)        pages.add(newPage)        getLinks(newPage)getLinks("")             
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 呈贡县| 石景山区| 香港| 县级市| 盈江县| 鸡东县| 正安县| 泰和县| 榆林市| 南丰县| 东辽县| 丘北县| 建昌县| 蒙阴县| 常山县| 钟山县| 沁源县| 平遥县| 博野县| 张北县| 马山县| 宁波市| 西藏| 铁岭市| 和政县| 铜鼓县| 乐至县| 晋中市| 台安县| 泸定县| 水富县| 搜索| 涟水县| 元阳县| 青浦区| 嘉祥县| 新巴尔虎右旗| 五指山市| 繁昌县| 旌德县| 红安县|