2024年-Python爬蟲學(xué)習(xí)課件_第1頁
2024年-Python爬蟲學(xué)習(xí)課件_第2頁
2024年-Python爬蟲學(xué)習(xí)課件_第3頁
2024年-Python爬蟲學(xué)習(xí)課件_第4頁
2024年-Python爬蟲學(xué)習(xí)課件_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

使用Python編寫網(wǎng)絡(luò)爬蟲12024/5/15什么是網(wǎng)絡(luò)爬蟲網(wǎng)頁結(jié)構(gòu)準(zhǔn)備工作使用requests庫獲取網(wǎng)頁源代碼使用正則表達(dá)式實現(xiàn)翻頁功能使用Xpath進(jìn)行頁面定位使用chromedriver進(jìn)行模擬瀏覽器操作百度貼吧爬蟲進(jìn)階實例使用chromedriver爬取微信公眾號文章總結(jié)22024/5/15什么是網(wǎng)絡(luò)爬蟲網(wǎng)絡(luò)爬蟲(WebSpider),是一種按照一定的規(guī)則,自動地抓取萬維網(wǎng)信息的程序或者腳本。它可以通過程序設(shè)計來獲取指定網(wǎng)頁中的指定信息,如百度貼吧的帖子信息,新聞網(wǎng)站的新聞文章等等。獲取到的數(shù)據(jù)多用于大數(shù)據(jù)分析場景,因此編寫網(wǎng)絡(luò)爬蟲是從事大數(shù)據(jù)分析行業(yè)的必備技能之一。32024/5/15網(wǎng)頁結(jié)構(gòu)在編寫網(wǎng)絡(luò)爬蟲之前,首先要對網(wǎng)頁結(jié)構(gòu)有一定的了解。大多數(shù)網(wǎng)頁使用HTML(超文本標(biāo)記語言)進(jìn)行編寫,通過獲取網(wǎng)頁源代碼,我們就可以看到這個頁面的HTML信息。下面以Chrome瀏覽器為例,介紹查看網(wǎng)頁源代碼的方法:

