python使用selenium模拟浏览器抓取淘宝信息
目的:
使用 selenium 模拟浏览器抓取淘宝商品信息
(推荐教程:Python入门教程)
实现功能:
1、创建driver对象
2、请求淘宝商品信息
3、实现翻页
4、通过driver对象,解析商品页面内容,获取需要的数据
5、保存数据到MongoDB数据库
代码示例:
# coding = utf-8from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
from selenium.webdriver import ChromeOptions
from selenium.common.exceptions import TimeoutException
from pyquery import PyQuery as pq
from pymongo import MongoClient
import time
import re
class TaobaoSpider(object):
"""使用 selenium 模拟浏览器抓取淘宝商品信息"""
def __init__(self):
# 设置options参数,以开发者模式
option = ChromeOptions()
option.add_experimental_option("excludeSwitches", ["enable-automation"])
# 连接MongoDB并创建数据库
client = MongoClient(host="127.0.0.1", port=27017)
self.collection = client["taobao"]["products"]
# 创建一个driver对象,模拟开启一个浏览器
self.driver = webdriver.Chrome(options=option)
# 请求登录页面
self.driver.get("https://login.taobao.com/member/login.jhtml")
# 等待页面
self.wait = WebDriverWait(self.driver, 10)
def __del__(self):
pass
def login(self):
# 通过扫描登录淘宝
# 通过CSS选择器找到切换二维码登录的按钮:
qr_code_login = self.wait.until(
ec.element_to_be_clickable((By.CSS_SELECTOR, "#login > div.corner-icon-view.view-type-qrcode > i"))
)
# 点击扫描登录
qr_code_login.click()
time.sleep(5)
def search(self):
# 搜索淘宝商品
self.login()
# 登录后请求淘宝首页
try:
self.driver.get("https://www.taobao.com/")
# 确认网页加载完成后,找到淘宝搜索输入框
search_input = self.wait.until(
ec.presence_of_element_located((By.CSS_SELECTOR, "#q"))
)
# 找到点击按钮
search_submit = self.wait.until(
ec.element_to_be_clickable((By.CSS_SELECTOR, "#J_TSearchForm > div.search-button > button"))
)
# 输入参数 查询
search_input.send_keys("鱼皮")
# 点击按钮提交
search_submit.click()
# 商品按照销量排序
sales_sort = self.wait.until(
ec.element_to_be_clickable(
(By.CSS_SELECTOR, "#J_relative > div.sort-row > div > ul > li:nth-child(2) > a"))
)
sales_sort.click()
# 等待页面数据特别是图片加载完成
time.sleep(2)
# 等待商品页数加载完成
total_page = self.wait.until(
ec.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.total"))
)
# 解析页面数据
self.parse_data()
return total_page.text
except TimeoutException:
return self.search()
def turn_pages(self, page_number):
# 实现翻页操作
try:
# 等待 页码输入框 和 提交确定按钮 准备好
page_input = self.wait.until(
ec.presence_of_element_located(
(By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.form > input")
)
)
page_submit = self.wait.until(
ec.element_to_be_clickable(
(By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit")
)
)
# 页码清空,然后输入
page_input.clear()
page_input.send_keys(page_number)
# 提交页码
page_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(page_number)
)
)
time.sleep(1)
# 解析页面数据
self.parse_data()
except TimeoutException:
self.turn_pages(page_number)
def parse_data(self):
# 解析商品数据
# 等待所有商品加载成功
self.wait.until(
ec.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-itemlist .items .item"))
)
html = self.driver.page_source
# 通过pyquery解析数据
data = pq(html)
# 选出单个商品
items = data("#mainsrp-itemlist .items .item").items()
# 通过for遍历每个商品信息,以字典的形式保存
for item in items:
product = {
'title': item.find('.title').text(),
'price': item.find('.price').text(),
'deal': item.find('.deal-cnt').text()[:-3],
'shop': item.find('.shop').text(),
'location': item.find('.location').text(),
'image': item.find('.pic .img').attr('src')
}
# 去掉数据中的
for key, value in product.items():
value = re.sub(r'¥|
', '', value)
# print(value)
product[key] = value
print(product)
# 将数据保存到MongoDB
self.save_to_mongodb(product)
def save_to_mongodb(self, result):
# 保存数据到MongoDB数据库
try:
if self.collection.insert(result):
print("数据存储到MongoDB数据库成功")
except Exception:
print("数据保存到MongoDB数据库失败")
def save_to_mysql(self):
# 保存到MySQL数据库
pass
def main():
spider = TaobaoSpider()
try:
data = spider.search()
# 获取总页数
# data = int(re.compile('(d+)').search(data).group(1))
for i in range(2, 4):
spider.turn_pages(i)
time.sleep(2)
finally:
# 程序退出
spider.driver.quit()
if __name__ == "__main__":
main()
测试:
以上是 python使用selenium模拟浏览器抓取淘宝信息 的全部内容, 来源链接: utcz.com/z/528976.html