python 模拟浏览器selenium_python使用selenium模拟浏览器抓取淘宝信息

5f48bf230be89986.jpg

目的:

使用 selenium 模拟浏览器抓取淘宝商品信息

实现功能:

1、创建driver对象

2、请求淘宝商品信息

3、实现翻页

4、通过driver对象,解析商品页面内容,获取需要的数据

5、保存数据到MongoDB数据库

代码示例:# coding = utf-8

from 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')

}

# 去掉数据中的 \n

for key, value in product.items():

value = re.sub(r'¥|\n', '', 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()

测试:

1598603173347568.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值