python爬虫之爬取当当网好评Top500图书
1.找到当当网的排行榜网站
http://bang.dangdang.com/books/fivestars/01.00.00.00.00.00-recent30-0-0-1-1
这个是当当网排行榜的网站。
我们进入之后,大致就是这么一个画面
在我们点击翻页之后,我们发现网址变成了
http://bang.dangdang.com/books/fivestars/01.00.00.00.00.00-recent30-0-0-1-2
这时候,我们就发现可以用一个变量来获取不同页面的信息。
2.代码实现
首先介绍一下我们所使用到的函数库
我们将代码分为了两个部分,第一步,定义函数。第二步,对函数调用。
1.函数的定义
首先 我们把所需要的库导进来
import requests
import re
import json
<1>请求函数
def request_dangdang(url):
try:
response = requests.get(url)
if response.status_code == 200:
return response.text
except requests.RequestException:
return None
通过这个函数我们完成了对网页的访问,并返回了网页的源码。
我们需要的信息是:排名/书名/图片/作者/推荐指数/五星评分数/
“还有价格”
通过观察源码,我们发现这些信息都被放在了标签中
发现目标之后我们进行了下一步
<2>封装数据
我们发现网页的源码是这样的
<li>
<div class="list_num red">1.</div>
<div class="pic"><a href="http://product.dangdang.com/28522577.html" target="_blank"><img src="http://img3m7.ddimg.cn/83/17/28522577-1_l_7.jpg" alt="人间至美:朱光潜经典散文集" title="人间至美:朱光潜经典散文集"/></a></div>
<div class="name"><a href="http://product.dangdang.com/28522577.html" target="_blank" title="人间至美:朱光潜经典散文集">人间至美:朱光潜经典散文集</a></div>
<div class="star"><span class="level"><span style="width: 94.2%;"></span></span><a href="http://product.dangdang.com/28522577.html?point=comment_point" target="_blank">70855条评论</a><span class="tuijian">100%推荐</span></div>
<div class="publisher_info"><a href="http://search.dangdang.com/?key=朱光潜" title="朱光潜,酷威文化 出品" target="_blank">朱光潜</a>,<a href="http://search.dangdang.com/?key=酷威文化" title="朱光潜,酷威文化 出品" target="_blank">酷威文化</a> 出品</div>
<div class="publisher_info"><span>2020-05-01</span> <a href="http://search.dangdang.com/?key=花山文艺出版社" target="_blank">花山文艺出版社</a></div>
<div class="biaosheng">五星评分:<span>59788次</span></div>
到这我们就要用到伟大的正则表达式了
def parse_result(html):
partner = 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(partner,html)
for item in items:
yield [item[0], item[1], item[2], item[3], item[4], item[5], item[6]]
这里我们就是用正则表达式来提取出我们所需要的数据,并将每本书的信息返回到一个列表中。
<3>写入Data
def write_item_to_file(item):
print('Start to write in ==>' + str(item))
with open('Wndrfl book.csv', 'a', encoding='gb2312') as each:
each.write(json.dumps(item, ensure_ascii=False) + '\n')
each.close()
这个函数,在打印出Data的同时,把每一行写入到Wndrfl book.txt 文件中。
<4>主控函数
这个函数主要用来调用其他模块:
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)
2.调用函数
if __name__ == "__main__":
for i in range(1,100):
main(i)
这里我们爬取了前100页书籍数据。