1. 程式人生 > 其它 >【Python】完美採集某寶資料,到底A和B哪個是YYDS?(附完整原始碼和視訊教程)

【Python】完美採集某寶資料,到底A和B哪個是YYDS?(附完整原始碼和視訊教程)

目錄

前言

準備

分析(x0)

分析(x1)

分析(x2)

分析(x3)

分析(x4)

總結

我有話說


前言

大家好,我叫善念。不說漂亮話,直接開始今天要採集的目標:某寶資料

今天要採用的方式是selenium自動化工具。

簡單說下selenium的原理——利用網頁元素控制瀏覽器。

準備

安裝selenium模組:

pip install selenium

我採用的是利用selenium控制Chrome瀏覽器,所以咱們需要下載一個selenium與Chrome的橋樑——Chromedriver外掛

下載地址

下載與你當前谷歌瀏覽器版本最相近的Chromedriver

那麼像我的話,下載

​ 即可。

Windows系統需下載32位,其它的自己看著辦。點進去下載win32即可。

那麼如何讓Python與selenium連線起來呢,這裡咱們需要配置一個環境變數,就是把Python與selenium處於同一個目錄:

到此為止,咱們的環境就搭建好了。

分析(x0)

登入篇

談談selenium與requests的區別:

selenium:操控網頁元素,模擬人去控制瀏覽器,放棄與底層協議的互動,控制於客戶端表面(速度慢)

requests:模擬客戶端向伺服器傳送協議請求,處於底層協議的互動。(速度快)

既然是模擬人去控制瀏覽器就好說了,想要採集某個網站第一步是做什麼?

例項化一款需要被控制的瀏覽器,然後開啟該網址:

from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.taobao.com')

然後在輸入框中輸入咱們需要查詢的商品,再點選搜尋即可。

咱們今天重點利用到的為xpath網頁元素定位法,通過xpath語法去定位元素的位置,因為程式不是人,人可以肉眼知道哪裡是輸入框,哪裡是按鈕。而程式需要咱們去告訴它,給它制定位置。

