Selenium实战-模拟登录淘宝并爬取商品信息_使用selenium模拟真实登录行为,并爬取商品评论数据。

模拟淘宝登录

def login_taobao():
print(‘开始登录…’)
try:
login_url=‘https://login.taobao.com/member/login.jhtml’
driver.get(login_url)
input_login_id = wait.until(EC.presence_of_element_located((By.ID, ‘fm-login-id’)))
input_login_password = wait.until(EC.presence_of_element_located((By.ID, ‘fm-login-password’)))
input_login_id.send_keys(‘your account’) # 用你自己的淘宝账号替换
input_login_password.send_keys(‘your password’) # 用你自己的密码替换
submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, ‘.fm-button.fm-submit.password-login’)))
submit.click()
is_loging = wait.until(EC.url_changes(login_url))
return is_loging
except TimeoutException:
print(‘login_taobao TimeoutException’)
submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, ‘.fm-button.fm-submit’)))
submit.click()
is_loging = wait.until(EC.url_changes(login_url))
if is_loging:
return is_loging
else:
login_taobao()

if name == ‘__main__’:
is_loging=login_taobao()
if is_loging:
print(‘已经登录’)


运行代码后可以看到程序自动的调起了一个Chrome浏览器并访问了淘宝的登录页面,自动的输入了用户淘宝账号和密码,自动的点击了登录按钮,但出现了一个滑动验证的控件,要求滑动验证。  
 ![淘宝登录需要滑动验证](https://img-blog.csdnimg.cn/direct/38fbcda2269749349039efee7cebfb63.png#pic_center)


人工拖动滑动验证控件,显示验证失败。  
 ![淘宝滑动验证失败](https://img-blog.csdnimg.cn/direct/9bbe35242f9b4d5a8b2db53ffef9e85b.png#pic_center)


这是因为淘宝有一套反爬机制识别是否是机器自动在登录。如果是人工打开浏览器,手工输入账号密码登录就不会弹出滑动验证控件进行验证。在网上有很多办法,如可以通过代理修改chormdriver的识别码,这里介绍通过Selenium如何接管已经运行的Chrome浏览器来实现规避淘宝的验证。


#### 3、Selenium接管已经运行的Chrome浏览器


##### 1)启动Chrome的远程调试模式


通过  
 `chrome.exe --remote-debugging-port=9222 --user-data-dir='某个存在的文件夹地址'` 启动Chrome的远程调试模式,启动一个Chrome浏览器。  
 找到chrome的安装目录,找到chrome.exe ,通过cmd命令行执行上面的命令。  
 ![启动Chrome远程调试模式](https://img-blog.csdnimg.cn/direct/5b86f9216d7f4540ab3fa6639f32416c.png#pic_center)


运行上面命令后,就会弹出一个chrome浏览器,这个浏览器是可以被Selenium来接管操作的。


##### 2)代码中实现接管已经运行的Chrome浏览器



from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.common import TimeoutException

chrome_options = Options()
chrome_options.add_experimental_option(“debuggerAddress”, “localhost:9222”) #此处端口保持和命令行启动的端口一致
driver = Chrome(options=chrome_options)
wait = WebDriverWait(driver, 10)

模拟淘宝登录

def login_taobao():
print(‘开始登录…’)
try:
login_url=‘https://login.taobao.com/member/login.jhtml’
driver.get(login_url)
input_login_id = wait.until(EC.presence_of_element_located((By.ID, ‘fm-login-id’)))
input_login_password = wait.until(EC.presence_of_element_located((By.ID, ‘fm-login-password’)))
input_login_id.send_keys(‘your account’) # 用你自己的淘宝账号替换
input_login_password.send_keys(‘your password’) # 用你自己的密码替换
submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, ‘.fm-button.fm-submit.password-login’)))
submit.click()
is_loging = wait.until(EC.url_changes(login_url))
return is_loging
except TimeoutException:
print(‘login_taobao TimeoutException’)
submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, ‘.fm-button.fm-submit’)))
submit.click()
is_loging = wait.until(EC.url_changes(login_url))
if is_loging:
return is_loging
else:
login_taobao()

if name == ‘__main__’:
is_loging=login_taobao()
if is_loging:
print(‘已经登录’)


#### 4、运行效果


