共兩個(gè)依賴的需提前安裝的第三方庫:requests和bs4庫
cmd命令行輸入安裝requests庫:pip3 install -i https://pypi.douban.com/simple requests
安裝bs4庫:pip3 install -i https://pypi.douban.com/simple beautifulsoup4
?文章來源地址http://www.zghlxwxcb.cn/news/detail-710434.html
本微項(xiàng)目源文件下載地址:
https://wwuw.lanzouj.com/i1Au51a0312d
解壓文件后,需按照解壓包內(nèi)教程裝載Cookie即可使用。 本py腳本文件較符合有需求者使用,更適合python爬蟲初學(xué)者學(xué)習(xí)使用,代碼注釋較多,思路易理解。
?
本py腳本文件使用教程:
首先解壓壓縮包,打開包內(nèi)的 “運(yùn)行py文件前請閱讀!.txt” 文件,按其步驟裝載Cookie后方可使用腳本:
運(yùn)行該程序前:請打開瀏覽器前往"https://www.baidu.com"手動(dòng)登錄自己的百度賬戶,按F12打開開發(fā)者模式,選擇最上面一排Network/網(wǎng)絡(luò)選項(xiàng)卡。
?
接著按F5刷新本網(wǎng)頁,捕獲到的請求里一直往上翻到最頂端,選擇第一次請求(即名稱為www.baidu.com的請求)。
?
再選擇右側(cè)標(biāo)頭選項(xiàng)卡,往下滑到請求標(biāo)頭處,將Cookie字段的值全部復(fù)制下來(有很長一段的)替換掉下行的****** 替換后可直接運(yùn)行該文件。
?
按上述步驟裝載完Cookie后記得保存py腳本文件,就可以直接F5運(yùn)行該腳本了。下圖這里我用的是cmd控制臺環(huán)境來跑腳本。
?
找到保存結(jié)果的BDlinks.csv文件后,可用WPS、微軟Excel等軟件直接打開。
?
如若該py腳本首次運(yùn)行就失敗,運(yùn)行后無數(shù)據(jù)打印出來,一般是未成功裝載Cookie的問題,請按開頭的步驟重新裝載Cookie。
如若該py腳本多次運(yùn)行后突然無數(shù)據(jù)打印出來,一般是 “高頻訪問百度服務(wù)器/被識別爬蟲” 導(dǎo)致無數(shù)據(jù)返回,通常解決方法為換新Cookie:瀏覽器F5刷新后繼續(xù)按按開頭的步驟重新裝載Cookie。
最后可考慮是爬蟲代碼失效等其他問題,發(fā)文近日該爬蟲仍有效。
?
本微項(xiàng)目源碼:
1 import requests 2 from bs4 import BeautifulSoup 3 import re 4 import time 5 from random import choice 6 7 # 創(chuàng)建headers字段 8 def createUA(): 9 # 運(yùn)行該程序前:請打開瀏覽器前往"https://www.baidu.com"手動(dòng)登錄自己的百度賬戶,按F12打開開發(fā)者模式,選擇最上面一排Network/網(wǎng)絡(luò)選項(xiàng)卡 10 # 接著按F5刷新本網(wǎng)頁,捕獲到的請求里一直往上翻到最頂端,選擇第一次請求(即名稱為www.baidu.com的請求)。 11 # 再選擇右側(cè)標(biāo)頭選項(xiàng)卡,往下滑到請求標(biāo)頭處,將Cookie字段的值全部復(fù)制下來(有很長一段的)替換掉下行的****** 替換后可直接運(yùn)行該文件 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 # 程序運(yùn)行無數(shù)據(jù)返回爬不了的時(shí)候,瀏覽器直接刷新繼續(xù)按上述方法換字典里的Cookie值就完事了 17 18 # 將百度搜索鏈接給予的加密URL轉(zhuǎn)化為真實(shí)的URL 19 def convertRealUrl(url, s2): 20 try: 21 headers = createUA() 22 realR = s2.get(url = url, headers = headers, allow_redirects = False) 23 # 當(dāng)請求加密鏈接,初兩次響應(yīng)的Http報(bào)文往往告知瀏覽器需要重定向,最初兩次的響應(yīng)報(bào)文里才有Location屬性來告知瀏覽器需要重定向到的真實(shí)網(wǎng)站鏈接。 24 # 此時(shí)我們不允許會(huì)話自動(dòng)根據(jù)給出的Location重定向跳轉(zhuǎn),因?yàn)樵试S重定向后會(huì)自動(dòng)跳到最新的真實(shí)的URL站點(diǎn),這時(shí)就只返回最新站點(diǎn)的響應(yīng)HTTP報(bào)文(已完成重定向后),此時(shí)響應(yīng)標(biāo)頭里不再有指示重定向url的Location字段。此方法就會(huì)失效! 25 return realR.headers['Location'] 26 except: 27 # print(realR.status_code, end = "") 28 print("頭部字段沒有Location屬性或者加密的url有異常") 29 return url# 如果找不到Location頭部字段無法返回真實(shí)鏈接,那么就返回原來的加密鏈接 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('狀態(tài)碼是:', r.status_code) 39 r.raise_for_status() 40 r.encoding = 'utf-8' 41 return r.text 42 except: 43 return "狀態(tài)碼異常" 44 45 # 升級!爬取一頁的標(biāo)題和真實(shí)鏈接 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為獲取該路徑下所有子孫字符串吧??赡軇偤胊元素和em元素間沒有換行符,所以抓取的字符串里沒有\(zhòng)n換行符 52 g_title = h3.a.text.replace('\n', '').replace(',', ' ').strip()# 去掉換行和空格,部分標(biāo)題中還有逗號會(huì)影響CSV格式存儲(chǔ),也要去除。 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 # 將二維列表數(shù)據(jù)寫入CSV文件 61 def writeCSV(titles, links): 62 infos = list(zip(titles, links)) 63 fo = open('./BDlinks.csv', 'at', encoding='utf-8')# 需要鎖定用utf-8編碼打開,不然該文件很可能會(huì)以gbk中文編碼存儲(chǔ),這導(dǎo)致部分url中的西文字符存儲(chǔ)到本文件時(shí)無法通過gbk模式編碼存儲(chǔ)。 64 for row in infos: 65 fo.write(",".join(row) + "\n") 66 fo.close() 67 print("CSV文件已保存!") 68 69 # 頂層設(shè)計(jì) 70 def main(): 71 while True: # 循環(huán) 72 keyword = input("請輸入搜索關(guān)鍵詞:") 73 num = int(input("請輸入爬取頁數(shù):")) 74 titles = [] 75 links = [] 76 # s1會(huì)話用于獲取搜索結(jié)果頁 77 s1 = requests.session() 78 # s2會(huì)話用于轉(zhuǎn)真實(shí)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('標(biāo)題\tURL\t') 85 ti, li = upgradeCrawler(html, s2) 86 titles += ti 87 links += li 88 print("{0:->41}{1:-<36.0f}".format("當(dāng)前頁碼為:", pn / 10 + 1)) 89 time.sleep(5) 90 print('爬取完成!') 91 writeCSV(titles, links) 92 93 if __name__ == '__main__': 94 main()
有一小部分注釋是作者開發(fā)學(xué)習(xí)過程中寫的個(gè)人筆記,看不懂的還請?zhí)^。
以上皆為原創(chuàng)內(nèi)容,倘若本文對你有幫助的話還請點(diǎn)下下方的推薦和贊,你的鼓勵(lì)就是作者創(chuàng)作的最大動(dòng)力呀!文章來源:http://www.zghlxwxcb.cn/news/detail-710434.html
?
到了這里,關(guān)于Python爬蟲-爬取百度搜索結(jié)果頁的網(wǎng)頁標(biāo)題及其真實(shí)網(wǎng)址的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!