如圖所示,打開一個網(wǎng)頁,右鍵單擊空白處,在右鍵菜單中有一個查看源代碼選項,通過點擊查看源代碼,我們就可以看到這個頁面的HTML代碼。42024/5/15網(wǎng)頁結(jié)構(gòu)瀏覽器會在新打開的標(biāo)簽頁中顯示該網(wǎng)頁的源代碼,此時我們就會發(fā)現(xiàn),比如我們想要獲取這個頁面所有帖子的題目,都可以在網(wǎng)頁源代碼中找到。而網(wǎng)絡(luò)爬蟲的主要工作原理,就是在網(wǎng)頁源代碼中把我們想要的內(nèi)容抽取出來。HTML語言中是通過不同的標(biāo)簽來編寫網(wǎng)頁的,不同的標(biāo)簽對應(yīng)著網(wǎng)頁中不同的元素,有些標(biāo)簽之間可以嵌套,有些標(biāo)簽通過class屬性來指定自己的類別,有些標(biāo)簽通過id屬性來唯一標(biāo)示自己,常用的有:<div>標(biāo)簽,用來標(biāo)定一塊區(qū)域;<p>標(biāo)簽,用于顯示一段文字;<h1><h2><h3>等標(biāo)簽,用于顯示一個標(biāo)題;<a>標(biāo)簽,用于放置一個鏈接。了解了這些,就可以開始制作我們的網(wǎng)頁爬蟲了。下面的內(nèi)容將通過百度貼吧爬蟲的實例進(jìn)行同步講解。52024/5/15requests庫requests的最大優(yōu)點是程序編寫過程更接近正常URL訪問過程。requests庫是一個簡潔且簡單的處理HTTP請求的第三方庫。request庫支持非常豐富的鏈接訪問功能,包括:國際域名和URL獲取、HTTP長連接和連接緩存、HTTP會話和Cookie保持、瀏覽器使用風(fēng)格的SSL驗證、基本的摘要認(rèn)證、有效的鍵值對Cookie記錄、自動解壓縮、自動內(nèi)容解碼、文件分塊上傳、HTTP(S)代理功能、連接超時處理、流數(shù)據(jù)下載等。有關(guān)requests庫的更多介紹請訪問:http://docs.python‐62024/5/15requests庫中的網(wǎng)頁請求函數(shù)72024/5/15lxml庫、selenium庫、re庫BeautifulSoup和Lxml是兩個非常流行的python模塊,他們常被用來對抓取到的網(wǎng)頁進(jìn)行解析,以便進(jìn)一步抓取的進(jìn)行。selenium可以模擬真實瀏覽器,自動化測試工具,支持多種瀏覽器,爬蟲中主要用來解決JavaScript渲染問題。re庫:正則表達(dá)式(通項公式)是用來簡潔表達(dá)一組字符串的表達(dá)式。字符串匹配。82024/5/15準(zhǔn)備工作使用Python制作網(wǎng)頁爬蟲,需要預(yù)先安裝requests庫、lxml庫、selenium庫,re庫,并下載chromedriver.exe。安裝方法:1)找到Python的安裝目錄。2)進(jìn)入Scripts文件夾。3)按住鍵盤Shift鍵右鍵文件夾空白處,選擇“在此處打開命令窗口”。92024/5/15安裝方法:4)在命令窗口中輸入:pip3installrequests,然后等待安裝完成提示。5)requests庫安裝完成后,再輸入:pip3installlxml,等待安裝完成。6)lxml庫安裝完成后,再輸入:pip3installselenium,等待安裝完成。7)re庫為正則表達(dá)式庫,一般Python中自帶,若程序運行時提示沒有re庫,則以同樣的方法在命令窗口中輸入:pip3installre,即可完成安裝。準(zhǔn)備工作102024/5/15準(zhǔn)備工作安裝方法:8)打開網(wǎng)頁/mirrors/chromedriver/2.9/選擇chromedriver_win32.zip進(jìn)行下載,下載完成后解壓出chromedriver.exe文件。和python源文件放到一個文件夾下112024/5/15準(zhǔn)備工作在建立好的myspider.py文件中,首先將我們需要用到的庫導(dǎo)入,代碼如下:importrequests

importre

fromlxmlimportetree其中,fromlxmlimportetree表示在lxml庫中單獨導(dǎo)入etree部分功能,etree將用于后面使用Xpath進(jìn)行定位的功能。至此,準(zhǔn)備工作完成。122024/5/15使用requests庫獲取網(wǎng)頁源代碼在編寫網(wǎng)頁爬蟲時,需要制定一個url作為爬取的起始點,首先,我們進(jìn)入中國石油大學(xué)的百度貼吧,為了后面方便實現(xiàn)翻頁功能,我們點擊下一頁進(jìn)入貼吧的第二頁,然后復(fù)制地址欄中的url:/f?kw=%E4%B8%AD%E5%9B%BD%E7%9F%B3%E6%B2%B9%E5%A4%A7%E5%AD%A6&ie=utf-8&pn=50在myspider.py文件中,創(chuàng)建一個變量名為url,并把復(fù)制的url賦值給這個變量。然后創(chuàng)建一個變量名為html,將獲取到的網(wǎng)頁源代碼保存在這個變量中,通過輸出html.text就可以查看到我們所獲取到的網(wǎng)頁源代碼。url

='/f?kw=%E4%B8%AD%E5%9B%BD%E7%9F%B3%E6%B2%B9%E5%A4%A7%E5%AD%A6&ie=utf-8&pn=50’html=requests.get(url)

print(html.text)

