文章目录
- 一、目的分析
- 二、爬取页面商品所有详情页链接
- 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库
发布评论