Python7個爬蟲小案例詳解(附源碼)下篇
本次的7個python爬蟲小案例涉及到了re正則、xpath、beautiful soup、selenium等知識點,非常適合剛?cè)腴Tpython爬蟲的小伙伴參考學(xué)習(xí)。
前言
關(guān)于Python7個爬蟲小案例的文章分為三篇,本篇為下篇,共三題,其余兩篇內(nèi)容請關(guān)注!
題目五:
實現(xiàn)多種方法模擬登錄知乎,并爬取與一個與江漢大學(xué)有關(guān)問題和答案
首先使用selenium打開知乎登錄頁面,接著使用手機進行二維碼掃描登錄
進入頁面后,打開開發(fā)者工具,找到元素,,定位輸入框,輸入漢江大學(xué),然后點擊搜索按鈕
以第二條帖子為例,進行元素分析 。
源代碼及結(jié)果截圖:
from time import sleep from selenium.webdriver.chrome.service import Service from selenium.webdriver import Chrome,ChromeOptions from selenium.webdriver.common.by import By import warnings def main(): #忽略警告 warnings.filterwarnings("ignore") # 創(chuàng)建一個驅(qū)動 service = Service('chromedriver.exe') options = ChromeOptions() # 偽造瀏覽器 options.add_experimental_option('excludeSwitches', ['enable-automation','enable-logging']) options.add_experimental_option('useAutomationExtension', False) # 創(chuàng)建一個瀏覽器 driver = Chrome(service=service,options=options) # 繞過檢測 driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", { "source": """ Object.defineProperty(navigator, 'webdriver', { get: () => false }) """ }) # 打開知乎登錄頁面 driver.get('https://www.zhihu.com/') sleep(30) # 點擊搜索框 driver.find_element(By.ID,'Popover1-toggle').click() # 輸入內(nèi)容 driver.find_element(By.ID,'Popover1-toggle').send_keys('漢江大學(xué)') sleep(2) # 點擊搜索圖標(biāo) driver.find_element(By.XPATH,'//*[@id="root"]/div/div[2]/header/div[2]/div[1]/div/form/div/div/label/button').click() # 等待頁面加載完 driver.implicitly_wait(20) # 獲取標(biāo)題 title = driver.find_element(By.XPATH,'//*[@id="SearchMain"]/div/div/div/div/div[2]/div/div/div/h2/div/a/span').text # 點擊閱讀全文 driver.find_element(By.XPATH,'//*[@id="SearchMain"]/div/div/div/div/div[2]/div/div/div/div/span/div/button').click() sleep(2) # 獲取帖子內(nèi)容 content = driver.find_element(By.XPATH,'//*[@id="SearchMain"]/div/div/div/div/div[2]/div/div/div/div/span[1]/div/span/p').text # 點擊評論 driver.find_element(By.XPATH,'//*[@id="SearchMain"]/div/div/div/div/div[2]/div/div/div/div/div[3]/div/div/button[1]').click() sleep(2) # 點擊獲取更多評論 driver.find_element(By.XPATH,'//*[@id="SearchMain"]/div/div/div/div/div[2]/div/div/div/div[2]/div/div/div[2]/div[2]/div/div[3]/button').click() sleep(2) # 獲取評論數(shù)據(jù)的節(jié)點 divs = driver.find_elements(By.XPATH,'/html/body/div[6]/div/div/div[2]/div/div/div/div[2]/div[3]/div') try: for div in divs: # 評論內(nèi)容 comment = div.find_element(By.XPATH,'./div/div/div[2]').text f.write(comment) # 寫入文件 f.write('\n') print(comment) except: driver.close() if __name__ == '__main__': # 創(chuàng)建文件存儲數(shù)據(jù) with open('05.txt','a',encoding='utf-8')as f: main()
題目六:
綜合利用所學(xué)知識,爬取某個某博用戶前5頁的微博內(nèi)容
這里我們選取了人民日報的微博內(nèi)容進行爬取,具體頁面我就不放這了,怕違規(guī)。
源代碼:
import requests import csv from time import sleep import random def main(page): url = f'https://weibo.com/ajax/statuses/mymblog?uid=2803301701&page={page}&feature=0&since_id=4824543023860882kp{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', 'cookie':'SINAGLOBAL=6330339198688.262.1661412257300; ULV=1661412257303:1:1:1:6330339198688.262.1661412257300:; PC_TOKEN=8b935a3a6e; SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9WWoQDW1G.Vsux_WIbm9NsCq5JpX5KMhUgL.FoMNShMN1K5ESKq2dJLoIpjLxKnL1h.LB.-LxKqLBoBLB.-LxKqLBKeLB--t; ALF=1697345086; SSOLoginState=1665809086; SCF=Auy-TaGDNaCT06C4RU3M3kQ0-QgmTXuo9D79pM7HVAjce1K3W92R1-fHAP3gXR6orrHK_FSwDsodoGTj7nX_1Hw.; SUB=_2A25OTkruDeRhGeFJ71UW-S7OzjqIHXVtOjsmrDV8PUNbmtANLVKmkW9Nf9yGtaKedmyOsDKGh84ivtfHMGwvRNtZ; XSRF-TOKEN=LK4bhZJ7sEohF6dtSwhZnTS4; WBPSESS=PfYjpkhjwcpEXrS7xtxJwmpyQoHWuGAMhQkKHvr_seQNjwPPx0HJgSgqWTZiNRgDxypgeqzSMsbVyaDvo7ng6uTdC9Brt07zYoh6wXXhQjMtzAXot-tZzLRlW_69Am82CXWOFfcvM4AzsWlAI-6ZNA==' } resp = requests.get(url,headers=headers) data_list = resp.json()['data']['list'] for item in data_list: created_time = item['created_at'] # 發(fā)布時間 author = item['user']['screen_name'] # 作者 title = item['text_raw'] # 帖子標(biāo)題 reposts_count = item['reposts_count'] # 轉(zhuǎn)發(fā)數(shù) comments_count = item['comments_count'] # 評論數(shù) attitudes_count = item['attitudes_count'] # 點贊數(shù) csvwriter.writerow((created_time,author,title,reposts_count,comments_count,attitudes_count)) print(created_time,author,title,reposts_count,comments_count,attitudes_count) print(f'第{page}頁爬取完畢') if __name__ == '__main__': # 創(chuàng)建保存數(shù)據(jù)的csv文件 with open('06-2.csv','a',encoding='utf-8',newline='')as f: csvwriter = csv.writer(f) # 添加文件表頭 csvwriter.writerow(('發(fā)布時間','發(fā)布作者','帖子標(biāo)題','轉(zhuǎn)發(fā)數(shù)','評論數(shù)','點贊數(shù)')) for page in range(1,6): # 爬取前5頁數(shù)據(jù) main(page) sleep(5+random.random())
題目七:
自選一個熱點或者你感興趣的主題,爬取數(shù)據(jù)并進行簡要數(shù)據(jù)分析
(例如,通過爬取電影的名稱、類型、總票房等數(shù)據(jù)統(tǒng)計分析不同類型電影的平均票房,十年間每年票房冠軍的票房走勢等;通過爬取中國各省份地區(qū)人口數(shù)量,統(tǒng)計分析我國人口分布等)
本次選取的網(wǎng)址是藝恩娛數(shù),目標(biāo)是爬取里面的票房榜數(shù)據(jù),通過開發(fā)者工具抓包分析找到數(shù)據(jù)接口,然后開始編寫代碼進行數(shù)據(jù)抓取。
源代碼及結(jié)果截圖:
import requests import csv import pandas as pd import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') plt.rcParams['font.sans-serif'] = ['SimHei'] #解決中文顯示 plt.rcParams['axes.unicode_minus'] = False #解決符號無法顯示 def main(): headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36',} data = { 'r': '0.9936776079863086', 'top': '50', 'type': '0', } resp = requests.post('https://ys.endata.cn/enlib-api/api/home/getrank_mainland.do', headers=headers, data=data) data_list = resp.json()['data']['table0'] for item in data_list: rank = item['Irank'] # 排名 MovieName = item['MovieName'] # 電影名稱 ReleaseTime = item['ReleaseTime'] # 上映時間 TotalPrice = item['BoxOffice'] # 總票房(萬) AvgPrice = item['AvgBoxOffice'] # 平均票價 AvgAudienceCount = item['AvgAudienceCount'] # 平均場次 # 寫入csv文件 csvwriter.writerow((rank,MovieName,ReleaseTime,TotalPrice,AvgPrice,AvgAudienceCount)) print(rank,MovieName,ReleaseTime,TotalPrice,AvgPrice,AvgAudienceCount) def data_analyze(): # 讀取數(shù)據(jù) data = pd.read_csv('07.csv') # 從上映時間中提取出年份 data['年份'] = data['上映時間'].apply(lambda x: x.split('-')[0]) # 各年度上榜電影總票房占比 df1 = data.groupby('年份')['總票房(萬)'].sum() plt.figure(figsize=(6, 6)) plt.pie(df1, labels=df1.index.to_list(), autopct='%1.2f%%') plt.title('各年度上榜電影總票房占比') plt.show() # 各個年份總票房趨勢 df1 = data.groupby('年份')['總票房(萬)'].sum() plt.figure(figsize=(6, 6)) plt.plot(df1.index.to_list(), df1.values.tolist()) plt.title('各年度上榜電影總票房趨勢') plt.show() # 平均票價最貴的前十名電影 print(data.sort_values(by='平均票價', ascending=False)[['年份', '電影名稱', '平均票價']].head(10)) # 平均場次最高的前十名電影 print(data.sort_values(by='平均場次', ascending=False)[['年份', '電影名稱', '平均場次']].head(10)) if __name__ == '__main__': # 創(chuàng)建保存數(shù)據(jù)的csv文件 with open('07.csv', 'w', encoding='utf-8',newline='') as f: csvwriter = csv.writer(f) # 添加文件表頭 csvwriter.writerow(('排名', '電影名稱', '上映時間', '總票房(萬)', '平均票價', '平均場次')) main() # 數(shù)據(jù)分析 data_analyze()
從年度上榜電影票房占比來看,2019年占比最高,說明2019年這一年的電影質(zhì)量都很不錯,上榜電影多而且票房高。
從趨勢來看,從2016年到2019年,上榜電影總票房一直在增長,到2019年達到頂峰,說明這一年電影是非常的火爆,但是從2020年急劇下滑,最大的原因應(yīng)該是這一年年初開始爆發(fā)疫情,導(dǎo)致賀歲檔未初期上映,而且由于疫情影響,電影院一直處于關(guān)閉狀態(tài),所以這一年票房慘淡。
這篇關(guān)于Python7個爬蟲小案例詳解(附源碼)下篇的文章就介紹到這了,其他兩個部分的內(nèi)容(上、中篇)請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章。
好了,本次七個案例的分享到此全部結(jié)束,希望對剛?cè)胧峙老x的小伙伴有所幫助。
希望大家以后多多支持腳本之家!
- Python7個爬蟲小案例詳解(附源碼)中篇
- Python7個爬蟲小案例詳解(附源碼)上篇
- 利用Python爬蟲爬取金融期貨數(shù)據(jù)的案例分析
- Python爬蟲采集Tripadvisor數(shù)據(jù)案例實現(xiàn)
- Python?Ajax爬蟲案例分享
- Python爬蟲入門案例之爬取去哪兒旅游景點攻略以及可視化分析
- Python爬蟲入門案例之爬取二手房源數(shù)據(jù)
- Python爬蟲入門案例之回車桌面壁紙網(wǎng)美女圖片采集
- Python爬蟲之Scrapy環(huán)境搭建案例教程
- 用Python爬蟲破解滑動驗證碼的案例解析
- python爬蟲系列網(wǎng)絡(luò)請求案例詳解
- python爬蟲破解字體加密案例詳解
- python爬蟲線程池案例詳解(梨視頻短視頻爬取)
- python爬蟲scrapy框架的梨視頻案例解析
- python爬蟲利器之requests庫的用法(超全面的爬取網(wǎng)頁案例)
- Python爬蟲實戰(zhàn)案例之爬取喜馬拉雅音頻數(shù)據(jù)詳解
- Python爬蟲Scrapy框架CrawlSpider原理及使用案例
- Python爬蟲之對CSDN榜單進行分析
相關(guān)文章
簡明 Python 基礎(chǔ)學(xué)習(xí)教程
無論您剛接觸電腦還是一個有經(jīng)驗的程序員,本書都將有助您學(xué)習(xí)使用Python語言2007-02-02Python爬蟲:Request Payload和Form Data的簡單區(qū)別說明
這篇文章主要介紹了Python爬蟲:Request Payload和Form Data的簡單區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04