132024/5/15使用正則表達(dá)式實現(xiàn)翻頁功能正則表達(dá)式是使用一些列特定的符號來表示字符串的一種表達(dá)式,正則表達(dá)式通常被用來檢索、替換那些符合某個模式(規(guī)則)的文本。接下來將結(jié)合實例來演示正則表達(dá)式的作用以及使用方法。首先我們來分析我們復(fù)制的url,在url末尾,我們可以看到&pn=50字段,通過在網(wǎng)頁中點擊下一頁就可以發(fā)現(xiàn),&pn的數(shù)值為當(dāng)前頁面數(shù)減去1再乘以50,如第5頁時url中&pn=200,除了&pn的值,其它的內(nèi)容完全不變。當(dāng)我們在地址欄中修改&pn的值為0時,按下回車,就會發(fā)現(xiàn)跳轉(zhuǎn)到了中國石油大學(xué)貼吧的第一頁。因此,我們可以通過修改&pn的值來實現(xiàn)翻頁功能,即獲取每一頁的網(wǎng)頁源代碼。142024/5/15使用正則表達(dá)式實現(xiàn)翻頁功能fori

inrange(10):

new_url

=re.sub('&pn=\d+','&pn=%d'

%(i*50),url)

print(new_url) html=requests.get(new_url)

re.sub()用于替換字符串中的匹配項。第一個參數(shù)為正則表達(dá)式,&pn=\d+表示獲取文本中’&pn=’字段后面的多個數(shù)字部分,’\d’表示一個數(shù)字字符,加號表示連續(xù)出現(xiàn)多次;第二個參數(shù)表示將文本中’&pn=’字段后面數(shù)字的值替換成i*50;第三個參數(shù)表示把url變量中的文本作為處理文本。通過輸出new_url,我們就可以看到貼吧中第1頁到第10頁的url了,可以通過設(shè)置range的范圍來獲取更多頁數(shù)的url。獲取到每一頁的url后,我們就可以再次使用requests.get()方法來獲取網(wǎng)頁源代碼了。152024/5/15使用Xpath進(jìn)行頁面定位Xpath是一種針對xml文本的快速標(biāo)記語言,就像現(xiàn)實生活中描述家庭地址一樣,精準(zhǔn)高效,通過Xpath我們可以快速在網(wǎng)頁源代碼中找到我們想要的所有內(nèi)容。這里我們欲獲取貼吧中每一頁的帖子標(biāo)題,我們首先使用檢查的方法分析網(wǎng)頁源代碼。右鍵網(wǎng)頁的空白處,選擇“檢查”。162024/5/15使用Xpath進(jìn)行頁面定位然后就可以打開開發(fā)者工具,如圖所示。172024/5/15使用Xpath進(jìn)行頁面定位通過點開每一層標(biāo)簽以及鼠標(biāo)在代碼上的移動,左側(cè)對應(yīng)的部分會用藍(lán)底顯示,最終我們找到第二個帖子(第一個帖子是置頂貼,我們不予考慮)標(biāo)題所在的位置。182024/5/15使用Xpath進(jìn)行頁面定位通過分析我們可以看到,每個帖子的題目內(nèi)容在<a>標(biāo)簽中,而<a>標(biāo)簽的上層為一個class屬性為“threadlist_titlepull_leftj_th_tit”的<div>標(biāo)簽中,因此,我們只要找到所有class屬性等于“threadlist_titlepull_leftj_th_tit”的<div>標(biāo)簽下的<a>標(biāo)簽的文字內(nèi)容即可。我們定義一個xpath變量,并賦值。注意threadlist_titlepull_leftj_th_tit末尾有一個空格。192024/5/15使用Xpath進(jìn)行頁面定位xpath

='//*[@class="threadlist_title

pull_left

j_th_tit"]/a/text()’pages=etree.HTML(html.content)

title=pages.xpath(xpath)

