一、問題
本次利用selenium自動化測試,完成對淘寶的爬取,這樣可以避免一些反爬的措施,也是一種爬蟲常用的手段。本次實戰的難點:
1.如何利用selenium繞過淘寶的登錄界面
2.獲取淘寶的頁面內容實現翻頁,並判斷是否翻頁成功。
3.獲取每一頁的信息,實現數據的抓取工作。
4.環境python3.6,對應的Chrome的webdriver驅動網址:http://chromedriver.storage.googleapis.com/index.html,將自己對應的webdriver放入scripts的環境內。
二、解決
1.在登錄淘寶界面的時候,會彈出界面窗口,需要捕捉當前的頁面,判斷是否有變化。
先用self.browser【驅動名稱】.current_window_handle來捕獲當前的界面信息。
用self.browser【驅動名稱】.switch_to_window(now_handle),來進行頁面變化的判斷
self.browser.get(self.url) input_content = self.wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, '#q')) ) submit = self.wait.until( EC.element_to_be_clickable((By.CSS_SELECTOR, "#J_TSearchForm > div.search-button > button")) ) now_handle = self.browser.current_window_handle input_content.send_keys(self.key) submit.click() self.browser.switch_to_window(now_handle)
2.在當前頁碼的判斷,確定是否翻頁成功。
獲取輸入標簽的值,和點擊按鈕,完成翻頁動作,再用EC.text_to_be_present_in_element來檢測是否完成了翻頁的動作。
print("正在翻第{0}頁".format(number)) input_content = self.wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > input')) ) submit = self.wait.until( EC.element_to_be_clickable((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit")) ) input_content.clear() input_content.send_keys(number) submit.click() self.wait.until( EC.text_to_be_present_in_element((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > ul > li.item.active > span'), str(number)) ) self.get_content()
3.利用選擇器獲取整個頁面的內容:
利用xpath進行解析,也可以利用pyquery等一系列的解析方式進行解析。
self.wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-itemlist > div > div > div:nth-child(1)')) ) html = self.browser.page_source content_text = etree.HTML(html) names = content_text.xpath('*//div[@class="pic"]/a/img/@alt') srcs = content_text.xpath('*//div[@class="pic"]/a/img/@data-src') totals = [(name, src) for (name, src) in zip(names, srcs)]
三、結果呈現
四、總結
本項目利用了selenium來完成數據的自動爬取,需要注意獲取的數據元素,以及數據信息。
重點在於彈出頁面的判斷以及對翻頁成功的判斷,其余的內容就是一般的數據爬取的方式。淘寶實戰需要對webdriver有一定的基礎和了解。才可以正確獲取到標簽內容。
webdriver的參考文檔:
https://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.common.action_chains