Python7個(gè)爬蟲小案例詳解(附源碼)上篇
本次的7個(gè)python爬蟲小案例涉及到了re正則、xpath、beautiful soup、selenium等知識(shí)點(diǎn),非常適合剛?cè)腴Tpython爬蟲的小伙伴參考學(xué)習(xí)。
前言
關(guān)于Python7個(gè)爬蟲小案例的文章分為三篇,本篇為上篇,共兩題,其余兩篇內(nèi)容請(qǐng)關(guān)注!
題目一:
使用正則表達(dá)式和文件操作爬取并保存“百度貼吧”某帖子全部?jī)?nèi)容(該帖不少于5頁(yè))
本次選取的是百度貼吧中的NBA吧中的一篇帖子,帖子標(biāo)題是“克萊和哈登,誰(shuí)歷史地位更高”。爬取的目標(biāo)是帖子里面的回復(fù)內(nèi)容。
源程序和關(guān)鍵結(jié)果截圖:
import csv
import requests
import re
import time
def main(page):
url = f'https://tieba.baidu.com/p/7882177660?pn={page}'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36'
}
resp = requests.get(url,headers=headers)
html = resp.text
# 評(píng)論內(nèi)容
comments = re.findall('style="display:;"> (.*?)</div>',html)
# 評(píng)論用戶
users = re.findall('class="p_author_name j_user_card" href=".*?" rel="external nofollow" target="_blank">(.*?)</a>',html)
# 評(píng)論時(shí)間
comment_times = re.findall('樓</span><span class="tail-info">(.*?)</span><div',html)
for u,c,t in zip(users,comments,comment_times):
# 篩選數(shù)據(jù),過(guò)濾掉異常數(shù)據(jù)
if 'img' in c or 'div' in c or len(u)>50:
continue
csvwriter.writerow((u,t,c))
print(u,t,c)
print(f'第{page}頁(yè)爬取完畢')
if __name__ == '__main__':
with open('01.csv','a',encoding='utf-8')as f:
csvwriter = csv.writer(f)
csvwriter.writerow(('評(píng)論用戶','評(píng)論時(shí)間','評(píng)論內(nèi)容'))
for page in range(1,8): # 爬取前7頁(yè)的內(nèi)容
main(page)
time.sleep(2)
題目二:
實(shí)現(xiàn)多線程爬蟲爬取某小說(shuō)部分章節(jié)內(nèi)容并以數(shù)據(jù)庫(kù)存儲(chǔ)(不少于10個(gè)章節(jié))

本次選取的小說(shuō)網(wǎng)址是全本小說(shuō)網(wǎng)https://www.qb5.tw/,這里我們選取第一篇小說(shuō)進(jìn)行爬取

然后通過(guò)分析網(wǎng)頁(yè)源代碼分析每章小說(shuō)的鏈接

找到鏈接的位置后,我們使用Xpath來(lái)進(jìn)行鏈接和每一章標(biāo)題的提取

在這里,因?yàn)樯婕暗蕉啻问褂胷equests發(fā)送請(qǐng)求,所以這里我們把它封裝成一個(gè)函數(shù),便于后面的使用

每一章的鏈接獲取后,我們開始進(jìn)入小說(shuō)章節(jié)內(nèi)容頁(yè)面進(jìn)行分析

通過(guò)網(wǎng)頁(yè)分析,小說(shuō)內(nèi)容都在網(wǎng)頁(yè)源代碼中,屬于靜態(tài)數(shù)據(jù)

這里我們選用re正則表達(dá)式進(jìn)行數(shù)據(jù)提取,并對(duì)最后的結(jié)果進(jìn)行清洗

然后我們需要將數(shù)據(jù)保存到數(shù)據(jù)庫(kù)中,這里我將爬取的數(shù)據(jù)存儲(chǔ)到mysql數(shù)據(jù)庫(kù)中,先封住一下數(shù)據(jù)庫(kù)的操作

接著將爬取到是數(shù)據(jù)進(jìn)行保存

最后一步就是使用多線程來(lái)提高爬蟲效率,這里我們創(chuàng)建了5個(gè)線程的線程池

