欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python爬取淘宝商品信息

程序员文章站 2022-03-19 17:09:49
使用 selenium 模拟浏览器抓取淘宝商品信息1.创建driver对象2.请求淘宝商品信息3.实现翻页4.通过driver对象,解析商品页面内容,获取需要的数据5.保存数据到MongoDB数据库...

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

实现功能

selenium参考文档:https://selenium-python.readthedocs.io/
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() 

测试

Python爬取淘宝商品信息
之前测试可以保存到数据库,现在失败了,有空再解决这个bug吧。
Python爬取淘宝商品信息

本文地址:https://blog.csdn.net/Artificial_idiots/article/details/108248765