文章目录

  • 前言
  • 一、优化内容
    • 1、cromeOptions()加载优化
    • 2、ThreadPool()中的pool.map()多线程优化
  • 二、完整代码
  • 三、运行效果截图

前言

本文为上一篇爬虫文章的多线程优化版,上一版本爬取时间为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,如果觉得速度慢在加上这个
–disable-java 禁用java
–start-maximized 启动就最大化
–no-sandbox 取消沙盒模式
–single-process 单进程运行
–process-per-tab 每个标签使用单独进程
–process-per-site 每个站点使用单独进程
–in-process-plugins 插件不启用单独进程
–disable-popup-blocking 禁用弹出拦截
–disable-plugins 禁用插件
–disable-images 禁用图像
–incognito 启动进入隐身模式
–enable-udd-profiles 启用账户切换菜单
–proxy-pac-url 使用pac代理 [via 1/2]
–lang=zh-CN 设置语言为简体中文
–disk-cache-dir 自定义缓存目录
–disk-cache-size 自定义缓存最大值(单位byte)
–media-cache-size 自定义多媒体缓存最大值(单位byte)
–bookmark-menu 在工具 栏增加一个书签按钮
–enable-sync 启用书签同步
–single-process 单进程运行Google Chrome
–start-maximized 启动Google Chrome就最大化
–disable-java 禁止Java
–no-sandbox 非沙盒模式运行

本次选用的内容和使用(注释完整):

# 使用selenium模拟人为访问页面,获取数据
def spider_jd(p_url):try:# ChromeOptions() 函数中有谷歌浏览器的一些配置option = webdriver.ChromeOptions()option.add_argument('--headless')   # 无头模式,不显示可视化窗口option.add_argument('--incognito')  # 隐身模式(无痕模式)option.add_argument('--disable-plugins')  # 禁用所有插件option.add_argument('–-start-maximized')    # 开启最大化窗口option.add_argument('–-single-process')     # 单进程运行option.add_argument('–-no-sandbox')     # 禁用沙盒模式option.add_argument('--disable-java')  # 禁用javaoption.add_argument('--disable-javascript')  # 禁用javascriptoption.add_argument('blink-settings=imagesEnabled=false')  # 不加载图片, 提升速度option.add_argument('user-agent="MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"')# 禁用图片prefs = {"profile.managed_default_content_settings.images": 2}option.add_experimental_option('prefs', prefs)# 创建谷歌浏览器对象driver = webdriver.Chrome("D:\Anaconda3\envs\Python\chromedriver.exe", options=option)# 打开谷歌浏览器,进入指定网址的页面driver.get(p_url)driver.execute_script("window.scrollTo(2/3,document.body.scrollHeight);")    # 模拟浏览器滑动到页面2/3处# 等待加载项加载time.sleep(1)# 相当于 request.get(url, headers=header)source = driver.page_sourcehtml = etree.HTML(source)   # 重构为html # 提取hrefhref = html.xpath('/html/body/div[6]/div[2]/div[2]/div[1]/div/div[2]/ul/li/@data-sku')# 存到列表for hr in href:url_id.append(hr)driver.quit()  # driver退出except Exception as e:print(e)
2、ThreadPool()中的pool.map()多线程优化

安装:

pip install threadpool

使用介绍:

(1)引入threadpool模块

from multiprocessing.dummy import Pool as ThreadPool

(2)创建线程 池pool = ThreadPool(n) # n为线程数

pool = ThreadPool(8)

(3)多线程处理

pool.map(反复调用的函数(只需要函数名),  参数池(元组类型))

(3)结束

pool.close()     # pool.join()   #

本次选用的内容和使用:

po = ThreadPool(8)
po.map(spider_jd, tuple(url_sort))
po.close()
po.join()

二、完整代码

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