//*表示xpath表達(dá)式的開始,[@class=”threadlist_titlepull_leftj_th_tit”]表示求class屬性等于“threadlist_titlepull_leftj_th_tit”的標(biāo)簽,/a表示該標(biāo)簽下的<a>標(biāo)簽,/text()表示獲取<a>標(biāo)簽的文本信息。然后我們將獲取到的網(wǎng)頁源代碼轉(zhuǎn)換成etree類型,并且使用xpath進(jìn)行定位。由于一個頁面中有多個標(biāo)題,符合要求的<div>標(biāo)簽也有多個,因此pages.xpath()方法返回值為一個列表保存在title變量中,通過循環(huán)輸出title列表中的內(nèi)容,我們就可以獲取指定頁碼的貼吧中所有的帖子題目。foreachintitle:

print(each)202024/5/15importrequests

importre

fromlxml

importetree

url

='/f?kw=%E4%B8%AD%E5%9B%BD%E7%9F%B3%E6%B2%B9%E5%A4%A7%E5%AD%A6&ie=utf-8&pn=50'

html=requests.get(url)

fori

inrange(0,10):

new_url

=re.sub('&pn=\d+','&pn=%d'%(i*50),url)

html=requests.get(new_url)

xpath

='//*[@class="threadlist_title

pull_left

j_th_tit"]/a/text()'

pages=etree.HTML(html.content)

title=pages.xpath(xpath)

foreachintitle:

print(each)

完整代碼212024/5/15輸出樣例同樣的,我們可以找到其他內(nèi)容的Xpath信息,比如發(fā)帖人,發(fā)帖時間,帖子鏈接等等,這樣就可以使用pages.xpath()方法爬取更多的信息。222024/5/15使用chromedriver模擬瀏覽器操作有些頁面有一些隱藏信息,是動態(tài)加載的,比如單擊頁面上的某一個按鈕才會顯示,這樣的內(nèi)容直接獲取網(wǎng)頁源代碼是無法到隱藏內(nèi)容的源代碼的,因此我們需要使用特殊的方法去模擬點擊事件的發(fā)生,然后再使用Xpath對顯示出來的隱藏內(nèi)容進(jìn)行定位。我們使用chromedriver來實現(xiàn)模擬點擊的功能,chromedriver是一款針對chrome瀏覽器的自動檢測程序,使用chromedriver我們就可以代碼實現(xiàn)對網(wǎng)頁的各種操作,如點擊事件、填寫表單等等。隱藏工具欄232024/5/15使用chromedriver模擬瀏覽器操作selenium

是一套完整的web應(yīng)用程序測試系統(tǒng).

selenium可以模擬真實瀏覽器,自動化測試工具,支持多種瀏覽器,爬蟲中主要用來解決JavaScript渲染問題。SeleniumWebDriver提供了各種語言環(huán)境的API來支持更多控制權(quán)和編寫符合標(biāo)準(zhǔn)軟件開發(fā)實踐的應(yīng)用程序。fromseleniumimportwebdriver

driver=webdriver.Chrome()url='/f?kw=%E4%B8%AD%E5%9B%BD%E7%9F%B3%E6%B2%B9%E5%A4%A7%E5%AD%A6&ie=utf-8&pn=50'

driver.get(url)

此時運行程序,就會發(fā)現(xiàn)系統(tǒng)自動打開chrome瀏覽器,并且打開了中國石油大學(xué)的百度貼吧頁面。

242024/5/15使用chromedriver模擬瀏覽器操作然后我們想跳轉(zhuǎn)到別的貼吧,首先我們找到搜索框的Xpath為‘//*[@id="wd1"]’,然后通過以下代碼實現(xiàn)對搜索框的清空。其中find_element_by_xpath()方法是通過Xpath找到指定頁面元素,并保存在input變量中,使用clear()方法就可以對搜索框內(nèi)容進(jìn)行清空。input=driver.find_element_by_xpath('//*[@id="wd1"]')

input.clear()

然后我們使用下面的代碼進(jìn)入Python貼吧。input.send_keys('Python')

button=driver.find_element_by_xpath('//*[@id="tb_header_search_form"]/span[1]/a')

