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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...