爬取某东商城的图书信息

标题# 爬取某东商城的图书信息

我要爬取的是 中国当代小说的信息 书名和价格 并保存到本地
1.其实一开始就是想试下
2.对数据分析的时候要确定是 HTML的数据结构还是 json,还是xml
结构化数据:json,xml等
处理方式:直接转化为python类型
非结构化数据:HTML
处理方式:正则表达式、xpath
这里的就是HTML格式的数据 所以用的是xpath 进行解析,筛选我们想要的数据
3.下面试我的分析过程

“”"
分析:
1.数据是HTML类型还是json类型
–html类型
2. 通过xpath调式发现
– (1)取到的数据只有部分
– (2)鼠标往下拖动,有数据的加载(再次发送了请求)

3.一页数据应该有60本书
//div[@class=“gl-i-wrap”]/div[@class=“p-name”]/a[@target="_blank"]/em/text()

4.需要通过js的触发,,滚条的拖动,才能够加载出来全部的页面,获取到60本书的数据
所以在这里要做一个拖动滚动条的操作,下面的步骤3可以看到
5.在拖动滚动条之前页面应该要渲染的差不多了,不然页面没有渲染出来就拖动滚动条就会报错了
所以在拖动滚动条那一步之前加了一个chrome_obj.set_page_load_timeout(5) 延时等待操作,等待五秒之后就继续走下面的代码
一般来说5秒钟的话 页面已经渲染完了,所以也没什么大问题了
6.另外一点值得注意的是:所有的xpath语法都是我自己用Xpath Helper 调试出来的,并非所有的页面都是用这样语法,所以要结合实际
“”"

源代码就是这样的:

1. 导入selenium,导入延时模块

from selenium import webdriver
import time

解析lxml

from lxml import etree

页面加载等待的异常处理

from selenium.common.exceptions import TimeoutException

导入json

import json

程序入口

if name == ‘main’:
# 1.创建浏览器对象
chrome_obj = webdriver.Chrome()

# 2. 演示的例子是输入京东的:中国当代小说  一共有100个翻页  一个翻页是60本书 ,也就是有100*60 = 6000本书的数据
chrome_obj.set_page_load_timeout(5)
try:
    chrome_obj.get('https://list.jd.com/list.html?cat=1713,3258,3297&page=1&sort=sort_totalsales15_desc&trans=1&JL=4_2_0#J_main') # 这个是我要爬取的中国当代小说的url

except:
    print("超时了......")

# 3.进行拖动条的滚动
for i in range(8): # 0~7
    time.sleep(0.5)
    j =(i+i) *500
    js_ = f"document.documentElement.scrollTop={j}"
    chrome_obj.execute_script(js_) # 执行滚动条

# 代码走到这里,已经发送了第二次请求,页面 已经有了60本书

# 4.获取当前页面的html源代码
str_data = chrome_obj.page_source

# 5.解析书名

在这里插入图片描述

html_obj = etree.HTML(str_data)
title_list = html_obj.xpath('//div[@class="gl-i-wrap"]/div[@class="p-name"]/a[@target="_blank"]/em/text()')
print(title_list)
print(len(title_list))
# 分隔开 看清楚点
print('*'*100)

# 6.解析价格

在这里插入图片描述

price_list = html_obj.xpath('//strong/i/text()')
print(price_list)
print(len(price_list))

# 7.保存到本地
with open('京东图书.json','a',encoding='utf-8') as f:
    for i in range(len(title_list)):
        dict_ = {}  # 給它整个空字典  用来放数据
        dict_[title_list[i]] = price_list[i]
        json_data = json.dumps(dict_,ensure_ascii=False) + ',\n'
        f.write(json_data)

time.sleep(3)

# 关闭浏览器
chrome_obj.quit()

“”"
关于进度条的滚动,不建议一次滚动到底,
第一次滚动到500
第二次滚动到1000
第三次滚动到1500
一直往下滚动到底
“”"
运行结果如下:
在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值