動态爬取部落格資訊
- 前言
- 網頁分析
- 功能實作
-
- 準備工作
- 擷取網頁
- 輸出結果
- 程式封包
-
- 注意
- 程式源碼
- 總結
前言
大三上剛接觸python,在最後的學期實訓中老師想讓我們在部落格園上寫一篇有關于爬蟲的部落格(說是友善爬取每篇部落格的資訊),但是個人屬實不喜歡部落格園的界面,于是在CSDN上編寫了部落格然後爬取自己部落格的資訊。
網頁分析
以我之前寫的實訓部落格為例,首先我們在網頁上F12通過觀察網頁,部落格名稱、浏覽量、點贊數、評論數、收藏數都可以很友善的找到對應标簽,于是乎我就先用靜态的方法爬取。
import requests
import re
url='https://blog.csdn.net/qq_45279235/article/details/111696618'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'}
html=requests.get(url,headers=headers)
#點贊數量
spancount=re.findall(r'<span id="spanCount" class="count" style>(.*?)</span>',html.text)
print(spancount)
但是靜态爬取點贊數量和收藏數量出來的結果是空值(隻展示了一部分代碼),并且評論的标簽爬出來的結果并不唯一。

是以我就把靜态爬取網頁的請求結果text輸出出來,結果沒有找到對應的标簽和資料,隻好就改成動态爬取。
功能實作
準備工作
1.安裝Selenium庫。
如果網速過慢安裝失敗的話使用鏡像源下載下傳
pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple
如果提示WARNING: You are using pip version 20.2.1; however, version X.X.X is available 使用鏡像源更新pip
python -m pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple
2.下載下傳對應的webdriver驅動
浏覽器設定裡面可以找到你的版本
在這裡找到對應的驅動器,下載下傳之後放到python的檔案夾中
擷取網頁
通過驅動打開目标部落格的網頁
import requests
import re
from selenium import webdriver
browser = webdriver.Chrome(r'E:\python\Scripts\chromedriver.exe')
browser.get(url)
在尋找對應标簽(展示一部分)
通過方法擷取對應标簽然後text把資料給輸出來
find_element_by_id
find_element_by_name
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector
因為靜态爬取評論時得到的結果不唯一,是以這裡的評論的爬取我選擇通過xpath得到,後面在自己試驗中通過class标簽獲得的評論标簽也是可以的。
title = browser.find_element_by_class_name('title-article')
# print(title.text)
time = browser.find_element_by_class_name('time')
# print(time.text)
read_count = browser.find_element_by_class_name('read-count')
# print(read_count.text)
collection = browser.find_element_by_class_name('get-collection')
# print(collection.text)
like = browser.find_element_by_id('spanCount')
# print(like.text)
comment = browser.find_element_by_xpath('//*[@id="toolBarBox"]/div/ul/li[2]/a/span[2]')
輸出結果
如果直接把擷取标簽結果輸出去是 WebElement 類型,通過getAttribute()方法獲得的是标簽的屬性值,是以不能使用,一開始也讓我思考了半天。這裡我們要标簽裡面的值就直接like.text輸出就好了,輸出之後把網頁關閉。
print('部落格名稱:'+title.text)
print('釋出時間:'+time.text)
print('浏覽量:'+read_count.text)
print('收藏:'+collection.text)
print('點贊:'+like.text)
print('評論:'+comment.text)
browser.close()
程式封包
下載下傳PyInstaller庫
pip install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple
使用pyinstaller把.py檔案封包
pyinstaller -F F:\python\1-5.py --distpath=F:\python\
-F是表示産生一個檔案用于部署
F:\python\1-5.py是要封包的檔案
–distpath=F:\python\是産生exe檔案的位置
注意
在封包過後使用exe檔案時會提醒我這樣的一行代碼
在詢問老師後,老師也是查閱了很長時間之後給出了一個很有效的解決辦法,再次調試程式後封包exe檔案使用就不會提示錯誤了
更多有關PyInstaller使用方法可以參考: 連結
程式源碼
# -*- coding:utf-8 -*-
import requests
import re
from selenium import webdriver
def obtain(url):
browser = webdriver.Chrome(executable_path=r'E:\python\Scripts\chromedriver.exe')
browser.get(url)
# 視窗最小化
# browser.minimize_window()
title=browser.find_element_by_class_name('title-article')
time = browser.find_element_by_class_name('time')
# print(time.text)
read_count = browser.find_element_by_class_name('read-count')
# print(read_count.text)
collection = browser.find_element_by_class_name('get-collection')
# print(collection.text)
like=browser.find_element_by_id('spanCount')
# print(like.text)
comment = browser.find_element_by_xpath('//*[@id="toolBarBox"]/div/ul/li[2]/a/span[2]')
# print(comment.text)
print('部落格名稱:'+title.text)
print('釋出時間:'+time.text)
print('浏覽量:'+read_count.text)
print('收藏:'+collection.text)
print('點贊:'+like.text)
print('評論:'+comment.text)
browser.close()
# pyinstaller -F F:\python\1-5.py --distpath=F:\python\
if __name__ == '__main__':
i=1
while i == 1:
print('輸入你的選擇:')
print('1.擷取部落格資訊')
print('2.退出')
s=int(input())
if s == 1:
x=input('請輸入你想要擷取的部落格連結:')
obtain(x)
elif s == 2:
i=-1
else :
print('請重新輸入選擇:')
s=int(input())
總結
靜态爬取和動态爬取是根據網頁的資訊存在與否決定使用哪種,當然像之前提到的靜态小說網頁也可以使用動态爬取,但是動态網頁就不能使用靜态爬取網頁的方法了。爬取的思路是自己慢慢琢磨出來的,可能存在不好的地方,請各位大佬在評論中指出,讓程式更加完善。