button.click()

send_keys()方法可以把字符串參數(shù)填寫到搜索框中,button是根據(jù)代碼中的Xpath找到的“進(jìn)入貼吧”按鈕,使用click()方法就可以對該按鈕進(jìn)行一個點擊操作。運行完整代碼,系統(tǒng)將自動打開chrome瀏覽器,并進(jìn)入中國石油大學(xué)百度貼吧,然后清空搜索框,自動輸入Python,然后點擊“進(jìn)入貼吧”,從而進(jìn)入到了Python百度貼吧。252024/5/15百度貼吧進(jìn)階實例本例中將編寫一個網(wǎng)絡(luò)爬蟲,獲取中國石油大學(xué)百度貼吧每一頁的帖子題目,并進(jìn)入帖子頁面,獲取發(fā)帖人ID和帖子內(nèi)容,并且保存在文件中。

部分代碼及注釋如下:foriinrange(0,10):

#根據(jù)正則表達(dá)式和i的值構(gòu)建每一頁的url

new_url=re.sub('&pn=\d+','&pn=%d'%(i*50),url)

#使用get()方法獲取玩野源代碼,并轉(zhuǎn)換成etree結(jié)構(gòu)的數(shù)據(jù)

html=requests.get(new_url)

pages=etree.HTML(html.content)

#每個題目的<a>標(biāo)簽中,href屬性即為帖子頁面的url,通過//@href方法就可以獲取到<a>標(biāo)簽的href屬性值

link_xpath='//*[@class="threadlist_titlepull_leftj_th_tit"]/a//@href’

link=pages.xpath(link_xpath)上述代碼將獲取每個貼吧頁面中帖子題目所指向的鏈接,即<a>標(biāo)簽的href屬性值,保存在link變量中。262024/5/15百度貼吧進(jìn)階實例foreachinlink:

#上面獲取到的<a>標(biāo)簽的href屬性值只有帖子的編號,因此我們要構(gòu)建完整的url才可以訪問

tie_url=''+each

print(tie_url)

#使用get()方法獲取新構(gòu)建的url的網(wǎng)頁源代碼

html=requests.get(tie_url)

pages=etree.HTML(html.text)

#分別找到帖子題目、發(fā)帖人id、帖子內(nèi)容的Xpath

title_xpath='//*[@id="j_core_title_wrap"]/div[2]/h1/text()'

id_xpath='//*[@id="j_p_postlist"]/div/div[2]/ul/li[3]/a/text()'

content_xpath='//*[@id="j_p_postlist"]/div[1]/div[3]/div[1]/cc/div/text()'

title=pages.xpath(title_xpath)

id=pages.xpath(id_xpath)

content=pages.xpath(content_xpath)

#把獲取到的內(nèi)容保存到msg變量中

msg=str(id[0])+''+str(title[0])+''+str(content[0])

