自动化爬取爱采购网商品数据
技术: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和一些必要的配置