Python爬虫原理与简单示例代码
鏈接
鏈接
?
爬取知乎熱榜話題:
鏈接
?
BeautifulSoup的使用1:
url = 'http://www.cntour.cn/'strhtml = requests.get(url)soup = BeautifulSoup(strhtml.text, 'lxml')# data = soup.select('#main>div>div.mtop.firstMod.clearfix>div.centerBox>ul.newsList>li>a')data = soup.select('#main > div > div.mtop.firstMod.clearfix > div.centerBox > ul.newsList > li > a')print(data)for item in data:result = {'title': item.get_text(),'link': item.get('href'),'ID': re.findall('\d+', item.get('href'))}print(result)輸出如下: [<a href="http://www.cntour.cn/news/15009/" target="_blank" title="觀察:就地過年帶火周邊游">觀察:就地過年帶火周邊游</a>, <a href="http://www.cntour.cn/news/14998/" target="_blank" title="國務(wù)院:規(guī)范落實春節(jié)返鄉(xiāng)疫情防控要求">國務(wù)院:規(guī)范落實春節(jié)返鄉(xiāng)疫情防控要求</a>, <a href="http://www.cntour.cn/news/14997/" target="_blank" title="消費新力量,撬動供給的新引擎">消費新力量,撬動供給的新引擎</a>, <a href="http://www.cntour.cn/news/14993/" target="_blank" title="2021年文旅產(chǎn)業(yè)發(fā)展的五大趨勢">2021年文旅產(chǎn)業(yè)發(fā)展的五大趨勢</a>, <a href="http://www.cntour.cn/news/14988/" target="_blank" title="2021中國旅游向內(nèi)發(fā)力">[2021中國旅游向內(nèi)發(fā)力]</a>, <a href="http://www.cntour.cn/news/14987/" target="_blank" title="2020中國旅游浴火重生">[2020中國旅游浴火重生]</a>, <a href="http://www.cntour.cn/news/14977/" target="_blank" title="“云旅游”賦能旅游業(yè)創(chuàng)新發(fā)展">[“云旅游”賦能旅游業(yè)創(chuàng)]</a>, <a href="http://www.cntour.cn/news/14970/" target="_blank" title="旅游為幸福生活添彩">[旅游為幸福生活添彩]</a>, <a href="http://www.cntour.cn/news/14965/" target="_blank" title="RCEP為旅游業(yè)帶來機遇">[RCEP為旅游業(yè)帶來機遇]</a>, <a href="http://www.cntour.cn/news/14943/" target="_blank" title="大數(shù)據(jù)讀懂中國旅游新引力">[大數(shù)據(jù)讀懂中國旅游新引]</a>, <a href="http://www.cntour.cn/news/13916/" target="_blank" title="假日旅游復蘇 市場平穩(wěn)有序">[假日旅游復蘇 市場平穩(wěn)]</a>, <a href="http://www.cntour.cn/news/13907/" target="_blank" title="全球旅游業(yè)呈現(xiàn)持續(xù)向好勢頭">[全球旅游業(yè)呈現(xiàn)持續(xù)向好]</a>] {'link': 'http://www.cntour.cn/news/15009/', 'title': '觀察:就地過年帶火周邊游', 'ID': ['15009']} {'link': 'http://www.cntour.cn/news/14998/', 'title': '國務(wù)院:規(guī)范落實春節(jié)返鄉(xiāng)疫情防控要求', 'ID': ['14998']} {'link': 'http://www.cntour.cn/news/14997/', 'title': '消費新力量,撬動供給的新引擎', 'ID': ['14997']} {'link': 'http://www.cntour.cn/news/14993/', 'title': '2021年文旅產(chǎn)業(yè)發(fā)展的五大趨勢', 'ID': ['14993']} {'link': 'http://www.cntour.cn/news/14988/', 'title': '[2021中國旅游向內(nèi)發(fā)力]', 'ID': ['14988']} {'link': 'http://www.cntour.cn/news/14987/', 'title': '[2020中國旅游浴火重生]', 'ID': ['14987']} {'link': 'http://www.cntour.cn/news/14977/', 'title': '[“云旅游”賦能旅游業(yè)創(chuàng)]', 'ID': ['14977']} {'link': 'http://www.cntour.cn/news/14970/', 'title': '[旅游為幸福生活添彩]', 'ID': ['14970']} {'link': 'http://www.cntour.cn/news/14965/', 'title': '[RCEP為旅游業(yè)帶來機遇]', 'ID': ['14965']} {'link': 'http://www.cntour.cn/news/14943/', 'title': '[大數(shù)據(jù)讀懂中國旅游新引]', 'ID': ['14943']} {'link': 'http://www.cntour.cn/news/13916/', 'title': '[假日旅游復蘇 市場平穩(wěn)]', 'ID': ['13916']} {'link': 'http://www.cntour.cn/news/13907/', 'title': '[全球旅游業(yè)呈現(xiàn)持續(xù)向好]', 'ID': ['13907']}BeautifulSoup的使用2:
pre = {'User-agent': 'Mozilla/5.0'}res = requests.get("https://www.zhihu.com/billboard", headers=pre)rep = res.textsoup = BeautifulSoup(rep, "html.parser")pre = {'User-agent': 'Mozilla/5.0'}try:res = requests.get("https://www.zhihu.com/billboard", headers=pre)# print(res.raise_for_status)rep = res.textexcept:print("連接失敗")try:soup = BeautifulSoup(rep, "html.parser")con = soup.find_all('div', class_="HotList-itemTitle")for i in range(len(con)):print(con[i].text)except:print("獲取失敗")輸出如下: 23 歲女生在貨拉拉車上跳窗身亡,司機曾三次偏航,案件有哪些線索與疑點? KTV 的服務(wù)員隔幾分鐘就往包房里看一眼,到底是在看什么? 意外發(fā)現(xiàn)成績還算不錯的女兒寒假作業(yè)居然直接抄答案,我怎么辦? 昨天下午和一個男生相親了,他主動加了我的微信,現(xiàn)在是第二天都沒聯(lián)系我,他是什么意思呢 ? 如何看待多所大學開學時間朝令夕改,引發(fā)大量學生改簽后不彌補經(jīng)濟損失,又取消變動? 如何看待 FPX 公告英雄聯(lián)盟分部隊內(nèi)打野選手 Bo 在 LDL 期間受裹挾參與不當競技行為? 《你好,李煥英》總票房超過《唐人街探案 3》,對此你怎么看? 如何看待廣西一女教師為救被猥褻女學生「越級報警」,因為被查出無教師資格證而丟了工作改賣螺螄粉? 男子入職兩小時猝死,家屬索賠 140 萬,公司應(yīng)承擔多少責任? 據(jù)說美國科學家發(fā)現(xiàn)導致近視的不是用眼疲勞,而是眼睛缺少光照,相關(guān)科學依據(jù)是什么? 孩子博士畢業(yè),華為 65 萬年薪,公務(wù)員 18 萬年薪,應(yīng)該如何選擇? 宅追二次元,飯圈女孩追星,為什么同樣是「追」,大家都只罵飯圈,而二次元罵的比較少? 2021 考研成績即將公布,你有什么想說的? 滬深廣磁懸浮要來了,深圳 2.5 小時到上海,3.6 小時到北京,將會給生活帶來哪些影響? 如何看待江蘇一男子假裝跳河自殺,女友下河相救時遭拖拽溺水身亡? 特斯拉一體壓鑄成本降低,為什么其他汽車廠家此前沒有類似嘗試? 如何看待花旗銀行錯匯 5 億美元,法院判決不用還這一案子? 印度發(fā)現(xiàn) 240 種變異新冠病毒,為什么印度的變異病毒這么多?該怎么應(yīng)對? 如何評價南京大學關(guān)于春季學期開學的通知? 如何看待 gidle 成員徐穗珍被爆出校園霸凌? 劉德華主演的《人潮洶涌》怎么就票房撲街了? 女生在貨拉拉車上跳窗身亡,貨拉拉或?qū)⒊袚男┴熑?#xff1f;車內(nèi)無錄音錄像設(shè)備,貨拉拉在服務(wù)經(jīng)營方面有哪些問題? 公積金 4000,工資大概多少? 第一次買螺螄粉哪個牌子的好吃? 如何評價劇版《斗羅大陸》最后一集? 媽媽把嫂子送給她的項鏈送給小姑子了,嫂子不開心了,合理嗎? 怎么理解「 善戰(zhàn)者無赫赫之功 」? 有人真的通過 NS 上的《健身環(huán)大冒險》游戲減肥了嗎? 為人父母,你能接受自己的孩子一生「平庸」嗎? 華為折疊屏新旗艦今日即將發(fā)布,有哪些值得關(guān)注的點? 《你好,李煥英》中的王琴是一個什么樣的角色? 其他哺乳動物對難聞的體味發(fā)情,為什么人類相反對體味感到掃興? 剛過完年手上有點壓歲錢,不知該買游戲機還是買四大名著? 考研估分與實際成績一般相差多少? 為什么人一定要談戀愛呢? 請問有什么動漫番適合跟父母一起投屏看的呢? 朱元璋為什么不刪改他做過乞丐的歷史? 如何評價《無職轉(zhuǎn)生》第七集? 2020 年口紅銷量下滑近半,眼妝產(chǎn)品火爆,戴口罩的你還會涂口紅嗎?疫情對美妝產(chǎn)業(yè)有多大影響? 為什么現(xiàn)在的娛樂圈很難再出現(xiàn)張國榮,林青霞等風華絕代的明星? 你們希望《創(chuàng)造營 2021》里誰出道? 如何看待《原神》限定四星武器千巖古劍和千巖長槍? 長期吃素會影響健康嗎? 如何禁止學生啟用防火墻防止學生退出電子教室? 爸媽不同意的戀情怎么辦? 我國將如何以全面推進鄉(xiāng)村振興促進民族復興? 《賽博朋克 2077》失敗了嗎? iPad 上有什么用來學習的優(yōu)秀 App 推薦? 住在山里是種什么樣的體驗? 《慶余年》講的是什么故事?爬蟲攻防戰(zhàn)
爬蟲是模擬人的瀏覽訪問行為,進行數(shù)據(jù)的批量抓取。當抓取的數(shù)據(jù)量逐漸增大時,會給被訪問的服務(wù)器造成很大的壓力,甚至有可能崩潰。換句話就是說,服務(wù)器是不喜歡有人抓取自己的數(shù)據(jù)的。那么,網(wǎng)站方面就會針對這些爬蟲者,采取一些反爬策略。
服務(wù)器第一種識別爬蟲的方式就是通過檢查連接的 useragent 來識別到底是瀏覽器訪問,還是代碼訪問的。如果是代碼訪問的話,訪問量增大時,服務(wù)器會直接封掉來訪 IP。
那么應(yīng)對這種初級的反爬機制,我們應(yīng)該采取何種舉措?
還是以前面創(chuàng)建好的爬蟲為例。在進行訪問時,我們在開發(fā)者環(huán)境下不僅可以找到 URL、Form Data,還可以在 Request headers 中構(gòu)造瀏覽器的請求頭,封裝自己。服務(wù)器識別瀏覽器訪問的方法就是判斷 keyword 是否為 Request headers 下的 User-Agent,如圖 22 所示。
圖 22
因此,我們只需要構(gòu)造這個請求頭的參數(shù)。創(chuàng)建請求頭部信息即可,代碼如下:
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'}
response = request.get(url,headers=headers)
寫到這里,很多讀者會認為修改 User-Agent 很太簡單。確實很簡單,但是正常人1秒看一個圖,而個爬蟲1秒可以抓取好多張圖,比如 1 秒抓取上百張圖,那么服務(wù)器的壓力必然會增大。也就是說,如果在一個 IP 下批量訪問下載圖片,這個行為不符合正常人類的行為,肯定要被封 IP。
其原理也很簡單,就是統(tǒng)計每個IP的訪問頻率,該頻率超過閾值,就會返回一個驗證碼,如果真的是用戶訪問的話,用戶就會填寫,然后繼續(xù)訪問,如果是代碼訪問的話,就會被封 IP。
這個問題的解決方案有兩個,第一個就是常用的增設(shè)延時,每 3 秒鐘抓取一次,代碼如下:
import time
time.sleep(3)
但是,我們寫爬蟲的目的是為了高效批量抓取數(shù)據(jù),這里設(shè)置 3 秒鐘抓取一次,效率未免太低。其實,還有一個更重要的解決辦法,那就是從本質(zhì)上解決問題。
不管如何訪問,服務(wù)器的目的就是查出哪些為代碼訪問,然后封鎖 IP。解決辦法:為避免被封 IP,在數(shù)據(jù)采集時經(jīng)常會使用代理。當然,requests 也有相應(yīng)的 proxies 屬性。
首先,構(gòu)建自己的代理 IP 池,將其以字典的形式賦值給 proxies,然后傳輸給 requests,代碼如下:
本文僅對 Python 爬蟲及實現(xiàn)過程做了簡明扼要地介紹,僅能使初學者對 python 爬蟲有一個淺顯的認識,并不能讓你完全掌握 Python 爬蟲。
如果你想對 Python 爬蟲有更深入的了解,我推薦你閱讀:
- Python爬蟲入門教程?
- Python3網(wǎng)絡(luò)爬蟲入門教程
- Python爬蟲教程——慕課網(wǎng)
總結(jié)
以上是生活随笔為你收集整理的Python爬虫原理与简单示例代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VC函数对象模板
- 下一篇: 美的华为鸿蒙,董明珠万没想到,格力终将被