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

selenium爬取爱采购网商品数据

程序员文章站 2022-06-26 15:18:29
自动化爬取爱采购网商品数据技术: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 : PyCharmfrom selenium import webdriverfrom time import sleepfrom...

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

技术: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和一些必要的配置

本文地址:https://blog.csdn.net/weixin_45066966/article/details/110455506