Python爬蟲-爬取百度搜索結果頁的網頁標題及其真實網址

来源:https://www.cnblogs.com/onullo/archive/2023/09/27/17731811.html
-Advertisement-
Play Games

共兩個依賴的需提前安裝的第三方庫:requests和bs4庫 cmd命令行輸入安裝requests庫:pip3 install -i https://pypi.douban.com/simple requests 安裝bs4庫:pip3 install -i https://pypi.douban. ...


共兩個依賴的需提前安裝的第三方庫:requests和bs4庫

cmd命令行輸入安裝requests庫:pip3 install -i https://pypi.douban.com/simple requests

安裝bs4庫:pip3 install -i https://pypi.douban.com/simple beautifulsoup4

 

本微項目源文件下載地址:

https://wwuw.lanzouj.com/i1Au51a0312d

解壓文件後,需按照解壓包內教程裝載Cookie即可使用。 本py腳本文件較符合有需求者使用,更適合python爬蟲初學者學習使用,代碼註釋較多,思路易理解。

 

本py腳本文件使用教程:

首先解壓壓縮包,打開包內的 “運行py文件前請閱讀!.txt” 文件,按其步驟裝載Cookie後方可使用腳本:

運行該程式前:請打開瀏覽器前往"https://www.baidu.com"手動登錄自己的百度賬戶,按F12打開開發者模式,選擇最上面一排Network/網路選項卡。

 

接著按F5刷新本網頁,捕獲到的請求里一直往上翻到最頂端,選擇第一次請求(即名稱為www.baidu.com的請求)。

 

再選擇右側標頭選項卡,往下滑到請求標頭處,將Cookie欄位的值全部複製下來(有很長一段的)替換掉下行的****** 替換後可直接運行該文件。

 

按上述步驟裝載完Cookie後記得保存py腳本文件,就可以直接F5運行該腳本了。下圖這裡我用的是cmd控制台環境來跑腳本。

 

找到保存結果的BDlinks.csv文件後,可用WPS、微軟Excel等軟體直接打開。

 

如若該py腳本首次運行就失敗,運行後無數據列印出來,一般是未成功裝載Cookie的問題,請按開頭的步驟重新裝載Cookie。

如若該py腳本多次運行後突然無數據列印出來,一般是 “高頻訪問百度伺服器/被識別爬蟲” 導致無數據返回,通常解決方法為換新Cookie:瀏覽器F5刷新後繼續按按開頭的步驟重新裝載Cookie。

最後可考慮是爬蟲代碼失效等其他問題,發文近日該爬蟲仍有效。

 

本微項目源碼:

 1 import requests
 2 from bs4 import BeautifulSoup
 3 import re
 4 import time
 5 from random import choice
 6 
 7 # 創建headers欄位
 8 def createUA():
 9     # 運行該程式前:請打開瀏覽器前往"https://www.baidu.com"手動登錄自己的百度賬戶,按F12打開開發者模式,選擇最上面一排Network/網路選項卡
