当当网书籍信息爬虫
1.基本理论
1.1概念体系
网络爬虫又称网络蜘蛛、网络蚂蚁、网络机器人等,可以按照我们设置的规则自动化爬取网络上的信息,这些规则被称为爬虫算法。是一种自动化程序,用于从互联网上抓取数据。爬虫通过模拟浏览器的行为,访问网页并提取信息。这些信息可以是结构化的数据(如表格数据),也可以是非结构化的文本。爬虫任务的执行流程通常包括发送HTTP请求、解析HTML文档、提取所需数据等步骤。
1.2技术体系
1请求库:用于向目标网站发送HTTP请求。常用的请求库包括requests、httplib、urllib等。这些库可以帮助我们模拟浏览器行为,发送GET、POST等请求,并处理响应内容。
2.解析库:用于解析HTML或XML文档,提取出我们需要的数据。常用的解析库包括BeautifulSoup、lxml、pyquery等。这些库可以帮助我们根据HTML文档的结构和标签,提取出我们需要的数据。
3.存储库:用于将爬取到的数据存储到本地或数据库中。常用的存储库包括sqlite3、mysql-connector-python、pymongo等。这些库可以帮助我们将数据存储到关系型数据库或非关系型数据库中,以便后续分析和利用。
2.代码编写流程
代码编写流程
代码共分为3部分,1网页地址规律函数。2网页数据解析,3数据存储。
2.1.网页地址规律
第一页
网页地址图书畅销榜-近24小时畅销书排行榜-当当畅销图书排行榜
第二页
网页地址第2页_图书畅销榜-近24小时畅销书排行榜-当当畅销图书排行榜
对上面地址分析,发现地址中后面数字发生改变,第一页位数为1,第二页位数为2
依次类推。
编写翻页函数
函数中number为页面地址位数
2.2.页面解析
2.3.网页数据保存
·
3.应用举例
该代码对获取数据进行列表切片处理,由于爬虫数据都是字符串数据,对排名,评论数,转化为整数型数据,推荐数转化为浮点型数据,
网页存在些书籍无电子书价格,编写函数处理该问题,对电子书:字段进行查询,无该字段返回-1,
4.编写代码
import requests
from openpyxl import Workbook,load_workbook
import requests
from bs4 import BeautifulSoup
import os
### 网页请求函数
def wy(number):
res=requests.get(url='http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-{}'.format(number))
res.encoding = res.apparent_encoding#解决网页乱码问题
return res.text
## 网页书籍解析部分
def shuj(number):
soup = BeautifulSoup(wy(number), 'html.parser')
f1=soup.find('ul',attrs={'class':"bang_list clearfix bang_list_mode"})
f2=f1.find_all('li')
shuj_list=[]## 数据存放列表
for i in f2:
#shuj1=i.find('div',attrs={'class':"list_num red"})
shuj1=i.text.split("\n")
print(shuj1)
#shuj_list.append(list(filter(None, shuj1)))
shuj_list.append(chuli(list(filter(None, shuj1))))
#print(shuj1)
return shuj_list
#print(f)
## 数据处理函数
def chuli(shuj_list):
print(shuj_list)
shuru_list=[]## 转化数据存储格式列表
try:
shuru_list.append(int(shuj_list[0].replace('.','')))# 排名 # int函数转化书籍类型,字符串转化为整数
shuru_list.append(shuj_list[1].replace('...', ''))# 书名
shuru_list.append(int(shuj_list[2].split("条评论")[0]))# 评论数
shuru_list.append(float(shuj_list[2].split("条评论")[1][:-2].replace('%',''))) # 推荐数
shuru_list.append(shuj_list[3].split(" 著;")[0]) #作者
shuru_list.append(shuj_list[4].split("\xa0")[0]) ## 出版时间
print(shuj_list[4])
shuru_list.append(shuj_list[4].split("\xa0")[1])# 出版社
shuru_list.append(shuj_list[5])# 价格
shuru_list.append(shuj_list[6].replace("\r",''))## 原价
shuru_list.append(shuj_list[7].replace("\r",'').replace(' ','')) # 折数
shuru_list.append(dzjiage(shuj_list[9]))# 电子书价格
except:
pass
return shuru_list
## 处理网页中无电子书价格函数
def dzjiage(x):
if x.find("电子书:")==-1:
k="无数据"
else:
k=x.replace("电子书:",'')
return k
## 写入excel表类函数
class Excel_write():
def __init__(self):
self.excel_file = "当当网书籍信息.xlsx"
if not os.path.exists(self.excel_file):
self.wk = Workbook();#创建excel工作薄
self.wk.create_sheet("书籍信息",0);#sheet表名,位置(从0开始)
# 默认选择当前活跃选项卡
self.wb =self.wk['书籍信息']
self.wb.append(['排名','书名','评论数','推荐数','作者','出版时间','出版社','价格','原价','折数','电子书价格']);#横向插入数据
self.wk.save(self.excel_file)
self.wk_load = load_workbook(filename=self.excel_file)
self.wb_load = self.wk_load['书籍信息']
def nr1(self,number):
shuj_list1=shuj(number)## 循环爬取到的数据
for i in shuj_list1:
self.wb_load.append(i)## 写入数据
self.wk_load.save(filename=self.excel_file)## 数据保存
if __name__=="__main__":
for number in range(1,26):# number为网页的页数
Excel_write().nr1(number)
5.运行结果