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