还在熬夜干论文——Python带你一键起飞!【内附演示视频】
項目背景
話不多說,我們先來安利一下本期文章演示視頻
寫論文,這個工具愛了愛了
?????????學習爬蟲,我們可以做些什么?
這個問題從我開始開設《Python爬蟲語法知識詳解》就已經介紹的很清楚了,爬蟲之所以可以作為我們學習Python語法的進階項目,在于它的藝術美感和實用性。為什么我要說它的藝術美感呢,這個還是因人而異吧,畢竟每一個人心中都居住著另外一個自己,要善于發掘,而不是一味地追隨。本期爬蟲自動化項目,將帶你走進科研的道路,博客專欄也開啟了《Python爬蟲實戰系列》有興趣的小伙伴,可以點擊查看并學習。知識永無止境,學習仍需努力!
目錄
項目背景
項目開展
數據挖掘
分析網頁
Selenium語法詳解
Webdriver模塊的使用
解析網頁
抓取數據
解析zip函數和zip_longest函數
存儲數據
數據挖掘總結
數據分析
詞云圖
餅圖繪制
代碼資源下載(直接運行)
資源大放送!
每文一語
項目開展
創作的靈感來源于生活!沒有什么項目是空穴來風的,一切的實際操作都是為了解決我們的日常需要,畢竟這個社會是實用主義居多,我們要前進就需要學習,我比較喜歡CSDN上的一位博主,曾經說過這樣一句話:我為了學習,需要不斷的輸入,當我學到了東西,就立馬輸出為自己的作品,這就是有效學習,我覺得非常有道理。
數據挖掘
有人說爬蟲寫起來沒有思路,沒有框架,其實是沒有真正的理解到爬蟲的內涵,爬蟲最重要的幾步如下:
分析網頁、解析網頁、抓取數據、數據存儲
導入第三方庫
from selenium import webdriver import pandas as pd from itertools import zip_longest import time import random import os分析網頁
本期我們要抓取的是知網頁面的論文信息,相信大家在視頻里面就已經看過了,第一步我們需要找到我的知網頁面,我們知道知網反爬措施比較的嚴格,我們需要利用Python的自動化模塊進行抓取,同時我們需要加入偽裝頭,需要延時請求頁面,當然如果你要做比較大的項目更需要圖像識別功能,繞開我們驗證碼阻礙。
在項目的演示視頻中,我們首先需要輸入我們的關鍵詞,但是對于我們的瀏覽器,它是如何知道我們輸入的文字呢?這個效果就需要借助我們Python第三方庫:selenium
Selenium語法詳解
Selenium(瀏覽器自動化測試框架)?是一個用于Web應用程序測試的工具。Selenium測試直接運行在瀏覽器中,就像真正的用戶在操作一樣。
Selenium的配置
1、安裝 Selenium模塊:? pip? install? Selenium
2、下載瀏覽器驅動,Selenium3.x調用瀏覽器必須有一個webdriver驅動文件
??? Chrome驅動文件下載:點擊下載chromedrive
??? Firefox 驅動文件下載 :點解下載geckodriver
下載之后,解壓到任意目錄(路徑不要有中文)!!!
Selenium的調用
from selenium import webdriver## 如果是chrome瀏覽器的驅動 driver=webdriver.Chrome("C:\user\chromedriver.exe")##如果是firefox瀏覽器的驅動 driver=webdriver.Firefox(executable_path="C:\user\geckodriver.exe")######如果瀏覽器驅動的目錄加入了環境變量的話## 如果是chrome瀏覽器的驅動 driver=webdriver.Chrome()##如果是firefox瀏覽器的驅動 driver=webdriver.Firefox() opt = webdriver.ChromeOptions() opt.add_experimental_option('excludeSwitches', ['enable-automation']) driver = webdriver.Chrome(options=opt) driver.get('https://www.cnki.net/old/') time.sleep(2)add_experimental_option('excludeSwitches', ['enable-automation'])是開啟開發者模式,可以有效的解決反爬的一些問題
如果看到這里,你可能比較懵,因為你不了解這個模塊的語法和應用,下面詳細的介紹一下
Webdriver模塊的使用
控制瀏覽器操作的一些方法?
| 方法 | 說明 |
| set_window_size() | 設置瀏覽器的大小 |
| back() | 控制瀏覽器后退 |
| forward() | 控制瀏覽器前進 |
| refresh() | 刷新當前頁面 |
| clear() | 清除文本 |
| send_keys (value) | 模擬按鍵輸入 |
| click() | 單擊元素 |
| submit() | 用于提交表單 |
| get_attribute(name) | 獲取元素屬性值 |
| is_displayed() | 設置該元素是否用戶可見 |
| size | 返回元素的尺寸 |
| text | 獲取元素的文本 |
鼠標事件
在 WebDriver 中, 將這些關于鼠標操作的方法封裝在 ActionChains 類提供。
鍵盤事件
Selenium中的Key模塊為我們提供了模擬鍵盤按鍵的方法,那就是send_keys()方法。它不僅可以模擬鍵盤輸入,也可以模擬鍵盤的操作。
常用的鍵盤操作如下:
組合鍵的使用
獲取斷言信息
不管是在做功能測試還是自動化測試,最后一步需要拿實際結果與預期進行比較。這個比較的稱之為斷言。通過我們獲取title 、URL和text等信息進行斷言。
解析網頁
我們可以通過Xpath或者beautifulsoup進行標簽提取
driver.execute_script('window.scrollTo(0,document.body.scrollHeight)') paper_name = driver.find_elements_by_css_selector('a.fz14') author = driver.find_elements_by_css_selector('td.author_flag') source = driver.find_elements_by_css_selector('td.author_flag+td') datetime = driver.find_elements_by_css_selector('td.author_flag+td+td') database = driver.find_elements_by_css_selector('td.author_flag+td+td+td') download = driver.find_elements_by_css_selector('span.downloadCount')定位元素的使用
說么這么多,其實你有可能還是比較的迷茫,下面我們通過一個具體的網頁來了解一下
<html><body><form id="loginForm"><input name="username" type="text" classname="xie" id="key"/><input name="password" type="password" 型號 /><input name="continue" type="submit" value="Login" /><input name="continue" type="button" value="Clear" /></form><a href="http://www.baidu.com">百度一下</a></body> </html>通過id進行定位第一個input框: find_element_by_id("key")
通過name進行定位第一個input框:find_element_by_name("username")
通過classname進行定位第一個input框:find_element_by_class_name("xie")
通過標簽tag進行定位input框:find_element_by_tag_name("input")???
通過完整超鏈接定位a標簽: find_element_by_link_text("百度一下")【推薦使用】
當然我們也可以用xpath進行定位
用絕對路徑進行定位,input[1]代表form下面的第一個input標簽,從1開始, input=input[1] driver.find_elemant_by_xpath("//html/body/form/input[1]")用相對路徑進行定位,form標簽下的第一個input標簽,[1]省略了 driver.find_element_by_xpath("//form/input")用相對路徑和屬性進行定位,form標簽下的input標簽的name值等于username的標簽 driver.find_element_by_xpath("//form/input[@name='username']")其他的屬性值如果太長,也可以采取模糊方法定位 例如頁面中有這么一個標簽 <a href="http://www.baidu.com?name=admin&passwd=pass&action=login">百度一下</a> 則可以這么使用 driver.find_element_by_xpath("//a[contains(@href,'login')]")對于這個里面的語法,我們這里只是簡單的了解一下,至于如何深入的去了解這個,還是要去官方的站點看看
抓取數據
for k, v, m, n, q, w in zip_longest(paper_name, author, source, datetime, database, download, fillvalue=0):if w == 0:df.append([k.text, v.text, m.text, n.text, q.text, w])else:df.append([k.text, v.text, m.text, n.text, q.text, w.text])# print(df)print('第{}頁爬取完畢'.format(page))driver.find_element_by_link_text('下一頁').click()time.sleep(random.randint(2, 5))這里我們的w是0,我們第一次就不會獲取w的屬性文本值,這樣就可以極大的獲取到我們有效數據,除此之外,我們使用列表存儲,這里利用到Python的迭代庫里面的語法。
然后自動化的找到“下一頁”的這個標簽,之后利用click點擊,達到效果
解析zip函數和zip_longest函數
學習就是在發現問題之后,要去學習,不然永遠只會停留在我們的最初水平
zip:用來使列表一一對應,該函數返回一個以元組為元素的列表。返回的列表長度為最短列表的長度
letter = ['a', 'b', 'c', 'd'] dd = list(zip(letter)) print(dd)輸出結果: [('a',), ('b',), ('c',), ('d',)] letter = ['a', 'b', 'c', 'd'] num = [1, 2, 3] dd = list(zip(letter, num)) print(dd)輸出結果: [('a', 1), ('b', 2), ('c', 3)] letter = ['a', 'b', 'c', 'd'] num = [1, 2, 3] name = ['daicy', 'zhangsan']dd = list(zip(letter, num, name)) print(dd) 輸出結果: [('a', 1, 'daicy'), ('b', 2, 'zhangsan')]zip_longest具體可以用來對列表的一一對應,如果列表的長度不一致,則其會選擇最長的那個列表,并將沒有的填充為None(這個可以自己傳參時設置)
letter = ['a', 'b', 'c', 'd'] num = [1, 2, 3] name = ['daicy', 'zhangsan'] dic =[ll for ll in zip_longest(letter, num, name)] print(dic) 輸出結果: [('a', 1, 'daicy'), ('b', 2, 'zhangsan'), ('c', 3, None), ('d', None, None)]我們繼續開始下一步的學習
存儲數據
inf = pd.DataFrame(data, columns=['論文名', '作者', '來源', '發表日期', '數據庫', '下載次數'])# inf.to_csv('paper_information.csv',index=False,encoding='UTF-8')outputpath = ('E:\\個人文件\\Python\\Python源碼\\基礎項目\\知網科研\\{}.csv'.format(gjc)) #填寫你要保存的路徑inf.to_csv(outputpath, sep=',', index=False, header=True, encoding='UTF-8')這里比較的簡單了,我們通過pands的方法dataframe對我們的數據進行存儲到CSV文件里面,我們首先對標簽進行的重述,然后有路徑的描述,最后設置我們的編碼,達到我們的存儲效果。
數據挖掘總結
數據挖掘到這里我們結束了,我們來理一下項目思路,首先我們回到知網爬取是比較的費工夫的,首先我們選擇的是,自動化模塊來解決,雖然在效率上有一點的不堪重任,但是對于我們初學者來說,還是比較的友好了,當然我們迫切需要數據的小白,也可以理解,最后我們利用里面的一些方法來模擬我們人工對瀏覽器發生的行為,這樣可以極大的解決我們的反爬,達到我們的最終效果。
數據準備好了,這就結束了嗎,可不是的,我們要從數據里面發掘有效地信息,最終用到我們的研究中去,這就需要我們有足夠的的數據分析思維。
數據分析
詞云圖
import pandas as pd # 導入pyecharts可視化庫,詞云渲染效果極佳 from pyecharts import options as opts from pyecharts.charts import WordCloud from pyecharts.globals import SymbolType import jieba # jieba用于分詞,中文字典及其強大這里我們選取我們jieba庫,它是一個非常強大的中文分詞庫,此外我們用詞云展示的是pyecharts這個庫,這個庫是我自己比較喜歡的可視化第三方庫之一。因為強大,所以喜愛!
分詞思路
我們首先知道我們分詞的意義,我們的jieba只會把我們的詞語分成我們的一些中文詞組,有一些四字詞語,三個字,兩個字,一個字的,所以我自創了一種分詞程序,適用多種場景的分詞,我們可以根據我們的具體需要對其進行選擇,部分代碼如下:
a = ','.join(df['論文名'].to_list())b = jieba.lcut(a) # 分詞之后,把值儲存到b這個變量for x in b: # 遍歷b這個,去除里面的特殊字符if x in ",。、;:‘’“”【】《》?、.!…研究 大數據 基于 研究 分析 思考 展望 技術 應用 時代\n":continueelse: # 分別分出有意義的詞組,因為對于一個詞的,分析沒有太大的意義if len(x) == 1: # 根據中文詞組的特點,我們只需要得到2,3,4的詞組即可,就可以達到分析目的ll.append(x) # 存儲1詞組變量elif len(x) == 2:lg.append(x) # 存儲2詞組變量elif len(x) == 3:lk.append(x) # 存儲3詞組變量elif len(x) == 4:lj.append(x) # 存儲4詞組變量大數據一詞組
大數據二詞組
大數據三詞組
大數據四詞組
我們這里通過不同的功能按鈕,選出不同的詞云圖
餅圖繪制
def plot_pie(df, groupby_name, groupby_sum_name, labels_name, fraces_name):df_group = df.groupby(groupby_name)[groupby_sum_name].sum().reset_index()labels = df_group[labels_name].to_list()fraces = df_group[fraces_name].to_list()colors = cm.rainbow(np.arange(len(labels))/len(labels))explode = []for i in range(len(labels)):explode = explode + [0.1]plt.axes(aspect=1)plt.pie(x=fraces, labels= labels, autopct='%1.1f%%', colors=colors, explode= explode, shadow=True)plt.show()代碼資源下載(直接運行)
資源大放送!
本期的文章到這里就結束了,喜歡的小伙伴歡迎評論區留言,贈送爬蟲知識案例大禮包
留言格式:481255662@qq.com
每文一語
懂得拒絕,適度自私,才是最智慧的表現
總結
以上是生活随笔為你收集整理的还在熬夜干论文——Python带你一键起飞!【内附演示视频】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: access/sql server笔记(
- 下一篇: 〖Python WEB 自动化测试实战篇