Python爬蟲,爬取博客園文章列表
前言
本次的案例源自于螞蟻老師的爬蟲課程。但由于博客園網(wǎng)站作了升級,所以螞蟻老師的示例代碼失效了,我根據(jù)螞蟻老師教授的知識結(jié)合網(wǎng)上搜索來的資料,重新編寫了一份代碼,復(fù)現(xiàn)了螞蟻老師在課程中的演示效果。
需求
下面我們來明確一下需求 爬取博客園前20頁的文章標題、對應(yīng)的文章鏈接以及對應(yīng)的點贊數(shù) 如圖所示
網(wǎng)站分頁設(shè)置
查看網(wǎng)站的html代碼
整體分析
通過瀏覽器內(nèi)置的查看網(wǎng)絡(luò)部分,我們發(fā)現(xiàn)了點擊分頁時,實際請求的url并不是瀏覽器輸入框中的信息,而是:https://www.cnblogs.com/AggSite/AggSitePostList
找到對應(yīng)的請求部分
可以發(fā)現(xiàn),對應(yīng)的content-type信息,以及user-agent信息 我們將這倆信息對應(yīng)放到代碼的header部分,作為一個請求頭附入request里面,模擬瀏覽器,防止網(wǎng)站的反爬蟲措施干擾。另外,為了將爬蟲偽裝得更加像是一個瀏覽器,可以將請求負載也加到request中
局部分析
下面我們來找具體的信息藏在哪里 鼠標右鍵對應(yīng)的內(nèi)容,查看html代碼,就可以發(fā)現(xiàn)如下內(nèi)容
文章標題和url鏈接
點贊數(shù)
現(xiàn)在我們就可以根據(jù)前面的分析寫代碼了
代碼編寫
為了演示,我的代碼只爬取了前3頁的內(nèi)容,如果你想要爬200頁,可自行修改代碼
"""
爬取前20頁的文章標題、鏈接、點贊數(shù)
"""
import?requests
from?bs4?import?BeautifulSoup
import?re
import?json
for?idx?in?range(1,?3):
?print("#"?*?30,?idx)
?url?=?"https://www.cnblogs.com/AggSite/AggSitePostList"
?headers?=?{"content-type":?"application/json",?"user-agent":"Mozilla/5.0?(Windows?NT?10.0;?Win64;?x64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/95.0.4638.54?Safari/537.36?Edg/95.0.1020.30"}
?request_payload?=?{"CategoryType":?"SiteHome",?"ParentCategoryId":?0,?"CategoryId":?808,?"PageIndex":?idx,?"TotalPostCount":?4000,?"ItemListActionName":?"AggSitePostList"}
?r?=?requests.post(url,?data=json.dumps(request_payload),?headers=headers)
?if?r.status_code?!=?200:
??print(r.status_code)
??raise?Exception()
?soup?=?BeautifulSoup(r.text,?"html.parser")
?section_list?=?soup.find_all("section",?class_="post-item-body")
?for?section?in?section_list:
??a_tag?=?section.find("a",?class_="post-item-title")
??passage_link?=?a_tag.get("href")
??passage_name?=?a_tag.get_text()
??span_tag?=?section.find("span",?id=re.compile(r"^digg"))
??numbers?=?span_tag.get_text()
??print(passage_link,?passage_name,?numbers)
運行結(jié)果

評論
圖片
表情
