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

编程知识 更新时间:2023-04-13 04:57:52

文章目录

  • 一、目的分析
  • 二、爬取页面商品所有详情页链接
        • 1、爬取href链接
        • 2.将数据存入数据库
        • 完整代码:
  • 三、多线程优化版已完成
      • (多线程优化)爬取京东笔记本电脑销量榜data-sku(商品id),并存入云服务器中的mysql库(爬取时间较上一版提升十多倍)

一、目的分析

1、京东搜索笔记本电脑字段,按销量由高到低排序,该网页作为开始url,爬取100页数据,共计 5 (个) *12(行)*100(页)= 6000(条)数据。

2、数据为各个项目详情页中的数据,即下图中的href,可先爬取所有的href,后续再从各链接中爬取所需数据。

二、爬取页面商品所有详情页链接

即该href链接

出现的问题:京东一页数据为30项,但分半加载,即先加载15项,下滑加载后半部分,导致爬取结果仅有15项。

解决方法:爬虫爬取动态网页,滑动加载项无法爬取问题

1、爬取href链接

这里使用了selenium模块加载动态网页
观察各页url:
第一页:https://search.jd/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&click=0
第二页:https://search.jd/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=3&s=61&click=0
第三页:https://search.jd/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=5&s=121&click=0

可以发现Page是1、3、5呈奇数递增,测试发现后面的page为偶数时网页与奇数网页内容一致,所以我们在循环里将Url内容改为'...page={ }'.format((i * 2) - 1)


from selenium import webdriver
from lxml import etree
import time

urls = []

# 使用selenium模拟人为访问页面,获取数据
def spider_jd(url):
    # ChromeOptions() 函数中有谷歌浏览器的一些配置
    options = webdriver.ChromeOptions()
    # 告诉谷歌这里用的是无头模式
    options.add_argument('headless')
    # 创建谷歌浏览器对象
    driver = webdriver.Chrome('D:\Anaconda3\envs\Python\chromedriver.exe')
    # 打开谷歌浏览器,进入指定网址的页面
    driver.get(url)
    # 模拟下拉页面动作,是动态页面加载
    driver.execute_script("window.scrollTo(0,document.body.scrollHeight);")
    # 停顿2.5秒等待页面加载完毕!!!(必须留有页面加载的时间,否则部分浏览器获得的源代码会不完整。)
    time.sleep(2.5)

    # 相当于 request.get(url, headers=header)
    source = driver.page_source
    # 构造了一个XPath解析对象并对HTML文本进行自动修正。
    html1 = etree.HTML(source)
    # 提取href
    href = html1.xpath('//div[@class="p-img"]/a/@href')

    # 仅保存前60个值,k值每次循环自增60
    for hr in href:
        urls.append(hr)
    del urls[k:]

    driver.close()   # 爬取完毕关闭浏览器


k = 60

for i in range(1, 100):
    url = 'https://search.jd/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)
    spider_jd(url)
    k = k + 60

print(urls)
print('爬取完毕关闭浏览器')

爬取到的链接大部分为非https:开头,所以我们需要在没有https:的一项前面添加https:

    for hr in href:
        if hr[:6] != 'https:':      # 判断是否为https:开头项,为否则添加https:头
            urls.append('https:' + hr)
        urls.append(hr)        # https:开头则直接加入列表
    del urls[k:]

爬取所有链接完成。

2.将数据存入数据库

import pymysql

# 链接数据库
def create():
    try:
        db = pymysql.connect(host = "x.x.x.x", user = "root", password = "***", database = "SPIDER_URL", charset="utf8") # 连接数据库
 
        # 使用cursor()方法获取操作游标
        cursor = db.cursor()
        # 使用execute方法执行SQL语句
        cursor.execute("DROP TABLE IF EXISTS URL")
 
        sql = 'CREATE TABLE URL(url CHAR(50));'

        # 执行SQL语句
        cursor.execute(sql)
        print("连接服务器成功!")
        # 关闭光标对象
        cursor.close()
        # 关闭数据库连接
        db.close()
    except:
        print("连接服务器失败!")

