分享

python爬虫案例|抓取当当网图书信息

 Yy3318q 2023-03-18 发布于广西

Hello,大家好,我是Vince。

因为我平时会买书学习,所以好奇想抓取下网站的图书信息。

今天主要分享是抓取当当网的图书信息。

下面直接进入实战环节。

相关包及环境准备

  1. 安装requests(pip install requests)

  2. 安装pandas库

3.pycharm环境(pycharm2020.01.05)及python3.7.4

1.网页分析

常规抓包按F12选择网页,然后刷新网页,这里选择第2页,可以发现,响应的信息在网页中,也没有经过加密处理。

图片

再看下标头信息是否有加密的情况。

图片

图片

可以看出请求方式是get,仔细观察请求网址,可以发现page_index=2应该是网页刷新的变化规律,后面可以构造url,循环多页获取信息。下面的请求标头也没有出现加密的情况。接下来可以模拟发送请求。

2.发送请求

分析完网页规律后,是get方法,直接用requests发送请求,带上请求头相关信息。代码如下

def send_requests(url):

# 请求头

headers = {
'Cookie': '__permanent_id=20230311143338916154826977894564000; ddscreen=2; pos_0_end=1678608524994; dest_area=country_id%3D9000%26province_id%3D111%26city_id%3D0%26district_id%3D0%26town_id%3D0; pos_1_end=1678619513754; pos_1_start=1678619536498; pos_9_end=1678619554530; ad_ids=31898396%2C14129493%2C6624974%2C5066933%7C%233%2C3%2C2%2C2; search_passback=bb7501071372a24b00b30d64f0010000602fca0000b30d64; __rpm=%7Cs_112100.155956512835%2C155956512836..1678624653681; __visit_id=20230312203733742309228923821562348; __out_refer=; __trace_id=20230312203733743429170795570296542',
'Referer': 'http://search.dangdang.com/?key=python%BB%FA%C6%F7%D1%A7%CF%B0&act=input',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36',

}
try:
response = requests.get(url=url, headers=headers)
if response.status_code == 200:
result = response.text
# print(result)
return result
except Exception as e:
print(e.args)

这里加了try...except捕获异常信息,状态码是否ok,返回200。

打印结果可以发现网页是ok的,可以看到加载的网页信息

图片

3.正则表达式提取信息

下面用正则表达式提取信息。

比如想要提取网页中所有标题信息,这里用到是re的findalll来匹配所有信息,用的是非贪婪匹配(.*?),意思是在网页中尽可能匹配少的信息,达到精准匹配的效果。然后从网页中可以发现标题信息有两个,一个是title='',一个是alt=''。

图片

图片

通过测试发现alt=''会更加精准把标题信息匹配出来。把要匹配的信息用()括出来。再比如要匹配价格信息,可以看到价格信息,可以看到价格信息在节点class='search_now_price'后面。为了更加精准匹配,需要带上这个class节点。

图片

发现价格不是纯数字,有字母和标点符号,这是一个小坑,后期需要做清洗。

当然也可以用re精准匹配里面的小数。而不是(.*?)非贪婪匹配了。这里我用的非贪婪匹配,后期再做清洗处理。

其他信息re正则表达式匹配比较类似,需要观察节点,然后也是用非贪婪匹配比较方便。核心代码如下

# 获取信息
data =[]
def extract_data(result):
try:
# 提取标题信息
title = re.findall('<a.*?alt='(.*?)'.*?</a>', result)
print(len(title))
# 提取价格
price = re.findall('<span class='search_now_price'>(.*?)</span>', result)
print(len(price))
# 提取作者
author = re.findall('<span>.*?title='(.*?)'>.*?</span><span >.*?</span>', result)
print(len(author))
# 提取出版日期
publish_date = re.findall('<span >(.*?)</span>', result)
print(len(publish_date))
# 提取出版社
publish_company = re.findall('<span>.*?name='P_cbs'.*?title='(.*?)'.*?</span>', result)
print(len(publish_company))
#
提取书籍介绍
book_detail = re.findall('<p class='detail' >(.*?)</p>',result)
print(len(book_detail))
# 提取店铺名
shopName = re.findall('<a.*?name='itemlist-shop-name'.*?title='.*?'>(.*?)</a>', result)
print(len(shopName))
for j in range(len(title)):
data.append([title[j], price[j],author[j], publish_date[j],
publish_company[j],book_detail[j],shopName[j]])
except Exception as e:
print(e.args)

return data

这里同样用了try...except来捕捉异常信息,有些信息有空的情况,可以让程序继续执行。

4.保存信息

保存信息用的是pandas,保存在csv表格中。代码如下:


def save_info(data):
columns = ['标题','价格','作者','出版日期','出版社','书籍介绍','店铺名']
df = pd.DataFrame(data,columns=columns)
df.to_csv('当当网图书信息.csv',encoding='utf-8')

然后运行主程序,

核心代码如下:

if __name__=='__main__':
start = time.time()
for i in range(1,300):
print('正在抓取第{}'.format(i))
url = view_url(i)
result = send_requests(url)
data = extract_data(result)
save_info(data)
end = time.time()
print('work_time:{}min'.format(round((end-start)/60,2)))

5.运行结果

图片

图片

总共用了3分钟左右的时间,总共抓取10000多条信息,速度还可以。

最后做下简单的数据清洗和可视化

这里用到的是Anaconda数据科学平台中的jupyter notebook环境。

下载链接:https://www./products/distribution

可以下载个人版本玩玩。

图片

首先导入相关包

图片

加载数据并查看前5行数据

图片

查看数据类型

图片

可以发现总共10483条数据,书籍介绍只有694条,说明很多信息是空值。价格是字符串类型需要做清洗转换为float类型,出版日期是字符串类型,需要做清洗转化为时间类型数据。

价格字段清洗

价格字段中有字母和标点符号,需要把它替换掉,这里用replace替换

图片

出版日期字段清洗

出版日期有个斜杠符号,需要把它清洗掉。

图片

出版日期趋势分布:

图片

图片

从图表可以看出,python机器学习书籍从2016年开始,出版的数量在快速的上升,直到2022年进入平稳期,个人简单分析,16年刚好有个事件阿法狗打败某围棋冠军,人工智能开始受到关注,也就带动机器学习书籍的火热及出版。

价格分布情况:

图片

图片

价格主要在40到80元之间,占比一半左右。其次是80到120元之间。超过120元的占比比较少。

出版社数量分布:

图片

图片

可以看出,人民邮电出版社,清华大学出版社,机械工业出版社占比比较多。

平均价格Top20的出版社

图片

平均价格Top20的店铺

图片

以上是简单的数据清洗和可视化分析。

总结

  1. 主要用python采集当当网图书信息并做简单的可视化分析。学习点是如何精确用re正则表达式提取网页信息。

  2. 学习如何从数据中挖掘关键信息。

  3. 本文仅供参考学习,如有不足之处,欢迎大家指正。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约