源代碼及結(jié)果截圖:
import requests
from lxml import etree
import re
import pymysql
from time import sleep
from concurrent.futures import ThreadPoolExecutor
def get_conn():
# 創(chuàng)建連接
conn = pymysql.connect(host="127.0.0.1",
user="root",
password="root",
db="novels",
charset="utf8")
# 創(chuàng)建游標(biāo)
cursor = conn.cursor()
return conn, cursor
def close_conn(conn, cursor):
cursor.close()
conn.close()
def get_xpath_resp(url):
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36'}
resp = requests.get(url, headers=headers)
tree = etree.HTML(resp.text) # 用etree解析html
return tree,resp
def get_chapters(url):
tree,_ = get_xpath_resp(url)
# 獲取小說(shuō)名字
novel_name = tree.xpath('//*[@id="info"]/h1/text()')[0]
# 獲取小說(shuō)數(shù)據(jù)節(jié)點(diǎn)
dds = tree.xpath('/html/body/div[4]/dl/dd')
title_list = []
link_list = []
for d in dds[:15]:
title = d.xpath('./a/text()')[0] # 章節(jié)標(biāo)題
title_list.append(title)
link = d.xpath('./a/@href')[0] # 章節(jié)鏈接
chapter_url = url +link # 構(gòu)造完整鏈接
link_list.append(chapter_url)
return title_list,link_list,novel_name
def get_content(novel_name,title,url):
try:
cursor = None
conn = None
conn, cursor = get_conn()
# 插入數(shù)據(jù)的sql
sql = 'INSERT INTO novel(novel_name,chapter_name,content) VALUES(%s,%s,%s)'
tree,resp = get_xpath_resp(url)
# 獲取內(nèi)容
content = re.findall('<div id="content">(.*?)</div>',resp.text)[0]
# 對(duì)內(nèi)容進(jìn)行清洗
content = content.replace('<br />','\n').replace(' ',' ').replace('全本小說(shuō)網(wǎng) www.qb5.tw,最快更新<a rel="external nofollow" >宇宙職業(yè)選手</a>最新章節(jié)!<br><br>','')
print(title,content)
cursor.execute(sql,[novel_name,title,content]) # 插入數(shù)據(jù)
conn.commit() # 提交事務(wù)保存數(shù)據(jù)
except:
pass
finally:
sleep(2)
close_conn(conn, cursor) # 關(guān)閉數(shù)據(jù)庫(kù)
if __name__ == '__main__':
# 獲取小說(shuō)名字,標(biāo)題鏈接,章節(jié)名稱
title_list, link_list, novel_name = get_chapters('https://www.qb5.tw/book_116659/')
with ThreadPoolExecutor(5) as t: # 創(chuàng)建5個(gè)線程
for title,link in zip(title_list,link_list):
t.submit(get_content, novel_name,title,link) # 啟動(dòng)線程

到此這篇關(guān)于Python7個(gè)爬蟲小案例詳解(附源碼)上篇的文章就介紹到這了,其他兩個(gè)部分的內(nèi)容(中、下篇)請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python7個(gè)爬蟲小案例詳解(附源碼)下篇
- Python7個(gè)爬蟲小案例詳解(附源碼)中篇
- 利用Python爬蟲爬取金融期貨數(shù)據(jù)的案例分析
- Python爬蟲采集Tripadvisor數(shù)據(jù)案例實(shí)現(xiàn)
- Python?Ajax爬蟲案例分享
- Python爬蟲入門案例之爬取去哪兒旅游景點(diǎn)攻略以及可視化分析
- Python爬蟲入門案例之爬取二手房源數(shù)據(jù)
- Python爬蟲入門案例之回車桌面壁紙網(wǎng)美女圖片采集
- Python爬蟲之Scrapy環(huán)境搭建案例教程
- 用Python爬蟲破解滑動(dòng)驗(yàn)證碼的案例解析
- python爬蟲系列網(wǎng)絡(luò)請(qǐng)求案例詳解
- python爬蟲破解字體加密案例詳解
- python爬蟲線程池案例詳解(梨視頻短視頻爬取)
- python爬蟲scrapy框架的梨視頻案例解析
- python爬蟲利器之requests庫(kù)的用法(超全面的爬取網(wǎng)頁(yè)案例)
- Python爬蟲實(shí)戰(zhàn)案例之爬取喜馬拉雅音頻數(shù)據(jù)詳解
- Python爬蟲Scrapy框架CrawlSpider原理及使用案例
- Python爬蟲之對(duì)CSDN榜單進(jìn)行分析
相關(guān)文章
PyQt彈出式對(duì)話框的常用方法及標(biāo)準(zhǔn)按鈕類型
這篇文章主要為大家詳細(xì)介紹了PyQt彈出式對(duì)話框的常用方法及標(biāo)準(zhǔn)按鈕類型,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02
Python繼承和子類從Person到Student演示實(shí)例
這篇文章主要為大家介紹了Python繼承和子類從Person到Student演示實(shí)例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
Python利用myqr庫(kù)創(chuàng)建自己的二維碼
這篇文章主要給大家介紹了關(guān)于Python利用myqr庫(kù)創(chuàng)建自己的二維碼的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
python程序中斷然后接著中斷代碼繼續(xù)運(yùn)行問(wèn)題
這篇文章主要介紹了python程序中斷然后接著中斷代碼繼續(xù)運(yùn)行問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02
Python matplotlib繪制實(shí)時(shí)數(shù)據(jù)動(dòng)畫
Matplotlib作為Python的2D繪圖庫(kù),它以各種硬拷貝格式和跨平臺(tái)的交互式環(huán)境生成出版質(zhì)量級(jí)別的圖形。本文將利用Matplotlib庫(kù)繪制實(shí)時(shí)數(shù)據(jù)動(dòng)畫,感興趣的可以了解一下2022-03-03
詳解Django框架中用context來(lái)解析模板的方法
這篇文章主要介紹了詳解Django框架中用context來(lái)解析模板的方法,Django是重多高人氣Python框架中最為著名的一個(gè),需要的朋友可以參考下2015-07-07

