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

技术: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