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