来啦,老弟
你的第一个爬虫,爬取当当网 Top 500 本五星好评书籍!我们已经知道怎么使用
Requests
进行各种请求骚操作
也知道了对服务器返回的数据如何使用
正则表达式
来过滤我们想要的内容
...
那么接下来
我们就使用 requests 和 re 来写一个爬虫
作为一个爱看书的你(说的跟真的似的)
你的第一个爬虫,爬取当当网 Top 500 本五星好评书籍!怎么能发现好书呢?
所以我们
爬取当当网的前 **500 **本好五星评书籍
怎么样?
你的第一个爬虫,爬取当当网 Top 500 本五星好评书籍!ok
接下来就是
学习 python 的正确姿势
请在电脑的陪同下
边看本文边练习
首先我们要对我们的目标网站进行分析
先摸清对方的底
我们才能战无不胜
你的第一个爬虫,爬取当当网 Top 500 本五星好评书籍!打开这个书籍排行榜的地址
http://bang.dangdang.com/books/fivestars/01.00.00.00.00.00-recent30-0-0-1-1
我们可以看到是这样的一个网页
你的第一个爬虫,爬取当当网 Top 500 本五星好评书籍!每一页显示 20 本书
当我们点击下一页的时候
你可以发现地址变了
http://bang.dangdang.com/books/fivestars/01.00.00.00.00.00-recent30-0-0-1-2
也就是我们翻到第几页的时候
链接地址的最后一个参数会跟着变
那么我们等会在 python 中可以用一个变量
来实现获取不同页数的内容
你的第一个爬虫,爬取当当网 Top 500 本五星好评书籍!接着
用我们之前说的 Chrome 骚操作
来分析一下
我们要的内容是怎么请求的
以及
返回给我们的源代码是什么样的
你的第一个爬虫,爬取当当网 Top 500 本五星好评书籍!可以看到
我们通过 GET 请求
你的第一个爬虫,爬取当当网 Top 500 本五星好评书籍!我们的请求头
你的第一个爬虫,爬取当当网 Top 500 本五星好评书籍!这是服务器返回来的数据
你的第一个爬虫,爬取当当网 Top 500 本五星好评书籍!接着我们再来分析一下我们要抓取的关键信息
你的第一个爬虫,爬取当当网 Top 500 本五星好评书籍!我们要的就是前 500 本书的
排名
书名
图片地址
作者
推荐指数
五星评分次数
价格
通过源码我们可以看到
这些信息被放在了 <li> 标签中
[图片上传失败...(image-1ff561-1548656144124)]
你的第一个爬虫,爬取当当网 Top 500 本五星好评书籍!那么我们等会就可以使用
年轻人,不会正则表达式你睡得着觉?有点出息没有?
来进行过滤我们要的信息
一顿分析完了之后
接下来撸代码了
你的第一个爬虫,爬取当当网 Top 500 本五星好评书籍!主要思路
使用 page 变量来实现翻页
我们使用 requests 请求当当网
然后将返回的 HTML 进行正则解析
由于我们暂时还没学到数据库
所以解析完之后就把内容存到文件中
<pre style="-webkit-tap-highlight-color: transparent; box-sizing: border-box; font-family: Consolas, Menlo, Courier, monospace; font-size: 16px; white-space: pre-wrap; position: relative; line-height: 1.5; color: rgb(153, 153, 153); margin: 1em 0px; padding: 12px 10px; background: rgb(244, 245, 246); border: 1px solid rgb(232, 232, 232); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">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)
</pre>
请求当当网
当我们请求成功之后
拿到源代码
<pre style="-webkit-tap-highlight-color: transparent; box-sizing: border-box; font-family: Consolas, Menlo, Courier, monospace; font-size: 16px; white-space: pre-wrap; position: relative; line-height: 1.5; color: rgb(153, 153, 153); margin: 1em 0px; padding: 12px 10px; background: rgb(244, 245, 246); border: 1px solid rgb(232, 232, 232); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">def request_dandan(url):
try:
response = requests.get(url)
if response.status_code == 200:
return response.text
except requests.RequestException:
return None
</pre>
拿到源代码了
就要对其解析
使用正则表达式获取我们想要的关键信息
获取到了之后我们封装一下数据
<pre style="-webkit-tap-highlight-color: transparent; box-sizing: border-box; font-family: Consolas, Menlo, Courier, monospace; font-size: 16px; white-space: pre-wrap; position: relative; line-height: 1.5; color: rgb(153, 153, 153); margin: 1em 0px; padding: 12px 10px; background: rgb(244, 245, 246); border: 1px solid rgb(232, 232, 232); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">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><spansclass="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]
}
</pre>
打印一下看看结果
<pre style="-webkit-tap-highlight-color: transparent; box-sizing: border-box; font-family: Consolas, Menlo, Courier, monospace; font-size: 16px; white-space: pre-wrap; position: relative; line-height: 1.5; color: rgb(153, 153, 153); margin: 1em 0px; padding: 12px 10px; background: rgb(244, 245, 246); border: 1px solid rgb(232, 232, 232); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">for item in items:
print(item)
</pre>
可以看到这样的数据
你的第一个爬虫,爬取当当网 Top 500 本五星好评书籍!没毛病
现在我们获取的是第 1 页的数据
如何自动获取 25 页 500 条数据呢
来个 for 循环呗
<pre style="-webkit-tap-highlight-color: transparent; box-sizing: border-box; font-family: Consolas, Menlo, Courier, monospace; font-size: 16px; white-space: pre-wrap; position: relative; line-height: 1.5; color: rgb(153, 153, 153); margin: 1em 0px; padding: 12px 10px; background: rgb(244, 245, 246); border: 1px solid rgb(232, 232, 232); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">if name == "main":
for i in range(1,26):
main(i)
</pre>
获取完 500 本书的数据之后
存到 book.txt 文件
<pre style="-webkit-tap-highlight-color: transparent; box-sizing: border-box; font-family: Consolas, Menlo, Courier, monospace; font-size: 16px; white-space: pre-wrap; position: relative; line-height: 1.5; color: rgb(153, 153, 153); margin: 1em 0px; padding: 12px 10px; background: rgb(244, 245, 246); border: 1px solid rgb(232, 232, 232); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">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) + '
')
f.close()
</pre>
完成
项目跑起来
你的第一个爬虫,爬取当当网 Top 500 本五星好评书籍! 你的第一个爬虫,爬取当当网 Top 500 本五星好评书籍!打开我们存储的 book.txt 看看
你的第一个爬虫,爬取当当网 Top 500 本五星好评书籍!前 500 本书的数据就被我们拿到啦
你的第一个爬虫,爬取当当网 Top 500 本五星好评书籍!本篇完
完整代码小帅b已经放到后台啦,加群:700341555就可以获取哦!
网友评论