爬虫

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>&nbsp;<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">&yen;(.*?)</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页书籍数据。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值