用Python实现爬取淘宝的数据并且存入Excel

1、成果展示

开始运行后,程序自己打开浏览器

根据用户代码中的账号密码模拟登录

提示输入搜索内容

输入内容以及页数

回车后浏览器自动跳转爬取内容

提示爬取成功

在改文件目录下存放为Excel文件形式

2、完整代码

import time
from selenium import webdriver
from bs4 import BeautifulSoup

from selenium.webdriver.common.by import By
from openpyxl import Workbook

def taobao():
    # 创建 EdgeOptions 对象
    option = webdriver.EdgeOptions()
    # 添加排除选项,避免被识别为自动化程序
    option.add_experimental_option('excludeSwitches', ['enable-automation'])

    # 创建 edge WebDriver
    driver = webdriver.Edge(options=option)

    # 执行 JavaScript 代码,修改 navigator.webdriver 属性,防止浏览器被识别为自动化程序
    driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {
        'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'
    })
    # 打开淘宝登录页面
    driver.get("https://login.taobao.com/member/login.jhtml")

    # fm-login-id
    # 等待3秒,确保页面加载完成
    time.sleep(1)
    driver.find_element(By.ID, 'fm-login-id').click()
    time.sleep(1)
    driver.find_element(By.ID, 'fm-login-id').send_keys('150*********')#更改为你的淘宝登录账号
    time.sleep(1)
    driver.find_element(By.ID, 'fm-login-password').click()
    time.sleep(1)
    driver.find_element(By.ID, 'fm-login-password').send_keys('***************')#更改为你的淘宝登录密码
    time.sleep(1)
    # 点击登录按钮
    login_button = driver.find_element(By.CLASS_NAME, 'login-form > div.fm-btn > button')
    # login-form > div.fm-btn > button
    login_button.click()

    # 等待5秒,确保登录成功
    time.sleep(8)
    # login-form > div.fm-btn > button
    # fm-login-password
    # 搜索商品并获取页面内容
    things = input("输入要找的东西:")
    page = int(input("页数:"))

    wb = Workbook()
    # 创作工作表
    ws = wb.active
    # 设置单元格列宽
    ws.column_dimensions['A'].width = 108  # 设置第一列(列 A)的宽度为 108
    # 添加表头
    ws.append(["商品", "单价", "店铺"])
    for p in range(page):
        url = f"https://s.taobao.com/search?page={p + 1}&q={things}"
        #https://s.taobao.com/search?page=1&q=%E8%A1%A3%E6%9C%8D&tab=all
        driver.get(url)
        time.sleep(5)  # 等待页面加载完成
        soup = BeautifulSoup(driver.page_source, 'html.parser').find_all(attrs={"class": "Card--doubleCardWrapper--L2XFE73"})
        # print(soup)
        last_list = []
        for np in soup:
            excel_list = []
            name = np.find(attrs={"class": "Title--title--jCOPvpf"}).get_text()
            # print(name)
            excel_list.append(name)
            price = "¥" + np.find(attrs={"class": "Price--priceInt--ZlsSi_M"}).get_text()
            excel_list.append(price)
            shop = np.find(attrs={"class": "ShopInfo--shopName--rg6mGmy"}).get_text()
            excel_list.append(shop)
            last_list.append(excel_list)
        for i in last_list:
            ws.append(i)
    wb.save("淘宝.xlsx")
    print("已完成")
    # 关闭浏览器
    driver.quit()
taobao()

### 使用Python编写爬虫程序抓取淘宝商品信息并存储至MySQL #### 创建Scrapy项目 为了高效地完成此任务,推荐使用Scrapy框架来构建爬虫。首先需确保已正确安装Scrapy环境。 ```bash pip install scrapy ``` 接着,在命令行中执行如下指令创建新的Scrapy项目: ```bash scrapy startproject taobao_spider cd taobao_spider/spiders/ scrapy genspider taobao_items www.taobao.com ``` 上述操作会初始化一个新的Scrapy工程,并生成一个名为`taobao_items`的基础Spider模板[^2]。 #### 编写Item定义 编辑位于`items.py`中的类以定义要提取的商品字段,例如名称、价格等属性。 ```python import scrapy class TaobaoItem(scrapy.Item): title = scrapy.Field() # 商品标题 price = scrapy.Field() # 单价 sales_volume = scrapy.Field() # 销量 shop_name = scrapy.Field() # 店铺名 location = scrapy.Field() # 地址 ``` #### 配置Settings 调整配置文件`settings.py`内的参数,比如启用管道功能以及设定下载延迟时间防止触发反爬机制。 ```python ITEM_PIPELINES = { 'taobao_spider.pipelines.TaobaoPipeline': 300, } DOWNLOAD_DELAY = 1 # 设置请求间隔时间为1秒 USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" ROBOTSTXT_OBEY = False # 不遵循robots协议 ``` #### 开发Pipelines模块 在`pipelines.py`里加入逻辑处理函数,负责接收来自Spiders传递过来的数据项并将它们保存到预先建立好的MySQL表内。 ```python from itemadapter import ItemAdapter import pymysql.cursors class TaobaoPipeline(object): def __init__(self, dbpool): self.dbpool = dbpool @classmethod def from_crawler(cls, crawler): return cls( dbpool=pymysql.connect(host='localhost', user='root', password='', database='ecommerce_db') ) def process_item(self, item, spider): try: with self.dbpool.cursor() as cursor: sql = """INSERT INTO products(title,price,sales_volume,shop_name,location) VALUES (%s,%s,%s,%s,%s)""" val = ( item['title'], float(item['price']), int(item['sales_volume'].replace('人付款','')), item['shop_name'], item['location'] ) cursor.execute(sql,val) self.dbpool.commit() except Exception as e: print(f"Error occurred while inserting data into DB: {e}") finally: return item def close_spider(self, spider): self.dbpool.close() ``` #### Spider开发 最后一步是在对应的Spider脚本(`taobao_items.py`)里面实现具体页面解析规则,定位所需元素并通过XPath/CSS选择器抽取有效数据填充给Items实例对象。 ```python import scrapy from ..items import TaobaoItem class TaobaoSpider(scrapy.Spider): name = "taobao" allowed_domains=["www.taobao.com"] start_urls=['https://list.tmall.com/search_product.htm?q=手机'] def parse(self,response): items=TaoBaoItem() all_products=response.css(".product-iWrap") for product in all_products: items["title"]=product.xpath('.//div[@class="productTitle"]/a/text()').get().strip() items["price"]=product.css(".productPrice em::text").re_first(r'\d+\.\d*') items["sales_volume"]=product.css(".item-sell-num::text").extract()[0].split(" ")[-1] items["shop_name"]=product.css(".storeName a span::text").get() items["location"]="China" yield items next_page_url = response.css('#content div.pagination-next-page a::attr(href)').get() if next_page_url is not None: absolute_next_page_url = response.urljoin(next_page_url) yield scrapy.Request(url=absolute_next_page_url,callback=self.parse) ``` 以上即为完整的流程介绍,值得注意的是实际部署前还需考虑更多细节优化如异常捕获、日志记录等功能完善度提升等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值