溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么用BeautifulSoup爬取網(wǎng)頁內(nèi)容

發(fā)布時(shí)間:2021-08-19 19:47:31 來源:億速云 閱讀:289 作者:chen 欄目:大數(shù)據(jù)

這篇文章主要講解了“怎么用BeautifulSoup爬取網(wǎng)頁內(nèi)容”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“怎么用BeautifulSoup爬取網(wǎng)頁內(nèi)容”吧!

最近要做一個(gè)食品安全方面的項(xiàng)目,需要爬取新聞。于是想到之前用BeautifulSoup爬蟲還是非常方便的,今天正好試了一下,可行。

爬取的鏈接如下:http://news.sohu.com/1/0903/61/subject212846158.shtml

結(jié)構(gòu)如下:

怎么用BeautifulSoup爬取網(wǎng)頁內(nèi)容

從第二頁開始的鏈接格式是:http://news.sohu.com/1/0903/61/subject212846158_1091.shtml

逐頁遞減(即1091、1090如此)。

需要的內(nèi)容: 標(biāo)題、時(shí)間、來源、作者、全文。

準(zhǔn)備: urllib2, BeautifulSoup, lxml

先引入這幾個(gè)庫

import urllib2
import lxml
from bs4 import BeautifulSoup

先用開發(fā)者工具得到headers(當(dāng)然我們這里不用headers也可以)

headers = {
   "User-Agent": "ozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36"}


def sina_news(url,i):
    request = urllib2.Request(url,headers=headers)
    #發(fā)送請求,帶headers
    response = urllib2.urlopen(request)
    #得到response
    html_doc = response.read()
    #讀取得到HTML文件
    soup = BeautifulSoup(html_doc,'lxml')
    #對HTML使用lxml解析器進(jìn)行解析
    titles = soup.select('td.newsblue1 > a:nth-of-type('+str(i)+')')
    #利用selector獲得titles
    time = soup.select('td.newsblue1 > span:nth-of-type('+str(i)+')')
    #同上
    print titles[0].get_text()
    #由于select返回的是表,表的第一個(gè)元素是我們要的,所以titles[0],.get_text()是為了去掉一些HTML代碼,只得到內(nèi)容值
    print time[0].get_text()
    print titles[0]['href']

利用selector進(jìn)行解析的時(shí)候是用到了開發(fā)者工具的定位功能,定位元素后,右鍵copy-selector即可,當(dāng)然要注意nth-child(x)需要改成nth-of-type(x),在這里我們用了

nth-of-type('+str(i)+')')

這樣的表達(dá)方式,是因?yàn)樵谠擁撁娴慕Y(jié)構(gòu)中,新聞是以子項(xiàng)目排列的。如第一條就是nth-of-type(1),第二條就是nth-of-type(2),如此列推。測試一下結(jié)果:


for i in range(1,201):
   sina_news('http://news.sohu.com/1/0903/61/subject212846158.shtml',i)

結(jié)果如下:

怎么用BeautifulSoup爬取網(wǎng)頁內(nèi)容

現(xiàn)在僅僅是解決了標(biāo)題、時(shí)間、鏈接,我們還有來源,作者。但是我們已經(jīng)獲得了每一條新聞的鏈接,那么這就很好辦了。

我們先看一下每一條新聞的結(jié)構(gòu):

怎么用BeautifulSoup爬取網(wǎng)頁內(nèi)容

怎么用BeautifulSoup爬取網(wǎng)頁內(nèi)容

同理、很容易就能提取出來源、責(zé)任編輯。代碼如下:

def get_source(url):
   request = urllib2.Request(url,headers=headers)
   response = urllib2.urlopen(request)
   html_doc = response.read()
   soup = BeautifulSoup(html_doc,'lxml')
   sources = soup.select('#media_span')
   editor = soup.select('#editor_baidu')
   return sources,editor

在原來的函數(shù)中增加如下代碼:

sources,editor = get_source(titles[0]['href'])
 
if(sources):
   print sources[0].get_text()
if(editor):
   print editor[0].get_text()

由于來源和責(zé)任編輯不一定每一條新聞都有,因此這里加了一個(gè)判斷條件?,F(xiàn)在看看效果。

怎么用BeautifulSoup爬取網(wǎng)頁內(nèi)容

效果還可以,再提取所有頁面的內(nèi)容

def get_singalpage_all(url):
   for i in range(1,201):
       sina_news(url,i)

def get_all_page():
   url = 'http://news.sohu.com/1/0903/61/subject212846158'
   for i in range (1091,990,-1):
       wholeURL = url + '_' + str(i) + '.shtml'
       get_singalpage_all(wholeURL)

調(diào)用一下:

get_singalpage_all('http://news.sohu.com/1/0903/61/subject212846158.shtml')
get_all_page()

成功爬取了所有國內(nèi)要聞。

上面已經(jīng)是全部源代碼了,當(dāng)然如果你覺得這樣看很麻煩的話,可以在這里下載:

https://alltoshare.com/product/2747.html

感謝各位的閱讀,以上就是“怎么用BeautifulSoup爬取網(wǎng)頁內(nèi)容”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對怎么用BeautifulSoup爬取網(wǎng)頁內(nèi)容這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI