我要爬取的是 中国当代小说的信息 书名和价格 并保存到本地
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 调试出来的,并非所有的页面都是用这样语法,所以要结合实际
“”"
源代码就是这样的:
- 导入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.解析书名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
在这里插入图片描述
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.解析价格
1
2
3
4
5
6
7
8
在这里插入图片描述
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) + ',
'
f.write(json_data)
time.sleep(3)
关闭浏览器
chrome_obj.quit()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
“”"
关于进度条的滚动,不建议一次滚动到底,
第一次滚动到500
第二次滚动到1000
第三次滚动到1500
一直往下滚动到底
“”"
运行结果如下:
在这里插入图片描述