运行上述代码就可以看到,Selenium接管了这个通过Chrome的远程调试模式启动的浏览器,并自动输入用户名和密码,自动登录成功,跳转到我的淘宝界面。  
 ![自动登录到我的淘宝](https://img-blog.csdnimg.cn/direct/1d8d285569614592a9fab5c9e9f058ff.png#pic_center)


### 二、通过Selenium自动爬取淘宝商品信息


#### 1、分析商品页面


https://s.taobao.com/search?page=1&q=ipad&tab=all  
 通过Chrome浏览器输入淘宝搜索商品页面链接F12打开开发者工具,分析淘宝搜索商品列表页的源代码,找到商品展示相关源代码包括商品的title、价格、详情页、购买情况等。我们需要通过解析这些源代码获取相应的商品信息。  
 ![分析商品页面](https://img-blog.csdnimg.cn/direct/1be24e32ceb74a438dac99cc6dc6b9af.png#pic_center)


找到下一页翻页的按钮,我们需要控制下一页翻页的按钮来实现自动翻页。  
 ![分析淘宝下一页](https://img-blog.csdnimg.cn/direct/ff455118566f43d0bffdcc0224ba70a0.png#pic_center)


#### 2、实现商品获取代码



解析获取商品信息

def get_products():
“”“提取商品数据”“”
html = driver.page_source
doc = pq(html)
items = doc(‘.Card–doubleCardWrapper–L2XFE73’).items()
for item in items:
product = {‘url’: item.attr(‘href’),
‘price’: item.find(‘.Price–priceInt–ZlsSi_M’).text(),
‘realsales’: item.find(‘.Price–realSales–FhTZc7U-cnt’).text(),
‘title’: item.find(‘.Title–title–jCOPvpf’).text(),
‘shop’: item.find(‘.ShopInfo–TextAndPic–yH0AZfx’).text(),
‘location’: item.find(‘.Price–procity–_7Vt3mX’).text()}
print(product)

自动获取商品信息并自动翻页

def index_page(url,cur_page,max_page):
print(’ 正在爬取:‘+url)
try:
driver.get(url)
get_products()
next_page_btn = wait.until(EC.element_to_be_clickable((By.XPATH, ‘//button/span[contains(text(),“下一页”)]’)))
next_page_btn.click()
do_change = wait.until(EC.url_changes(url))
if do_change and cur_page<max_page:
new_url=driver.current_url
cur_page = cur_page + 1
index_page(new_url,cur_page,max_page)
except TimeoutException:
print(’—index_page TimeoutException—')


#### 3、实现效果


从浏览器看,Selenium自动访问淘宝登录页,当切到用户名密码登录界面时,Selenium自动输入用户名、密码点击登录。登录成功后,自动访问商品搜索页搜索ipad,进行商信息获取,自动翻下一页。  
 从后台打印的日志看,显示“开始登录”、“已经登录”,正在爬取的链接和该链接下的商品信息。  
 ![Selenium后台日志](https://img-blog.csdnimg.cn/direct/f92bec0162d745e3a71a29069780ae16.png#pic_center)


至此,通过Selenium来代码实现模拟登录淘宝并自动爬取商品信息,进行了Selenium的实战。  
 要注意的是:



> 
> 1、在Selenium打开登录页面后淘宝默认的是扫码登录,需要人为接入切换用户密码模式。这时也可以让Selenium自动去切到用户密码模式登录。代码如下:  
>  change\_type=wait.until(EC.presence\_of\_element\_located((By.CSS\_SELECTOR, ‘.iconfont.icon-password’)))  
>  change\_type.click() #切换到用户密码模式登录  
>  2、在运行启动Chrome的远程调试模式,启动Chrome浏览器后,要关闭其他的Chrome浏览器,保留远程调试模式启动的浏览器就好了。如果是存在多个Chrome浏览器Selenium会不知道要接管哪一个。
> 
> 
> 


### 附上全部完整代码:



from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.common import TimeoutException
from urllib.parse import quote
from pyquery import PyQuery as pq

chrome_options = Options()
chrome_options.add_experimental_option(“debuggerAddress”, “localhost:9222”) #此处端口保持和命令行启动的端口一致
driver = Chrome(options=chrome_options)
wait = WebDriverWait(driver, 10)

模拟淘宝登录

def login_taobao():
print(‘开始登录…’)
try:
login_url=‘https://login.taobao.com/member/login.jhtml’
driver.get(login_url)
change_type=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ‘.iconfont.icon-password’)))
change_type.click() #切换到用户密码模式登录
input_login_id = wait.until(EC.presence_of_element_located((By.ID, ‘fm-login-id’)))
input_login_password = wait.until(EC.presence_of_element_located((By.ID, ‘fm-login-password’)))
input_login_id.send_keys(‘your account’) # 用你自己的淘宝账号替换
input_login_password.send_keys(‘your password’) # 用你自己的密码替换
submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, ‘.fm-button.fm-submit.password-login’)))
submit.click()
is_loging = wait.until(EC.url_changes(login_url))
return is_loging
except TimeoutException:
print(‘login_taobao TimeoutException’)
submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, ‘.fm-button.fm-submit’)))
submit.click()
is_loging = wait.until(EC.url_changes(login_url))
if is_loging:
return is_loging
else:
login_taobao()

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)

blog.csdnimg.cn/img_convert/9f49b566129f47b8a67243c1008edf79.png)

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)

img
  • 17
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值