python的爬蟲技術爬去糗事百科的方法詳解
初次學習爬蟲技術,在知乎上看瞭如何爬去糗事百科的段子,於是打算自己也做一個。
實現目標:1,爬取到糗事百科的段子
2,實現每次爬去段子,每按一次回車爬取到下一頁
#技術實現:基於python的實現,利用Requests庫,re庫,bs4庫的BeautifulSoup方法來實現的
主要內容:首先我們要理清一下爬取實現的思路,我們來建構一下主體框架。第一步我們先寫一個利用Requests庫來獲取網頁的方法,第二步我們利用bs4庫的BeautifulSoup方法來分析所獲取的網頁信息並利用正則表達式來匹配相關的段子信息。第三步我們來列印出所獲得的資訊。以上方法我們都透過一個主函數來執行。
一,先導入相關的函式庫
import requests from bs4 import BeautifulSoup import bs4 import re
二,先進行網頁資訊的取得
def getHTMLText(url): try: user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' headers = {'User-Agent': user_agent} r = requests.get(url,headers = headers) r.raise_for_status() r.encoding = r.apparent_encoding return r.text except: return ""
三,把資訊放到r後再進行解析
soup = BeautifulSoup(html,"html.parser")
我們需要的是段子的內容和發佈人,透過網頁的查看源代碼我們知道段子的發佈人在:
'p', attrs={'class': 'content'}中
段子的內容在
'p', attrs={'class': 'author clearfix'}中
所以我們通過bs4庫的方法來提取這兩個標籤的具體內容
def fillUnivlist(lis,li,html,count): soup = BeautifulSoup(html,"html.parser") try: a = soup.find_all('p', attrs={'class': 'content'}) ll = soup.find_all('p', attrs={'class': 'author clearfix'})
然後通過具體到正則表達式來獲取信息
for sp in a: patten = re.compile(r'<span>(.*?)</span>',re.S) Info = re.findall(patten,str(sp)) lis.append(Info) count = count + 1 for mc in ll: namePatten = re.compile(r'<h2>(.*?)</h2>', re.S) d = re.findall(namePatten, str(mc)) li.append(d)
我們需要注意的是使用find_all以及re的findall方法返回的都是一個列表,使用正規表示式時我們只是粗略提取並沒有把標籤中的換行符去掉
#接下來我們只需要把2個列表的內容進行組合輸出就可以了
def printUnivlist(lis,li,count): for i in range(count): a = li[i][0] b = lis[i][0] print ("%s:"%a+"%s"%b)
然後我做一個輸入控制函數,輸入Q返回錯誤,退出,輸入回車返回正確,進行下一頁段子的加載
def input_enter(): input1 = input() if input1 == 'Q': return False else: return True
我們透過主函數來實現所輸入的控制,如果控制函數回傳的是錯誤就不執行輸出,如果回傳的是正確就繼續輸出。我們透過一個for迴圈來進行載入下一頁。
def main(): passage = 0 enable = True for i in range(20): mc = input_enter() if mc==True: lit = [] li = [] count = 0 passage = passage + 1 qbpassage = passage print(qbpassage) url = 'http://www.qiushibaike.com/8hr/page/' + str(qbpassage) + '/?s=4966318' a = getHTMLText(url) fillUnivlist(lit, li, a, count) number = fillUnivlist(lit, li, a, count) printUnivlist(lit, li, number) else: break
這裡我們需要注意到是每一次for迴圈都會刷新一次lis【】和li【】,這樣每次都可以正確輸出該網頁的段子內容
一下為原始碼:
import requests from bs4 import BeautifulSoup import bs4 import re def getHTMLText(url): try: user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' headers = {'User-Agent': user_agent} r = requests.get(url,headers = headers) r.raise_for_status() r.encoding = r.apparent_encoding return r.text except: return "" def fillUnivlist(lis,li,html,count): soup = BeautifulSoup(html,"html.parser") try: a = soup.find_all('p', attrs={'class': 'content'}) ll = soup.find_all('p', attrs={'class': 'author clearfix'}) for sp in a: patten = re.compile(r'(.*?)',re.S) Info = re.findall(patten,str(sp)) lis.append(Info) count = count + 1 for mc in ll: namePatten = re.compile(r'(.*?)
', re.S) d = re.findall(namePatten, str(mc)) li.append(d) except: return "" return count def printUnivlist(lis,li,count): for i in range(count): a = li[i][0] b = lis[i][0] print ("%s:"%a+"%s"%b) def input_enter(): input1 = input() if input1 == 'Q': return False else: return True def main(): passage = 0 enable = True for i in range(20): mc = input_enter() if mc==True: lit = [] li = [] count = 0 passage = passage + 1 qbpassage = passage print(qbpassage) url = 'http://www.qiushibaike.com/8hr/page/' + str(qbpassage) + '/?s=4966318' a = getHTMLText(url) fillUnivlist(lit, li, a, count) number = fillUnivlist(lit, li, a, count) printUnivlist(lit, li, number) else: break main()
第一次做還是有很多可以優化的地方希望大家可以指出來。
以上是python的爬蟲技術爬去糗事百科的方法詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

Linux終端中查看Python版本時遇到權限問題的解決方法當你在Linux終端中嘗試查看Python的版本時,輸入python...

如何在10小時內教計算機小白編程基礎?如果你只有10個小時來教計算機小白一些編程知識,你會選擇教些什麼�...

在使用Python的pandas庫時,如何在兩個結構不同的DataFrame之間進行整列複製是一個常見的問題。假設我們有兩個Dat...

使用FiddlerEverywhere進行中間人讀取時如何避免被檢測到當你使用FiddlerEverywhere...

Uvicorn是如何持續監聽HTTP請求的? Uvicorn是一個基於ASGI的輕量級Web服務器,其核心功能之一便是監聽HTTP請求並進�...

本文討論了諸如Numpy,Pandas,Matplotlib,Scikit-Learn,Tensorflow,Tensorflow,Django,Blask和請求等流行的Python庫,並詳細介紹了它們在科學計算,數據分析,可視化,機器學習,網絡開發和H中的用途

在Python中,如何通過字符串動態創建對象並調用其方法?這是一個常見的編程需求,尤其在需要根據配置或運行...
