(多线程优化)爬取京东笔记本电脑销量榜data-sku(商品id),并存入云服务器中的mysql库(爬取时间较上一版提升十多倍)

本文介绍了如何优化京东笔记本电脑销量榜爬虫,通过cromeOptions加载优化和ThreadPool的pool.map()多线程方法,将爬取时间从原先的左右缩短到,同时解决了内存溢出和数据库连接问题。
摘要由CSDN通过智能技术生成

前言

本文为上一篇爬虫文章的多线程优化版,上一版本爬取时间为3000s左右,优化后仅200多s
前一文连接:爬取京东笔记本电脑销量榜每件商品详情页url,并存入云服务器中的mysql库

较原版所作改动:
1.获取的url改为data-sku,即产品Id。
2.双线程池使用,获取数据和插入数据到数据库同样使用了多线程。
3.原数据库操作为创建数据表插入数据操作,现在为清空原有表中数据再插入新数据操作。
4.需在数据库中先创建数据库和数据表
5.可能遇到的错误及解决方法:
数据库设置最大连接数方法(使用ThreadPool多线程插入数据到数据库报错)
使用ThreadPool()中的pool.map()多线程运行selenium webdriver导致的内存占用巨大,内存溢出乃至电脑卡死解决方法

文末附完整代码备注:数据库ip和密码以***替代

一、优化内容

1、cromeOptions()加载优化

chromeOptions 是一个配置 chrome 启动是属性的类。通过这个类,我们可以为chrome配置如下参数(这个部分可以通过selenium源码看到):

设置 chrome 二进制文件位置 (binary_location)
添加启动参数 (add_argument)
添加扩展应用 (add_extension, add_encoded_extension)
添加实验性质的设置参数 (add_experimental_option)
设置调试器地址 (debugger_address)
添加示例:

from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument('lang=zh_CN.UTF-8')  # 此为设置编码格式为中文,可用下面配置项替换
# driver = webdriver.Chrome(options = options)  #如需打开驱动位置,换下一行
driver = webdriver.Chrome("D:\Anaconda3\envs\Python\chromedriver.exe", options=options)

常用配置项枚举:

–user-data-dir=”[PATH]” 指定用户文件夹User Data路径,可以把书签这样的用户数据保存在系统分区以外的分区。
–disk-cache-dir=”[PATH]“ 指定缓存Cache路径
–disk-cache-size= 指定Cache大小,单位Byte
–first run 重置到初始状态,第一次运行
–incognito 隐身模式启动
–disable-javascript 禁用Javascript
–omnibox-popup-count=”num” 将地址栏弹出的提示菜单数量改为num个。我都改为15个了。
–user-agent=”xxxxxxxx” 修改HTTP请求头部的Agent字符串,可以通过about:version页面查看修改效果
–disable-plugins 禁止加载所有插件,可以增加速度。可以通过about:plugins页面查看效果
–disable-javascript 禁用JavaScript,如果觉得速度慢在加上这个
–disa
好的,以下是一个简单的实现代码,你可以根据自己的需求进行适当的修改和优化: ```python import requests from bs4 import BeautifulSoup import pymysql from pyecharts import Bar # 爬取商品信息 def get_goods_info(url): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} response = requests.get(url, headers=headers) if response.status_code == 200: soup = BeautifulSoup(response.text, 'lxml') items = soup.select('.gl-item') for item in items: try: goods_id = item.select('.p-img a')[0]['data-sku'] goods_name = item.select('.p-name em')[0].get_text().strip() goods_price = item.select('.p-price strong')[0].get_text().strip() goods_comment = item.select('.p-commit strong')[0].get_text().strip() yield {'id': goods_id, 'name': goods_name, 'price': goods_price, 'comment': goods_comment} except: pass # 将商品信息存入数据库 def save_to_db(goods_info): conn = pymysql.connect(host='localhost', port=3306, user='root', password='123456', db='test', charset='utf8mb4') cursor = conn.cursor() try: sql = "INSERT INTO goods_info (id, name, price, comment) VALUES (%s, %s, %s, %s)" cursor.execute(sql, (goods_info['id'], goods_info['name'], goods_info['price'], goods_info['comment'])) conn.commit() except Exception as e: print(e) conn.rollback() finally: cursor.close() conn.close() # 从数据库查询商品信息并生成柱状图 def show_data(): conn = pymysql.connect(host='localhost', port=3306, user='root', password='123456', db='test', charset='utf8mb4') cursor = conn.cursor() try: sql = "SELECT name, price FROM goods_info WHERE comment > 1000" cursor.execute(sql) results = cursor.fetchall() goods_name = [result[0] for result in results] goods_price = [result[1] for result in results] bar = Bar("京东商品价格分析") bar.add("商品价格", goods_name, goods_price) bar.render() except Exception as e: print(e) finally: cursor.close() conn.close() if __name__ == '__main__': url = 'https://search.jd.com/Search?keyword=Python&enc=utf-8' for goods_info in get_goods_info(url): save_to_db(goods_info) show_data() ``` 以上代码的实现流程: 1. 使用 requests 京东网站发送 HTTP 请求,获取商品信息页面的 HTML 响应。 2. 使用 BeautifulSoup 对 HTML 页面进行解析,提取出商品的名称、价格、评论数等信息。 3. 使用 pymysql 连接 MySQL 数据库,并将商品信息插入到指定的表。 4. 使用 pyecharts 生成柱状图,展示商品的名称和价格信息。 需要注意的是,以上代码的 SQL 语句和数据库连接信息需要根据自己的实际情况进行修改。此外,在实际应用,还需要考虑反爬虫机制和数据的有效性和安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值