Five day
爬虫案例-当当网商品采集-书籍
爬虫该网页过程当中,要注意频繁去分析页面,以便于理解如何获取数据
地址:http://search.dangdang.com
目标:商品信息:名称、描述、价格
分析:排行、评布、价格分布、词云
存储:pickle 二进制序列化存储,效率很好,可以自定定义数据结构
模拟商品搜索功能
http://search.dangdang.com/?key=python&act=input
http://search.dangdang.com/ 域名
- key=商品名 参数
- act=input 固定参数
翻页:
- http://search.dangdang.com/?key=python&act=input&page_index=100
- page_index=页数
分析:
import requests # 请求
from bs4 import BeautifulSoup # 解析
import time,random # 时间、随机数字
import pickle # 序列化存储
class SpiderDangDangWang():#爬取当当网的商品信息
def __init__(self):#初始化
self.url = 'http://search.dangdang.com/'
# 定制头部
self.headers = {
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
'Host': 'search.dangdang.com'
}
# 代理IP
self.proxies = {
'http://':'113.121.23.147:9999',
'https://':'113.121.22.201:9999'
}
self.html_list = []
self.data_dict = {}
self.result = {} # 缓存页面数据
def getDangDangHtml(self):#获取当当页面:书籍商品
keywork = input("请输入搜索的商品") # 输入框
page_index = 0 # 页面数
result = {} # 缓存页面数据
while True: # 死循环(翻页查询)
page_index+=1 # 每次页数递增:+1
resp = requests.get(url=self.url,params={'key':keywork,'act':'input','page_index':page_index},headers=self.headers,proxies=self.proxies)
print('url-',resp.url)
print('code-',resp.status_code)
self.html_list.append(resp.text) # 网页源码保存到列表
time.sleep(random.random()+2) # 睡眠随机时间:2~3
if page_index == 10: # 超出10页,就自动结束
return
else:
print('商品采集完毕')
def parserDangDangHtml(self):#解析数据、保存数据
for html in self.html_list:
soup = BeautifulSoup(html,'html5lib') # 解析对象
title = soup.title.string
div = soup.find(name='div',attrs={'class':'con shoplist'}) # 商品最大容器
for li in div.find_all(name='li'): # 商品的容器:li
name = li.find(name='p',attrs={'class':'name'}) # 商品的名称
detail = li.find(name='p',attrs={'class':'detail'}) # 商品详情
price = li.find(name='p',attrs={'class':'price'}) # 商品价格
star = li.find(name='p',attrs={'class':'search_star_line'}) # 商品评分
comments = star # 商品的评论数量
img = li.find(name='img') # 商品的图片
if name == None and detail == None and price == None and star == None and img == None :
name = ''
detail = ''
price = ''
star = ''
comments = ''
img = ''
else:
name = name.a.get('title')
detail = detail.text
price = float(price.span.text[1:]) # ¥61.40 [1:] = 61.40
star = star.span.span.get('style')
# star = width:100%; = ['width','100%;'] = 100 /20 = 评分等级
star = float(star.split(':')[-1].strip('%;')) / 20
comments = int(comments.a.text[:-3]) # 34524条评论 = 34524
if img.get('data-original') == None:
img = img.get('src')
else:
img = img.get('data-original')
print(price,star,comments,img)
def svaePkl(self): # 测试读取数据
file = open(file='%s.pkl'%(self.title),mode='wb')
# pickle.dump 把数据转化二进制,序列化
# pickle.load 把二进制数据转换回来,反序列化
pickle.dump(self.result,file)
file.flush()
file.close()
def testOpenPk1(self):#测试读取数据
file = open(file='java-当当网.pkl',mode='rb')
data = pickle.load(file)
print(data)
def run(self):#运行
self.getDangDangHtml()
self.parserDangDangHtml()
self.svaePkl()
数据可视化 pyecharts
模块:
- 图表
- 全局配置
- 系列配置
- 常用工具类
- http://gallery.pyecharts.org/#/Bar3D/bar3d_base
安装:
开始 - anaconda3 prompt 终端 - 启动
输入cmd命令 :pip install pyecharts
安装成功 :successful packge pyecharts…
验证:
输入cmd命令:pip show pyecharts -i https://pypi.tuna.tsinghua.edu.cn/simple
(base) mac:~ lpf$ pip show pyecharts
Name: pyecharts
Version: 1.8.1