from selenium import webdriver
from lxml import etree
from multiprocessing.dummy import Pool as ThreadPool
import time
import pymysqlurl_id = []# 使用selenium模拟人为访问页面,获取数据
def spider_jd(p_url):try:# ChromeOptions() 函数中有谷歌浏览器的一些配置option = webdriver.ChromeOptions()option.add_argument('--headless')   # 无头模式,不显示可视化窗口option.add_argument('--incognito')  # 隐身模式(无痕模式)option.add_argument('--disable-plugins')  # 禁用所有插件option.add_argument('–-start-maximized')    # 开启最大化窗口option.add_argument('–-single-process')     # 单进程运行option.add_argument('–-no-sandbox')     # 禁用沙盒模式option.add_argument('--disable-java')  # 禁用javaoption.add_argument('--disable-javascript')  # 禁用javascriptoption.add_argument('blink-settings=imagesEnabled=false')  # 不加载图片, 提升速度option.add_argument('user-agent="MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"')# 禁用图片prefs = {"profile.managed_default_content_settings.images": 2}option.add_experimental_option('prefs', prefs)# 创建谷歌浏览器对象driver = webdriver.Chrome("D:\Anaconda3\envs\Python\chromedriver.exe", options=option)# 打开谷歌浏览器,进入指定网址的页面driver.get(p_url)driver.execute_script("window.scrollTo(2/3,document.body.scrollHeight);")    # 模拟浏览器滑动到页面2/3处# 等待加载项加载time.sleep(1)# 相当于 request.get(url, headers=header)source = driver.page_sourcehtml = etree.HTML(source)   # 重构为html# 提取hrefhref = html.xpath('/html/body/div[6]/div[2]/div[2]/div[1]/div/div[2]/ul/li/@data-sku')# 存到列表for hr in href:url_id.append(hr)driver.quit()  # driver退出except Exception as e:print(e)# 清空数据库,不请空表结构
def clean_database():db = pymysql.connect(host="***", user="root", password="***", database="JD_DATA",charset="utf8")cursor = db.cursor()sql = "TRUNCATE TABLE product_data;"cursor.execute(sql)db.commit()print('数据库旧数据清理成功!')db.close()# 连接数据库,上传数据
def insert(value):try:db = pymysql.connect(host="***", user="root", password="***", database="JD_DATA", charset="utf8")cursor = db.cursor()sql = "insert into product_data(url) VALUES ('{val}')".format(val=value)cursor.execute(sql)db.commit()db.close()except Exception as e:insert(value)print("插入数据失败!正在重试!:{}".format(e))if __name__ == "__main__":url_sort = []  # 存放100页商品列表urlstart = time.perf_counter()print("正在获取商品页面......")for i in range(1, 101):url = 'https://search.jd.com/Search?keyword=%E7%AC%94%E8%AE%B0%E6%9C%AC%E7%94%B5%E8%84%91&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&suggest=1.his.0.0&psort=3&page={}&s=61&click=0'.format((i * 2) - 1)url_sort.append(url)print("商品页面获取完成!")print("\n正在获取商品url......")# 多线程获取产品id  po = ThreadPool(8)po.map(spider_jd, tuple(url_sort))po.close()po.join()time1 = time.perf_counter()print("url获取完成!")print('\n数据获取完毕关闭浏览器!\n共获取{}条数据!\n共耗时{}s'.format(len(url_id), time1 - start))print('\n正在清理数据库......')clean_database()print("\n正在上传数据到数据库......")# 多线程上传数据到数据库p = ThreadPool(100)p.map(insert, tuple(url_id))p.close()p.join()end = time.perf_counter()print('\n上传完成!关闭服务器连接,上传过程共耗时{}s'.format(end - time1))print("\n项目完成,累计耗时{}s".format(end - start))

三、运行效果截图

优化前:

