Python 50行爬蟲抓取并處理圖靈書目過(guò)程詳解
前言
使用 requests進(jìn)行爬取、BeautifulSoup進(jìn)行數(shù)據(jù)提取。
主要分成兩步: 第一步是解析圖書列表頁(yè),并解析出里面的圖書詳情頁(yè)鏈接。 第二步是解析圖書詳情頁(yè),提取出感興趣的內(nèi)容,本例中根據(jù)不同的數(shù)據(jù)情況,采用了不同的提取方法,總的感覺(jué)就是BeautifulSoup用起來(lái)很方便
以下是幾個(gè)典型HTML內(nèi)容提取的Python代碼片段
1、提取詳情頁(yè)鏈接
列表頁(yè)中的詳情頁(yè)鏈接片段
<h4 class="name"> <a href="/book/1921" rel="external nofollow" title="深度學(xué)習(xí)入門:基于Python的理論與實(shí)現(xiàn)"> 深度學(xué)習(xí)入門:基于Python的理論與實(shí)現(xiàn) </a> </h4>
提取詳情頁(yè)鏈接的Python代碼
# bs是BeautifulSoup的instance
bs.select('.name')
for 詳情鏈接信息 in bs.select('.name'):
# 提取出鏈接
print(詳情鏈接信息.a.get('href'))
2、提取詳情頁(yè)中的圖書名稱
詳情頁(yè)中圖書名稱HTML代碼
<h2> 深度學(xué)習(xí)入門:基于Python的理論與實(shí)現(xiàn) </h2>
提取圖書名稱的Python代碼
# 因?yàn)樘崛〕鰜?lái)的文字前后還帶了很多空格,所以要用strip去掉 bs.h2.get_text().strip()
3、提取電子書價(jià)格信息
詳情頁(yè)中電子書價(jià)格HTML代碼
<dt>電子書</dt> <dd> <span class="price">¥29.99</span> </dd>
提取電子書價(jià)格的Python代碼
# 因?yàn)椴皇敲勘緯加须娮訒砸袛嘁幌?
有電子書 = bs.find("dt", text="電子書")
if 有電子書:
價(jià)格=有電子書.next_sibling.next_sibling.find("span", {"class": "price"}).get_text().strip()[1:]
print(float(價(jià)格))
完整代碼
# ituring.py,python3版本,默認(rèn)只抓兩頁(yè),可以通過(guò)啟動(dòng)參數(shù)控制要抓的列表頁(yè)范圍
import sys
import requests
import time
from bs4 import BeautifulSoup
def 輸出圖書列表中的詳情鏈接(bs):
# 找到頁(yè)面中所有的 <h4 class="name"><a href="/book/..." rel="external nofollow" >...</a></h4>
for 詳情鏈接信息 in bs.select('.name'):
# 提取出鏈接
yield 詳情鏈接信息.a.get('href')
def 獲取圖書詳情(鏈接):
詳情頁(yè) = requests.get('http://www.ituring.com.cn%s' %鏈接)
if 詳情頁(yè).ok:
bs = BeautifulSoup(詳情頁(yè).content, features="html.parser")
圖書 = {}
圖書['title'] = bs.h2.get_text().strip()
圖書['status'] = bs.find("strong", text="出版狀態(tài)").next_sibling
有定價(jià) = bs.find("strong", text="定 價(jià)")
if 有定價(jià):
圖書['price'] = 有定價(jià).next_sibling
有電子書 = bs.find("dt", text="電子書")
if 有電子書:
圖書['ePrice'] = float(有電子書.next_sibling.next_sibling.find("span", {"class": "price"}).get_text().strip()[1:])
有出版日期 = bs.find("strong", text="出版日期")
if 有出版日期:
圖書['date'] = 有出版日期.next_sibling
圖書['tags'] = []
for tag in bs.select('.post-tag'):
圖書['tags'].append(tag.string)
return 圖書
else:
print('❌ 詳情頁(yè) http://www.ituring.com.cn%s' %鏈接)
def 解析圖書列表頁(yè)(起始頁(yè), 終止頁(yè)):
for 頁(yè)序號(hào) in range(起始頁(yè) - 1, 終止頁(yè)):
# 逐一訪問(wèn)圖書列表頁(yè)面
列表頁(yè) = requests.get('http://www.ituring.com.cn/book?tab=book&sort=new&page=%s' %頁(yè)序號(hào))
if 列表頁(yè).ok:
# 創(chuàng)建 BeautifulSoup 的 instance
bs = BeautifulSoup(列表頁(yè).content, features="html.parser")
# 提取 列表頁(yè)中的 詳情頁(yè)鏈接,并逐一分析
for 詳情頁(yè)面鏈接 in 輸出圖書列表中的詳情鏈接(bs):
圖書信息 = 獲取圖書詳情(詳情頁(yè)面鏈接)
# 得到的圖書信息,按照自己的需求去處理吧
print(圖書信息)
# 抓完一本書休息一下
time.sleep(0.1)
print('✅ 第%s頁(yè)獲取完畢\n\t' %(頁(yè)序號(hào) + 1))
else:
print('❌ 第%s頁(yè)獲取出錯(cuò)\n\t' %(頁(yè)序號(hào) + 1))
if __name__ == '__main__':
# 默認(rèn)圖書列表起始頁(yè) 和 終止頁(yè)
起始圖書列表頁(yè)碼 = 1
終止圖書列表頁(yè)碼 = 2 # ⚠️ 改改代碼頁(yè)可以實(shí)現(xiàn)自動(dòng)獲得最后一頁(yè)
# 獲取輸入?yún)?shù); ⚠️此處未對(duì)輸入?yún)?shù)的類型做檢測(cè)
if(len(sys.argv)==2):
# 只有一個(gè)參數(shù)時(shí),輸入的是終止頁(yè)碼,起始頁(yè)碼默認(rèn)為 0
終止圖書列表頁(yè)碼 = int(sys.argv[1])
if(len(sys.argv)==3):
# 有兩個(gè)參數(shù)時(shí), 第一個(gè)參數(shù)是起始頁(yè)碼,第二個(gè)參數(shù)是終止頁(yè)碼
起始圖書列表頁(yè)碼 = int(sys.argv[1])
終止圖書列表頁(yè)碼 = int(sys.argv[2])
解析圖書列表頁(yè)(起始圖書列表頁(yè)碼, 終止圖書列表頁(yè)碼)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
PyCharm運(yùn)行Python代碼時(shí)出現(xiàn)"未找到模塊"錯(cuò)誤解決步驟
在使用python的過(guò)程中經(jīng)常會(huì)遇到一個(gè)問(wèn)題,就是叫什么名字的模塊未發(fā)現(xiàn),下面這篇文章主要給大家介紹了關(guān)于PyCharm運(yùn)行Python代碼時(shí)出現(xiàn)"未找到模塊"錯(cuò)誤的解決步驟,需要的朋友可以參考下2023-11-11
Python將視頻或者動(dòng)態(tài)圖gif逐幀保存為圖片的方法
本文是基于opencv將視頻和動(dòng)態(tài)圖gif保存為圖像幀的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2019-09-09
python實(shí)現(xiàn)每天定時(shí)發(fā)送郵件的流程步驟
這篇文章主要介紹了python實(shí)現(xiàn)每天定時(shí)發(fā)送郵件的流程步驟,要編寫一個(gè)用于自動(dòng)發(fā)送每日電子郵件報(bào)告的 Python 腳本,并配置它在每天的特定時(shí)間發(fā)送電子郵件,文中給大家介紹了詳細(xì)步驟和示例代碼,需要的朋友可以參考下2024-08-08
python numpy中的polyfit函數(shù)用法
這篇文章主要介紹了python numpy中的polyfit函數(shù)用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04

