目錄
前言
準備
分析(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[@]/div[@]') for li in lis: info = li.find_element_by_xpath('.//div[@]').text price = li.find_element_by_xpath('.//a[@]').get_attribute('trace-price') + '元' deal = li.find_element_by_xpath('.//div[@]').text image = li.find_element_by_xpath('.//div[@]/a/img').get_attribute('src') name = li.find_element_by_xpath('.//div[@]/a/span[2]').text position = li.find_element_by_xpath('.//div[@]/div[@]').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! 還有大牛解答! ```
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/296046.html
標籤:其他
上一篇:訊息中間件RabbitMQ