10     # 接著按F5刷新本網頁,捕獲到的請求里一直往上翻到最頂端,選擇第一次請求(即名稱為www.baidu.com的請求)。
11     # 再選擇右側標頭選項卡,往下滑到請求標頭處,將Cookie欄位的值全部複製下來(有很長一段的)替換掉下行的****** 替換後可直接運行該文件
12     ua = {'Cookie': '******', \
13     'Host': 'www.baidu.com', \
14     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.54'}
15     return ua
16     # 程式運行無數據返回爬不了的時候,瀏覽器直接刷新繼續按上述方法換字典里的Cookie值就完事了
17 
18 # 將百度搜索鏈接給予的加密URL轉化為真實的URL
19 def convertRealUrl(url, s2):
20     try:
21         headers = createUA()
22         realR = s2.get(url = url, headers = headers, allow_redirects = False)
23         # 當請求加密鏈接,初兩次響應的Http報文往往告知瀏覽器需要重定向,最初兩次的響應報文里才有Location屬性來告知瀏覽器需要重定向到的真實網站鏈接。
24         # 此時我們不允許會話自動根據給出的Location重定向跳轉,因為允許重定向後會自動跳到最新的真實的URL站點,這時就只返回最新站點的響應HTTP報文(已完成重定向後),此時響應標頭裡不再有指示重定向url的Location欄位。此方法就會失效!
25         return realR.headers['Location']
26     except:
27         # print(realR.status_code, end = "")
28         print("頭部欄位沒有Location屬性或者加密的url有異常")
29         return url# 如果找不到Location頭部欄位無法返回真實鏈接,那麼就返回原來的加密鏈接
30 
31 # 獲取搜索頁
32 def getSearchPage(keyword, pn, s1):
33     headers = createUA()
34     url = 'http://www.baidu.com/s'
35     payload = {'wd': keyword, 'pn': pn}
36     try:
37         r = s1.get(url, headers = headers, params = payload, timeout = 30)
38         print('狀態碼是:', r.status_code)
39         r.raise_for_status()
40         r.encoding = 'utf-8'
41         return r.text
42     except:
43         return "狀態碼異常"
44 
45 # 升級!爬取一頁的標題和真實鏈接
46 def upgradeCrawler(html, s2):
47     soup = BeautifulSoup(html, 'lxml')
48     titles = []
49     links = []
50     for h3 in soup.find_all('h3', {'class': re.compile('c-title t')}):
51         # a.text為獲取該路徑下所有子孫字元串吧。可能剛好a元素和em元素間沒有換行符,所以抓取的字元串里沒有\n換行符
52         g_title = h3.a.text.replace('\n', '').replace(',', ' ').strip()# 去掉換行和空格,部分標題中還有逗號會影響CSV格式存儲,也要去除。
53         g_url = h3.a.attrs['href']
54         g_url = convertRealUrl(g_url, s2)
55         print("{}\t{}\t".format(g_title, g_url))
56         titles.append(g_title)
57         links.append(g_url)
58     return titles, links
59 
60 # 將二維列表數據寫入CSV文件
61 def writeCSV(titles, links):
62     infos = list(zip(titles, links))
63     fo = open('./BDlinks.csv', 'at', encoding='utf-8')# 需要鎖定用utf-8編碼打開,不然該文件很可能會以gbk中文編碼存儲,這導致部分url中的西文字元存儲到本文件時無法通過gbk模式編碼存儲。
64     for row in infos:
65         fo.write(",".join(row) + "\n")
66     fo.close()
67     print("CSV文件已保存!")
68 
69 # 頂層設計
70 def main():
71     while True:  # 迴圈
72         keyword = input("請輸入搜索關鍵詞:")
73         num = int(input("請輸入爬取頁數:"))
74         titles = []
75         links = []
76         # s1會話用於獲取搜索結果頁
77         s1 = requests.session()
78         # s2會話用於轉真實URL
79         s2 = requests.session()
80         # 第1頁為0,第2頁為10,第3頁為20,依次類推
81         num = num * 10
82         for pn in range(0, num, 10):
83             html = getSearchPage(keyword, pn, s1)
84             print('標題\tURL\t')
85             ti, li = upgradeCrawler(html, s2)
86             titles += ti
87             links += li
88             print("{0:->41}{1:-<36.0f}".format("當前頁碼為:", pn / 10 + 1))
89             time.sleep(5)
90         print('爬取完成!')
91         writeCSV(titles, links)
92 
93 if __name__ == '__main__':
94     main()

有一小部分註釋是作者開發學習過程中寫的個人筆記,看不懂的還請跳過。

以上皆為原創內容,倘若本文對你有幫助的話還請點下下方的推薦和贊,你的鼓勵就是作者創作的最大動力呀!

 

本文來自博客園,作者:onullo,轉載請註明原文鏈接:https://www.cnblogs.com/onullo/p/17731811.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • SpringBoot項目的分層 SpringBoot框架項目一般分為五層: View層:向用戶展示頁面 Controller層:前後端交互層,接收前端請求,調用Service層中的方法,接收Service層返回的數據並將其返回到前端。 Service層:存放業務處理的邏輯,以及一些操作資料庫的介面 ...
  • 1.創建獨立開發虛擬環境 1.1虛擬環境簡介 我們編寫的程式,有時用到的Python庫是不一樣的,比如說開發桌面應用程式我們主要用到PyQt5相關的Python庫、開發Web應用程式我們主要用到Django相關的Python庫等等。假設我們在開發桌面應用程式的時候除了PyQt5相關的Python庫外 ...
  • Spring-Boot-Starter 1. 準備配置類和 Bean 對象 Spring Boot 提供了兩個註解: @Configuration:Spring 提供的配置類註解,作用在類上,代表整個類是個 Spring 配置類,對照傳統的 Spring XML 配置文件。 @Bean:作用於方法上 ...
  • 不管哪個語言都有值傳遞,引用傳遞兩種方式,在C語言裡面引用傳遞用指針搞定。在Java裡面沒有指針,所以Java就規定(之前的設計)了某些類型是值傳遞,某些類型是引用傳遞,當然完全沒必要去全部類型分析一遍,比如int是什麼XX傳遞,String是什麼XX傳遞...,浪費時間,因為現在查AI那麼方便快捷 ...
  • 作者:VanFan 來源:juejin.cn/post/6844904053411938311 現在幾乎大部分的 App 都支持使用多個第三方賬號進行登錄,如:微信、QQ、微博等,我們把此稱為多賬號統一登陸。而這些賬號的表設計,流程設計至關重要,不然後續擴展性賊差。 本文不提供任何代碼實操,但是梳理 ...
  • 環境:Windows,cmake,gcc,g++,CLion 一、下載源碼 二、解壓並構建(我是怎麼知道的?) 進入處於解壓目錄的cmd視窗 輸入以下命令cmake以下 使用以下命令構建 100%即構建成功 找到這些東西,複製到CLion項目中,文件結構在後面 我這裡是先創建一個gtest目錄,在g ...
  • 不知道大家平時開發響應式前端代碼是如何調試的?是不是也跟我一樣,通過瀏覽器的開發者工具來切換不同的界面尺寸來看驗證效果呢? 可能是因為習慣了,平時就不停的切換不同尺寸來看效果。直到TJ君看到今天要推薦的這個免費工具,我才發現之前的調試方式好傻... 使用體驗 下麵,我們還一起來看看今天要推薦的這款名 ...
  • 3.1、環境搭建 創建名為spring_mvc_demo的新module,過程參考2.1節 3.1.1、創建SpringMVC的配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.o ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...