selenium + Chrome 模拟浏览器爬淘宝信息
程序员文章站
2022-05-09 21:17:15
...
环境:
ubuntu16.04
python3.5.2
版本 67.0.3396.87(正式版本) (64 位)
chromedriver 2.40
安装所需工具:
- 1 selenium三方库安装
pip install selenium # 安装selenium库
- 2 chromedriver安装
chromedriver官网地址: http://chromedriver.storage.googleapis.com/index.html
选择合适的版本安装,解压,把解压的文件放入/usr/bin/目录下即可:
mv chromedriver /usr/bin/
- python下测试chromedriver:
from selenium import webdriver # 引入驱动对象
driver = webdriver.Chrome() # 生成谷歌浏览器对象
driver.get('http://www.baidu.com') #访问百度
----浏览器会自动打开一个新的页面并访问百度,成功说明安装配置成功.----
分析淘宝页面并执行selenium
python selenium官网地址: http://selenium-python.readthedocs.io/
#coding:utf-8
import re
from bs4 import BeautifulSoup
from selenium.common.exceptions import TimeoutException
from selenium import webdriver
#这几个都是从selenium官网套用的
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 谷歌浏览器驱动对象
browser = webdriver.Chrome()
# selenium和PhantomJS分手了,现在可以用无头浏览器FireFox或者Chrome代替
# browser = webdriver.PhantomJS()
wait = WebDriverWait(browser, 10)
# 打开淘宝页面并输入"美食"
def search():
try:
browser.get('https://www.taobao.com/')
# 等待10秒直到找到輸入框 通過css选择器语法来实现
input_button = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, "#q"))
)
# 等待10秒直到找到搜索按钮 通過css选择器语法来实现
submmit = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, "#J_TSearchForm > div.search-button > button"))
)
# 用send_keys()方法輸入"美食"
input_button.send_keys('美食')
# 用click()方法点击搜索按钮
submmit.click()
# 关键词搜索出来在淘宝中的页数
total = wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.total"))
)
return total.text
# timeout报错 递归调用自己
except TimeoutException:
return search()
# 翻页函数
def next_page(page_number):
try:
# 等待10秒直到找到輸入框 通過css选择器语法来实现
# 淘宝返回页下面的跳转的输入框: 第 [1] 页
input_button = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.form > input"))
)
# 等待10秒直到找到搜索按钮 通過css选择器语法来实现
# 淘宝返回页下面的跳转按钮:第 [1] 页 确认
submmit = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit"))
)
# 清楚内容
input_button.clear()
# 输入跳转页码
input_button.send_keys(page_number)
# 点击跳转
submmit.click()
# 等待跳转后 高亮的页码数字是不是page_number,一定注意参数((By.CSS_SELECTOR,'css语法'),(text))
wait.until(
EC.text_to_be_present_in_element((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > ul > li.item.active > span'), str(page_number))
)
except TimeoutException:
next_page(page_number)
# 商品详情解析,这里只做了打印输入并未保存在数据库
def get_products():
wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-itemlist > div > div > div:nth-child(1) > div:nth-child(1) > div.ctx-box.J_MouseEneterLeave.J_IconMoreNew"))
)
res = browser.page_source
html = BeautifulSoup(res, 'html.parser')
# 每个上坪详情列表结果
items= html.find_all('div',{'class':'ctx-box J_MouseEneterLeave J_IconMoreNew'})
for item in items:
print({
'price':item.find('div',{'class':'price g_price g_price-highlight'}).find('strong').string,
'pay_nums':item.find('div',{'class':'deal-cnt'}).string,
'name':item.find('div',{'class':'row row-2 title'}).find('a').get_text().replace('\n','').replace(' ',''),
'location':item.find('div',{'class':'location'}).string
})
# 主函数
def main():
total = search()
# 返回的是字符串,正则匹配返回页码数字
total = int(re.compile('(\d+)').search(total).group(1))
# print(type(total))
for i in range(2,total+1):
get_products()
next_page(i)
if __name__ == '__main__':
main()
总结:
本人大四小白,不喜勿碰.如有错误欢迎指正,一起学习,共同进步.
- PhantomJS
本来打算用Phantomjs代替界面化浏览器结果发现,selenium和PhantomJS分道扬镳了,不过可以用无头FireFox或者Chrome浏览器代替.这里没有做研究.
推荐阅读
-
Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例
-
Python使用Selenium模块实现模拟浏览器抓取淘宝商品美食信息功能示例
-
python+selenium爬取淘宝羽毛球拍信息
-
python使用selenium打开chrome浏览器时带用户登录信息实现过程详解
-
Python使用Selenium模块实现模拟浏览器抓取淘宝商品美食信息功能示例
-
Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例
-
python+selenium爬取淘宝羽毛球拍信息
-
selenium爬取淘宝商品信息存储到MongoDB
-
认识爬虫:如何使用 requests 模块模拟浏览器请求爬取网页信息?
-
selenium + Chrome 模拟浏览器爬淘宝信息