# 輸入Python
driver.find_element_by_id('q').send_keys('
python') # 點選搜尋 driver.find_element_by_class_name('btn-search').click()

定位的方法很多,我這裡兩句程式碼用到的是為id定位和類名定位。

最後在停留在登入介面:

咱們採用掃碼登入。

既然是這樣子做的話,勢必會需要一個時間供給你去登入,有人會採用延遲的方式,但是我不建議這樣做。

因為延遲的時間不一定就能保證你剛好可以登入完,多了時間少了時間對咱們都不友好。少了時間還沒登入上,程式就跑到別的地方去了報錯了。多了時間你也懶得等。

所以在此之前咱們程式加上一行

input('掃碼完成後請按Enter鍵')

這樣子做的話,咱們可以人為的控制時間。最終登入完成。

分析(x1)

資料的提取

登入上去後可以看到很多的商品資訊,咱們要採集的就是......都採集下來吧,什麼圖片、銷量、地址、標題啥的

前面咱們提到了通過元素進行輸入框自動輸入、按鈕點選。那麼現在要做的就是通過元素定位去採集咱們想要的資料。

分析(x2)

通過元素分析我們可以發現,這裡的每一個DIV標籤都儲存了一個商品的資訊,而前面三個class屬性略有不同。應該是他們自費的一個廣告商品吧,排名指定的那種。

簡單分析了一下可以看到第三個商品的圖片地址在img標籤的src中:

然後第47個商品的資訊卻不完善:

可以很清楚地發現這個商品的src的圖片連結是不正常的,是沒有圖片的。

這個是為什麼呢?還記得我前面文章(某音視訊採集)講到過的動態載入、瀑布流嗎?當我們的滑動條往下滑的時候下面的資料才會加載出來,像瀑布一樣地流出來。

所以如果我們想要採集到所有的商品圖片,那麼咱們就需要把這個下滑條往下面拉動 ,如何利用selenium控制這個下滑條往下面拉動呢?

    for x in range(1, 11, 2):

        time.sleep(0.5)
        j = x/10

        js = 'document.documentElement.scrollTop = document.documentElement.scrollHeight * %f' % j
        driver.execute_script(js)

每停頓0.5S的時間,拉動下滑條的十分之三的位置。

登入成功後按一下enter鍵,程式碼就會跳到下拉滑塊的位置,執行下拉。

分析(x3)

資料都加載出來了後,咱們只管採集就好啦。採集的規則利用的是xpath定位法,這裡我不做過多講解。看我程式碼然後自己分析一下。

lis = driver.find_elements_by_xpath('//div[@class="items"]/div[@class="item J_MouserOnverReq  "]')
for li in lis:
    info = li.find_element_by_xpath('.//div[@class="row row-2 title"]').text
    price = li.find_element_by_xpath('.//a[@class="J_ClickStat"]').get_attribute('trace-price') + ''
    deal = li.find_element_by_xpath('.//div[@class="deal-cnt"]').text
    image = li.find_element_by_xpath('.//div[@class="pic"]/a/img').get_attribute('src')
    name = li.find_element_by_xpath('.//div[@class="shop"]/a/span[2]').text
    position = li.find_element_by_xpath('.//div[@class="row row-3 g-clearfix"]/div[@class="location"]').text
    print(info + '|' + price + '|' + deal + '|' + name + '|' + image + '|' + position)

效果:

到此為止咱們第一頁的商品資料已經採集下來了,那麼如何採集所有頁碼的資料呢?

分析(x4)

在採集所有頁碼資料之前咱們先需要考慮的是什麼?是這個商品總共有多少頁吧?也許這個商品三十頁,另一個商品100頁,對不對?

而這個商品總頁碼在哪裡看?

在哪裡看咱們知道了,那麼什麼時候去採集到這個頁碼數呢?是不是當我們登入了之後就可以看到這個頁碼數了呀?那麼咱們登入之後先把頁碼數採集下來!

token = driver.find_element_by_xpath('//*[@id="mainsrp-pager"]/div/div/div/div[1]')
token = token.text
token = int(re.compile('(\d+)').search(token).group(1))

最後就剩下如何進入下一頁了,我經常提到的,看網頁的url是否會發生什麼變化。

url中一堆混亂看不懂?看我以前文章經常給你提到的引數冗餘,看不懂先刪掉,看下第二頁的url:

再看第一頁:

就s這個步長髮生了變化吧,0-44就是說翻一頁步長為44吧,構造下url:

for i in range(token-1):
    url = https://s.taobao.com/search?q={}&s={}'.format('python', 44 * num)

總結

不要覺得莫名其妙就寫總結了,事實上是咱們已經把整個過程分析完了。

思路:進入網站——登入——採集到頁碼數——下拉滑塊條——採集資料——翻頁——下拉滑塊條——採集資料——翻頁......

我有話說

——愛一路艱辛,一路仁至義盡。

文章的話是現寫的,每篇文章我都會說的很細緻,所以花費的時間比較久,一般都是兩個小時以上。每一個贊與評論收藏都是我每天更新的動力。

原創不易,再次謝謝大家的支援。

① 2000多本Python電子書(主流和經典的書籍應該都有了)

② Python標準庫資料(最全中文版)

③ 專案原始碼(四五十個有趣且經典的練手專案及原始碼)

④ Python基礎入門、爬蟲、web開發、大資料分析方面的視訊(適合小白學習)

⑤ Python學習路線圖(告別不入流的學習)

```
當然在學習Python的道路上肯定會困難,沒有好的學習資料,怎麼去學習呢? 
學習Python中有不明白推薦加入交流Q群號:928946953 
群裡有志同道合的小夥伴,互幫互助, 群裡有不錯的視訊學習教程和PDF!
還有大牛解答!
```