selenium爬取爱采购网商品数据

自动化爬取爱采购网商品数据

技术:selenium+bs4+re
使用浏览器:Chrome
爬取网站:https://b2b.baidu.com/
时间:2020年12月1日22:32:23
代码如下:

# -*- coding: utf-8 -*-
# Author : YRH
# Data : 2020年12月1日
# Project : 爱采购商品价格
# Tool : PyCharm
from selenium import webdriver
from time import sleep
from bs4 import BeautifulSoup
import re
import json


class b2b(object):
    def __init__(self, name, max_page):
        self.name = name  # 搜索关键词
        self.url = "https://b2b.baidu.com/s?q={}&from=search".format(self.name)
        self.driver = webdriver.Chrome()
        self.page_num = 1  # 统计页码
        self.max_page = max_page  # 最大页码
        self.data = []  # 数据暂存列表

    # 执行函数
    def run(self):
        self.driver.get(self.url)
        self.get_data()

    # 提取数据
    def get_data(self):
        print("正在抓取"+self.name+"页面第"+str(self.page_num)+"页")
        # 向下滚动31000像素
        js = "window.scrollBy(0, 3000)"
        # 设置滚动次数
        for i in range(5):
            self.driver.execute_script(js)  # 滚动页码
            sleep(1)

        page = self.driver.page_source  # 页码源码
        soup = BeautifulSoup(page, "html.parser")
        div = soup.find("div", class_="product-list").find_all_next("div", class_="inline")
        for d in div:
            try:
                # 获取产品标题
                title = d.find("div", class_="p-card-img-layout").attrs["title"]
                # 利用正则获取商品价格,因为获取的数据需要编码转换,所以下面进行转换
                price = re.findall(r'p-card-price.*?data-v-f9f0a31a="" title="(.*?)"', str(str(d).encode()), re.S)[0]
                # print(title)
                price = bytes(price, encoding='utf-8')
                price = eval(repr(price).replace("\\\\", "\\"))
                price = str(price.decode("utf-8")).replace("\xa5", "")

                # 将数据追加到暂存的列表中
                self.data.append({"title": title, "price": price})
            except:
                pass
        # 调用换页函数
        self.next_page()

    # 换页
    def next_page(self):
        print("第"+str(self.page_num)+"页爬取成功")
        try:
            # 进行判断,爬取到最后一页终止
            if self.page_num < self.max_page:
                self.page_num += 1
                self.driver.find_element_by_class_name("ivu-page-next").click()
                sleep(1)
                # 换页成功后调用解析数据函数
                self.get_data()
            else:
                self.save_data()
        except Exception as s:
            # 如果换页失败,可能是页面滑动没滑到最下面,所以可以到上面进行修改滑到次数
            print("爬取到第" + str(self.page_num) + "页后出错,错误信息为:\n" + str(s))
            self.save_data()

    # 数据保存
    def save_data(self):
        with open("data.json", "a", encoding="utf8") as fp:
            fp.write(json.dumps(self.data, ensure_ascii=False, indent=4))
        print("数据保存成功")
        self.driver.close()


if __name__ == '__main__':
    name = input("要爬取的关键词")
    max_page = eval(input("请输入爬取的最大页码"))
    b2b = b2b(name, max_page)
    b2b.run()

执行代码:

要爬取的关键词:书架
请输入爬取的最大页码:10
正在抓取书架页面第1页
第1页爬取成功
正在抓取书架页面第2页
第2页爬取成功
正在抓取书架页面第3页
第3页爬取成功
正在抓取书架页面第4页
第4页爬取成功
正在抓取书架页面第5页
第5页爬取成功
正在抓取书架页面第6页
第6页爬取成功
正在抓取书架页面第7页
第7页爬取成功
正在抓取书架页面第8页
第8页爬取成功
正在抓取书架页面第9页
第9页爬取成功
正在抓取书架页面第10页
第10页爬取成功
数据保存成功

Process finished with exit code 0

部分数据示例

[
    {
        "title": "钢制书架厂家 钢制书架精选厂家 厂家直销",
        "price": "360.00元"
    },
    {
        "title": "图书馆密集书架 图书馆密集书架精选厂家 厂家直销",
        "price": "888.00元"
    },
    {
        "title": "图书馆书架 图书馆书架精选厂家 厂家直销",
        "price": "360.00元"
    },
    {
        "title": "钢制文件柜 文件柜书架厂家 钢制书架价格",
        "price": "850.00元"
    },
    {
        "title": "武新 图书馆书架 全钢制双面书店阅览室钢制书架批发",
        "price": "150.00元"
    },
    {
        "title": "黑龙江图书馆书架厂家学校图书架可定做",
        "price": "260.00元"
    },

改代码适合爬取任意商品,可能会有一些商品爬取不了,可以结合HTML结构修改代码,在爬取之前需先安装selenium和一些必要的配置

### 使用Python爬虫抓取1688网站商品信息的数据采集方法及注意事项 #### 了解目标平台特性 1688是中国领先的批发采购平台,提供大量供应商和商品资源。由于其商业性质,该平台通常会设置多种反爬机制来保护数据安全[^1]。 #### 准备工作环境 为了高效稳定地进行数据收集,在开始之前需安装必要的库工具: ```bash pip install requests beautifulsoup4 pandas openpyxl selenium webdriver_manager ``` #### 设计合理的请求策略 频繁访问可能导致IP被封禁,因此建议采用如下措施降低风险: - 设置合适的延时间隔; - 更换User-Agent模拟不同浏览器行为; - 利用代理池轮询发送HTTP(S)请求; #### 编写基础代码框架 下面是一个简单的例子展示如何利用`requests`库发起GET请求并解析HTML文档结构: ```python import time from random import randint import requests from bs4 import BeautifulSoup def fetch_page(url, headers=None): try: response = requests.get(url=url, headers=headers) if response.status_code == 200: return response.text else: print(f"Failed to load page {url}, status code:{response.status_code}") return None except Exception as e: print(e) def parse_html(html_content): soup = BeautifulSoup(html_content, 'lxml') items = [] # 假设每页有多个item标签包裹着单个商品的信息 for item in soup.select('.items'): title = item.find('h3').get_text(strip=True) price = float(item.find(class_='price').text.strip().replace('¥', '').replace(',', '')) items.append({ 'title': title, 'price': price }) return items if __name__ == '__main__': base_url = "https://www.1688.com/" user_agent = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)' } html = fetch_page(base_url, headers=user_agent) data = parse_html(html) # 输出前五个条目查看效果 for i in range(min(5, len(data))): print(f"{i+1}. Title: {data[i]['title']}; Price: ¥{data[i]['price']}") # 防止过快连续请求触发防护机制 sleep_time = randint(3,7) print(f"\nSleeping for {sleep_time} seconds...") time.sleep(sleep_time) ``` 请注意上述代码仅为示意用途,并未考虑实际页面的具体布局与API调用逻辑。真实场景下还需要深入研究网页源码找到确切的选择器路径。 #### 关键点提示 - **合法性审查**:确保操作符合法律法规和服务条款规定。 - **动态加载处理**:部分区域可能通过JavaScript异步渲染,此时可借助Selenium等自动化测试工具辅助完成整个流程。 - **登录状态维持**:某些私密或受限内容或许要求先经过身份验证才能正常浏览,这时就要思考怎样保存cookie实现持续交互。 - **异常情况应对**:网络波动、服务器错误等因素都可能会中断程序执行进度,所以要加入充分的日志记录便于排查问题所在。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值