多线程及提示效果优化后:

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

  1. 爬取京东笔记本电脑销量榜每件商品详情页url,并存入云服务器中的mysql库

    文章目录 一.目的分析 二.爬取页面商品所有详情页链接 1.爬取href链接 2.将数据存入数据库 完整代码: 三.多线程优化版已完成 (多线程优化)爬取京东笔记本电脑销量榜data-sku(商品id ...

  2. 网络爬虫---用urllib模块爬取京东笔记本电脑的数据、并对其做一个可视化

    用urllib模块爬取京东笔记本电脑的数据.并对其做一个可视化 文章目录 用urllib模块爬取京东笔记本电脑的数据.并对其做一个可视化 一.前言 二.知识要求 三.过程分析 1.观察主页面和每个电脑 ...

  3. Python爬取京东笔记本电脑,来看看那个牌子最棒

    @图片自制by小si 一.前言 二.知识要求三.过程分析1.观察主页面和每个电脑界面的网址2.寻找每个电脑的id3.找到存放电脑的价格和评论数的信息4.爬取信息的思路四.urllib模块爬取京东笔记本 ...

  4. python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析

    这篇文章主要介绍了python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析的实例,帮助大家更好的理解和学习使用python.感兴趣的朋友可以了解下 一.环境准备 python3.8.3 ...

  5. 用Python实现爬虫爬取京东笔记本电脑图片

    最近需要从网上搜集一些数据,于是花了几个小时把爬虫学了一下.其实我在两年前的一个简单的站内搜索引擎的实现已经涉及到了简单的爬虫,不过那时候老想着偷懒,加上山大新闻网的设计又很好爬,所以当时写得很low ...

  6. Python爬取京东笔记本电脑,来看看那个牌子最棒!

    一.前言 二.知识要求三.过程分析1.观察主页面和每个电脑界面的网址2.寻找每个电脑的id3.找到存放电脑的价格和评论数的信息4.爬取信息的思路四.urllib模块爬取京东笔记本电脑的数据.并对其做一 ...

  7. scrapy爬取京东笔记本电脑数据并进行简单处理和分析

    京东爬虫 一.环境准备 二.问题分析 三.spider 三.item 四.setting 五.pipelines 六.middlewares 七.使用jupyter进行简单的处理和分析 一.环境准备 ...

  8. 【Python爬虫】按时爬取京东几类自营手机型号价格参数并存入数据库

    一.最近刚好想换手机,然后就想知道京东上心仪的手机价格如何,对比手机价格如何,以及相应的历史价格,然后就用Python requests+MySQLdb+smtplib爬取相关的数据 二.关于实现的主 ...

  9. 练习---爬取QQ音乐某首歌的评论,并存入Excel表中---以《消愁》为例

    import requests from bs4 import BeautifulSoup import json import xlwt#存储成Excel表格的函数 def save_excel(c ...

最新文章

  1. 【实战教程】腾讯云搭建微信小程序服务
  2. Java_Shell多线程
  3. 在Kali上安装打印机
  4. 成不了天才,但为何也没成人材?(转)
  5. 在Linux上搭建VisualSVN Server(svn服务端)
  6. 计算机应用技术的历史与现状,浅析计算机应用技术的现状及发展趋势
  7. IP组播之组管理协议IGMP
  8. 封装自己专属的真正的纯净版Windows系统过程记录(4)——进行封装
  9. Exchange2010 server的部署及配置(一)
  10. 一维搜索---黄金分割法
  11. 《都在用的商务精英礼仪》读书笔记
  12. Exception】Chrome浏览器提示:此网页正试图从未经验证的来源加载脚本
  13. 报错:表达式必须含有常量值
  14. 技术宅用3D打印帮助妻子治疗脑瘤
  15. Luogu1197 星球大战
  16. HDU 2094 产生冠军
  17. 手游《六大门派》 武侠MMORPG手机游戏全套源码下载
  18. 无线传感网络的发展现状及研究中的关键技术
  19. 12.关于uniapp小程序设置页面背景色无效的问题及解决方案
  20. 面向对象与面向过程思考

热门文章

  1. Oracle 19c 新特性 —— 自动索引 Automatic indexing
  2. JAVA两年5009_【JAVA】PAT 乙级 1059 C语言竞赛(测试点1、2超时) 内含1-10000的素数表和0-10000是否素数的boolean值...
  3. vue使用siwper走马灯
  4. c语言设置单片机中断优先级,如何设置51单片机的中断优先级
  5. 安卓手机获取IP地址
  6. python输入文字垂直输出_python中len用法-python计算数学表达式-利用python如何垂直输出文字...
  7. 矩阵理论(二)特征值分解和SVD分解
  8. 统计建模:数据分析基础
  9. 老毛桃winpe官网
  10. mapbox的矢量切片工具:tippecanoe