立即注册
 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 491|回复: 0

python爬虫教程之爬取当当网 Top 500 本五星好评书籍

[复制链接]

该用户从未签到

3

主题

6

帖子

27

积分

注册时间
2020-1-6
最后登录
2020-1-14
发表于 2020-1-14 16:47:27|显示全部楼层 |阅读模式
我们使用 requests 和 re 来写一个爬虫
作为一个爱看书的你(说的跟真的似的)
怎么能发现好书呢?
所以我们
爬取当当网的前 500 本好五星评书籍
怎么样?
YfnNqNv7VnT4Nn4K.jpg



ok
接下来就是
学习 python 的正确姿势
请在电脑的陪同下
边看本文边练习
首先我们要对我们的目标网站进行分析
先摸清对方的底
我们才能战无不胜


打开这个书籍排行榜的地址
http://bang.dangdang.com/books/fivestars/01.00.00.00.00.00-recent30-0-0-1-1
我们可以看到是这样的一个网页
GPp912o5jf4ZNpMP.jpg



每一页显示 20 本书
当我们点击下一页的时候
你可以发现地址变了
http://bang.dangdang.com/books/fivestars/01.00.00.00.00.00-recent30-0-0-1-2
也就是我们翻到第几页的时候
链接地址的最后一个参数会跟着变
那么我们等会在 python 中可以用一个变量
来实现获取不同页数的内容
接着
用我们之前说的 Chrome 骚操作
来分析一下
我们要的内容是怎么请求的
以及
返回给我们的源代码是什么样的
可以看到
我们通过 GET 请求
GNn3Ubn6cN3eC6jZ.jpg



我们的请求头

N9wdW2F2960bdafF.jpg



这是服务器返回来的数据

Szm4D8M9MpR8r8DD.jpg



接着我们再来分析一下我们要抓取的关键信息

NFDxmvDtTNVNcT3M.jpg



我们要的就是前 500 本书的:
排名
书名
图片地址
作者
推荐指数
五星评分次数
价格

通过源码我们可以看到

这些信息被放在了 <li> 标签中
N5aTTOoCdN3AKfNE.jpg



vm9i88J16yXq4nrz.jpg



那么我们等会就可以使用
年轻人,不会正则表达式你睡得着觉?有点出息没有?
来进行过滤我们要的信息
一顿分析完了之后
接下来撸代码了


主要思路
使用 page 变量来实现翻页


我们使用 requests 请求当当网
然后将返回的 HTML 进行正则解析
我们解析完之后就把内容存到文件中
def main(page):
url = 'http://bang.dangdang.com/books/fivestars/01.00.00.00.00.00-recent30-0-0-1-' + str(page)
html = request_dandan(url)
items = parse_result(html) # 解析过滤我们想要的信息

for item in items:
write_item_to_file(item)请求当当网
当我们请求成功之后
拿到源代码
def request_dandan(url):
try:
response = requests.get(url)
if response.status_code == 200:
return response.text
except requests.RequestException:
return None拿到源代码了
就要对其解析
使用正则表达式获取我们想要的关键信息
获取到了之后我们封装一下数据
def parse_result(html):
pattern = re.compile('<li>.*?list_num.*?(\d+).</div>.*?<img src="(.*?)".*?class="name".*?title="(.*?)">.*?class="star">.*?class="tuijian">(.*?)</span>.*?class="publisher_info">.*?target="_blank">(.*?)</a>.*?class="biaosheng">.*?<span>(.*?)</span></div>.*?<p><span\sclass="price_n">¥(.*?)</span>.*?</li>',re.S)
items = re.findall(pattern,html)
for item in items:
yield {
'range': item[0],
'iamge': item[1],
'title': item[2],
'recommend': item[3],
'author': item[4],
'times': item[5],
'price': item[6]
}打印一下看看结果
for item in items:
print(item)可以看到这样的数据

Gd4pzLLSbzePb9r2.jpg



没毛病
现在我们获取的是第 1 页的数据
如何自动获取 25 页 500 条数据呢
来个 for 循环呗
if __name__ == "__main__":
for i in range(1,26):
main(i)获取完 500 本书的数据之后
存到 book.txt 文件
def write_item_to_file(item):
print('开始写入数据 ====> ' + str(item))
with open('book.txt', 'a', encoding='UTF-8') as f:
f.write(json.dumps(item, ensure_ascii=False) + '\n')
f.close()完成
项目跑起来
nI5S2rBOPP1p2ALF.jpg



jIIszscCuYccz8Bx.jpg



打开我们存储的 book.txt 看看
iJR3rzwE3Y0yYzZL.jpg



前 500 本书的数据就被我们拿到啦
Ta3UVf1N15CWUwCH.jpg



本篇完。


完整代码:私信“当当”自动获取。
需要的朋友,重要的事情说三遍!
私信“当当”这两个字,即可自动获取!
私信“当当”这两个字,即可自动获取!
私信“当当”这两个字,即可自动获取!
ok
咱们下回再见

回复 天涯海角搜一下: 百度 谷歌 360 搜狗 搜搜 有道 谷粉 雅虎 必应 即刻

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表