print(msg)上個循環(huán)的內(nèi)層循環(huán)272024/5/15百度貼吧進(jìn)階實例需要注意的是,通過pages.xpath()方法返回到的內(nèi)容是保存在列表中的,所以在輸出時要加上下標(biāo)[0]來獲取列表中第一個元素的值。上面代碼中,變量link_xpath的Xpath寫法與title_xpath,id_xpath,content_xpath不同,由于貼吧頁面有多個題目,每個題目的<a>標(biāo)簽的上層<div>標(biāo)簽的class屬性都是相同的,因此我們使用pages.xpath()方法就可以獲取到所有<a>標(biāo)簽中的href屬性,通過循環(huán)就可以對這一頁的所有帖子內(nèi)容進(jìn)行獲取。而進(jìn)入帖子頁面后,我們只爬取1樓的詳細(xì)內(nèi)容,因此title_xpath,id_xpath,content_xpath的寫法就是唯一Xpath寫法,其中div[1]表示上一層標(biāo)簽下的第1個div標(biāo)簽,這里下標(biāo)并不是從0開始。這樣的Xpath寫法在使用pages.xpath()方法時,返回的列表中就只有1條數(shù)據(jù)了,但我們依然要使用下標(biāo)[0]來將其輸出出來。282024/5/15百度貼吧進(jìn)階實例如何獲取一個元素的唯一Xpath,具體過程如下,首先通過檢查的方法找到你要獲取的元素。292024/5/15百度貼吧進(jìn)階實例然后右鍵相應(yīng)的代碼,選擇Copy->CopyXPath就可以復(fù)制指定元素的唯一Xpath,將復(fù)制到的內(nèi)容粘貼到python中,并在后面加上/text(),就可以獲取到這個元素里面的文本內(nèi)容了。而對于像link_xpath這樣返回列表有多個元素的Xpath,一般需要自己根據(jù)網(wǎng)頁結(jié)構(gòu)來手動編寫。302024/5/15使用chromedriver爬取微信公眾號文章312024/5/15使用chromedriver爬取微信公眾號文章

/是一個收錄了大量微信公眾號文章的網(wǎng)站,上面有豐富的輿情數(shù)據(jù)。我們將使用高級搜索的方式,指定公眾號文章的時間范圍,并獲取公眾號文章的題目、發(fā)表時間、公眾號id和文章內(nèi)容。322024/5/15使用chromedriver爬取微信公眾號文章fromseleniumimportwebdriver

#加載chromedriver

driver=webdriver.Chrome()

#進(jìn)入主頁

url='/'

driver.get(url)

#輸入搜索內(nèi)容

input=driver.find_element_by_xpath('//*[@id="query"]')

input.send_keys('中國石油大學(xué)')

#點擊“搜文章”按鈕

button=driver.find_element_by_xpath('//*[@id="searchForm"]/div/input[3]')

button.click()332024/5/15使用chromedriver爬取微信公眾號文章#點擊“搜索工具”按鈕,顯示高級搜索內(nèi)容

search=driver.find_element_by_xpath('//*[@id="tool_show"]/a')

search.click()

#點擊“全部時間”按鈕,打開時間篩選框

time=driver.find_element_by_xpath('//*[@id="time"]')

time.click()

#清空開始時間,并輸入開始時間

start_time=driver.find_element_by_xpath('//*[@id="date_start"]')

start_time.clear()

start_time.send_keys('2017-06-01')

#清空結(jié)束時間,并輸入結(jié)束時間

end_time=driver.find_element_by_xpath('//*[@id="date_end"]')

end_time.clear()

end_time.send_keys('2017-07-01')

#點擊確定按鈕

ok=driver.find_element_by_xpath('//*[@id="time_enter"]')

ok.click()342024/5/15使用chromedriver爬取微信公眾號文章#link_list用于保存每個文章的url鏈接

link_list=list()

#遍歷前10頁的內(nèi)容

forpageinrange(10):

#每一頁有10篇文章

foriinrange(0,9):

try:

#動態(tài)生成文章題目的Xpath

id='//*[@id="sogou_vr_11002601_title_'+str(i)+'"]'

#使用get_attribute()方法獲取href屬性值

title=driver.find_element_by_xpath(id).get_attribute('href')

print(title)

#把獲取到的鏈接保存到link_list中去

link_list.append(title)

except:

continue

#使用“下一頁”按鈕進(jìn)行翻頁

next=driver.find_element_by_xpath('//*[@id="sogou_next"]')

next.click()352024/5/15使用chromedriver爬取微信公眾號文章#打開文件result2.txt,把獲取到的內(nèi)容寫入其中

withopen('result2.txt','w',encoding='utf-8')asresult:

forlinkinlink_list:

try:

#打開文章頁面

driver.get(link)

#獲取元素的文本內(nèi)容,使用.text來獲取

title=driver.find_element_by_xpath('//*[@id="activity-name"]').text

id=driver

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論