综述
本博客参考多人博客综合的方法,写于2019.12.19,随后可能会由于网站结构的变化和反爬机制而导致代码思路需要修改和优化。
淘宝的网站(https://www.taobao.com/)经历了多年的变化,如今越来越难以爬取。采用selenium库模拟登陆的朋友们会发现,无论如何都通过不了滑块验证(淘宝登陆界面能识别selenium库的自动化登陆),因此本文采用的是选择微博登陆而绕过该反爬机制,但是微博登陆会遇到图片验证码,本人采用多次pytesseract(图片识别的库)发现无法准确识别,因此建议不要采用该方法。最终成功登陆,以下是具体代码流程。
所需库
所需安装库为selenium,具体安装方法请自行百度。
#所需库
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
import time;
模拟打开淘宝网页
此时我们通过selenium.webdriver模拟进入淘宝网页
#模拟打开淘宝网页
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-automation'])
driver = webdriver.Chrome(chrome_options=options)
driver.maximize_window()
driver.get('https://login.taobao.com/member/login.jhtml')
time.sleep(1)
driver.find_element_by_link_text('密码登录').click()
time.sleep(2.8)
此时我们会登陆该界面,如图所示:
绕到微博登陆网页
此时我们进入微博页面,注意修改源代码成你的微博用户名和密码。
#进入微博密码和用户名输入
driver.find_element_by_id('J_OtherLogin').find_elements_by_tag_name('a')[0].click()
time.sleep(2.1)
driver.find_element_by_name('username').send_keys('请输入你的微博用户名')
time.sleep(1.2)
driver.find_element_by_name('password').send_keys('请输入你的微博密码')
time.sleep(2.4)
此时会要求输入验证码
#自行手动输入验证码/其实就输入一次就行
a_1=input("Y/N=")
driver.find_element_by_name('password').send_keys(Keys.ENTER)
time.sleep(10)
手动输入验证码:BDE6M
输入完成后不要直接点登陆,需要在python界面随便敲入一个字符,接着运行之后的搜索功能。
此时会要求输入验证码
进入界面后,直接采用检索式检索,大家可以修改“美食”为任何想要搜索的内容,注意encode和decode的用法。该段代码主要定位了搜索框并进行赋值。其中涉及知识点:
CSS_SELECTOR定位:https://blog.csdn.net/hou_angela/article/details/80519718
Wait.until(等待三种类型:暴力,隐形和显性):
https://blog.csdn.net/hk_john/article/details/78270684
def search():
try:
search_input = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, '#q'))
)
search_submit = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, '#J_TSearchForm > div.search-button > button'))
)
finally:
pass
search_input.send_keys('美食'.encode('utf-8').decode('utf-8'))
search_submit.click()
wait = WebDriverWait(driver, 10)
search()
最后就进入了淘宝页面且搜索了关键词,之后就有足够的想象空间去爬取想要的内容!
完整代码
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
import time
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-automation'])
driver = webdriver.Chrome(chrome_options=options)
driver.maximize_window()
driver.get('https://login.taobao.com/member/login.jhtml')
time.sleep(1)
driver.find_element_by_link_text('密码登录').click()
time.sleep(2.8)
driver.find_element_by_id('J_OtherLogin').find_elements_by_tag_name('a')[0].click()
time.sleep(2.1)
driver.find_element_by_name('username').send_keys('15958121194')
time.sleep(1.2)
driver.find_element_by_name('password').send_keys('weibo2017')
time.sleep(2.4)
a_1=input("Y/N=")
driver.find_element_by_name('password').send_keys(Keys.ENTER)
time.sleep(10) # 停留一下看看登录后的页面
#继续做想做的事....
def search():
try:
search_input = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, '#q'))
)
search_submit = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, '#J_TSearchForm > div.search-button > button'))
)
finally:
pass
search_input.send_keys('美食'.encode('utf-8').decode('utf-8'))
search_submit.click()
wait = WebDriverWait(driver, 10)
search()
如果有感兴趣可以接着讨论,加我微信1730814337。