您的位置:首頁>正文

看小說的正確姿勢,Python爬取起點中文網

1.前言

昨晚學了一下bs4的BeautifulSoup, 因為之前用的都是正則, 感覺兩者比起來, 正則更加靈活, 但控制不好就會爬到多餘資訊, 而BeautifulSoup更加系統性。

2.觀察網頁結構

進入起點原創風雲榜:http://r.qidian.com/yuepiao?chn=-1

老套路, 懂我的人都知道我要看看有多少內容和頁數需要爬。

翻到頁面底部, 發現有25頁

去最後一頁看了一下, 是第500個作品

在穀歌流覽器(推薦)按下F12進入賢者模式, 哦不, 開發者模式。 。 。 差點暴露了什麼

我們跳到第一頁

按F5刷新網頁

點擊network, 點擊下麵紅框消息

看Header, 可以知道我們get請求的訪問返回200表示正常訪問

在穀歌流覽器中輸入https://chrome.google.com/webstore/detail/infolite/ipjbadabbpedegielkhgpiekdlmfpgal, 安裝小外掛程式(丘老師開發的定位小外掛程式), 為後文定位準確有很大幫助。

安裝好之後, 流覽器右上角會出現

點擊之後會出現一個圖形介面

比如我要爬作品名字, 滑鼠點擊頁面作品, 會出現綠色, 表示選中了, 同時左邊和上面出現的黃色表示同時選中了, 但我們不要左邊和上面的黃色資訊(聽起來怪怪的!), 然後點擊左邊和上面的黃的區域, 黃色區域變紅色了(紅色表示不選擇)

此時只有文章名字是綠色了, 同時外掛程式介面上顯示rank-view-list li, 經測試要把#去掉, 定位完成。

在Preview中定位到我們要的部分

接下來使用BeautifulSoup(美麗湯)找出我們要的內容

書名, 作者, 類型, 簡介, 最新章節, 書的位址連結 這些是我們要的

3.編寫爬蟲

import requestsfrom bs4 import BeautifulSoupres=requests.get('http://r.qidian.com/yuepiao?chn=-1&page=1')#print(res)#中間列印看看, 好習慣soup=BeautifulSoup(res.text,'html.parser')#篩選器#print(soup)for news in soup.select('.rank-view-list li'):#定位 print(news)

結果如下:

注意這些標籤(因為美麗湯提取是基於標籤的)

經過測試

for news in soup.select('.rank-view-list li'):#Wrap後面一定有個空格, 因為網頁裡有 #print(news) print(news.select('a')[1].text,news.select('a')[2].text,news.select('a')[3].text,news.select('p')[1].text,news.select('p')[2].text,news.select('a')[0]['href'])

可以設置提取內容如上面代碼所示

提取結果是:

很亂, 把內容存成字典格式再存放到清單中:

for news in soup.select('.rank-view-list li'):#Wrap後面一定有個空格, 因為網頁裡有 #print(news) #print(news.select('a')[1].text,news.select('a')[2].text,news.select('a')[3].text,news.select('p')[1].text,news.select('p')[2].text,news.select('a')[0]['href']) newsary.append({'title':news.select('a')[1].text,'name':news.select('a')[2].text,'style':news.select('a')[3].text,'describe':news.select('p')[2].text,'url':news.select('a')[0]['href']})len(newsary)

顯示每頁20個作品

import pandasnewsdf=pandas.DataFrame(newsary)newsdf

使用pandas的DataFrame格式存放

是不是舒服多了

但是, 這只是第一頁的資訊, 接下來老套路, 觀察網頁結構, 在我之前文章(爬取智聯招聘資訊裡有寫到:https://ask.hellobi.com/blog/wangdawei/6710)

使用迴圈爬取25頁內容

import requestsfrom bs4 import BeautifulSoupnewsary=[]for i in range(25): res=requests.get('http://r.qidian.com/yuepiao?chn=-1&page='+str(i))#print(res) soup=BeautifulSoup(res.text,'html.parser')#print(soup)#for news in soup.select('.rank-view-list h4'):#Wrap後面一定有個空格, 因為網頁裡有 for news in soup.select('.rank-view-list li'):#Wrap後面一定有個空格, 因為網頁裡有 #print(news) #print(news.select('a')[1].text,news.select('a')[2].text,news.select('a')[3].text,news.select('p')[1].text,news.select('p')[2].text,news.select('a')[0]['href']) newsary.append({'title':news.select('a')[1].text,'name':news.select('a')[2].text,'style':news.select('a')[3].text,'describe':news.select('p')[1].text,'lastest':news.select('p')[2].text,'url':news.select('a')[0]['href']})import pandasnewsdf=pandas.DataFrame(newsary)newsdf

這次終於完整了

最後存到本地~

newsdf.to_excel('qidian_rank1.xlsx')#輸入到to按住Tab有很多格式, 儲存

用excel做一些後處理, 把簡介前面的空格去掉, 換一下列之間的順序(更符合正常閱讀)

4.結果展現

感謝閱讀~

文章中可能有一點的小錯誤,如有大佬發現,還請批評指正、

分享最後我還是要推薦下我自己建的Python學習群: 639584010,群裡都是學Python開發的,如果你正在學習Python,小編歡迎你加入,大家都是Python黨,不定期分享乾貨(只有Python相關的),包括我自己整理的一份2018最新的Python資料和零基礎入門教程,歡迎初學和進階中的小夥伴。

4.結果展現

感謝閱讀~

文章中可能有一點的小錯誤,如有大佬發現,還請批評指正、

分享最後我還是要推薦下我自己建的Python學習群: 639584010,群裡都是學Python開發的,如果你正在學習Python,小編歡迎你加入,大家都是Python黨,不定期分享乾貨(只有Python相關的),包括我自己整理的一份2018最新的Python資料和零基礎入門教程,歡迎初學和進階中的小夥伴。

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示