# 插入数据
def insert(value):
    db = pymysql.connect(host = "x.x.x.x", user = "root", password = "***", database = "SPIDER_URL", charset="utf8")
 
    cursor = db.cursor()
    sql = "INSERT INTO URL(url) VALUES (%s)"
    try:
        cursor.execute(sql, value)
        dbmit()
        print('插入数据成功!')
    except:
        db.rollback()
        print("插入数据失败!")
    db.close()

完整代码:

爬虫爬取京东商品各详情页Url并插入mysql数据库代码
(为确保安全,mysql.connect内容需自行编辑)
(mysql需先建立相关库和表)
(需要配置webdriver,方法链接:selenium + cromedriver配置方法)

from selenium import webdriver
from lxml import etree
import time
import pymysql

start = time.perf_counter()

urls = []

# 使用selenium模拟人为访问页面,获取数据
def spider_jd(url):
    # ChromeOptions() 函数中有谷歌浏览器的一些配置
    options = webdriver.ChromeOptions()
    # 告诉谷歌这里用的是无头模式
    options.add_argument('headless')
    # 创建谷歌浏览器对象
    driver = webdriver.Chrome('D:\Anaconda3\envs\Python\chromedriver.exe')
    # 打开谷歌浏览器,进入指定网址的页面
    driver.get(url)
    # 模拟下拉页面动作,是动态页面加载
    driver.execute_script("window.scrollTo(0,document.body.scrollHeight);")
    # 停顿2.5秒等待页面加载完毕!!!(必须留有页面加载的时间,否则部分浏览器获得的源代码会不完整。)
    time.sleep(2.5)

    # 相当于 request.get(url, headers=header)
    source = driver.page_source
    # 构造了一个XPath解析对象并对HTML文本进行自动修正。
    html1 = etree.HTML(source)
    # 提取href
    href = html1.xpath('//div[@class="p-img"]/a/@href')

    # 仅保存前60个值,k值每次循环自增60
    for hr in href:
        if hr[:6] != 'https:' or hr[:6] != 'http:':      # 判断是否为https:开头项,为否则添加https:头
            urls.append('https:' + hr)
        else:
            urls.append(hr)
    del urls[k:]

    driver.close()   # 爬取完毕关闭浏览器


def create():
    try:
        db = pymysql.connect(host = "x.x.x.x", user = "root", password = "***", database = "SPIDER_URL", charset="utf8") # 连接数据库
 
        # 使用cursor()方法获取操作游标
        cursor = db.cursor()
        # 使用execute方法执行SQL语句
        cursor.execute("DROP TABLE IF EXISTS URL")
 
        sql = 'CREATE TABLE URL(url CHAR(50));'

        # 执行SQL语句
        cursor.execute(sql)
        print("连接服务器成功!")
        # 关闭光标对象
        cursor.close()
        # 关闭数据库连接
        db.close()
    except:
        print("连接服务器失败!")

def insert(value):
    db = pymysql.connect(host = "x.x.x.x", user = "root", password = "***", database = "SPIDER_URL", charset="utf8")
 
    cursor = db.cursor()
    sql = "INSERT INTO URL(url) VALUES (%s)"
    try:
        cursor.execute(sql, value)
        dbmit()
        print('插入数据成功!')
    except:
        db.rollback()
        print("插入数据失败!")
    db.close()


k = 60

for i in range(1, 2):
    url = 'https://search.jd/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)
    spider_jd(url)
    k = k + 60
print(urls)
print('共爬取{}条数据,爬取完毕关闭浏览器'.format(len(urls)))
try:
    print("正在连接数据库。。。")
    create()

    print("正在插入数据。。。")
    for url1 in urls:
        insert(url1)
except BaseException as e:
    print(e)

end = time.perf_counter()
print("项目完成,耗时{}s".format(end-start))

range(1,101),即爬取100页(6000件商品)时,并优化文字显示后,结果展示:

数据库内容

三、多线程优化版已完成

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

更多推荐

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

本文发布于:2023-04-11 07:07:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/5ba74031788b104e7141f71e06f56178.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:笔记本电脑   销量   每件   京东   器中

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!

  • 67366文章数
  • 14阅读数
  • 0评论数