爬取当当网 Top 500 本五星好评书籍

打开这个书籍排行榜的地址

http://bang.dangdang.com/books/fivestars/01.00.00.00.00.00-recent30-0-0-1-1

可以看到一下网页

 

每一页显示 20 本书

当我们点击下一页的时候

你可以发现地址变了

http://bang.dangdang.com/books/fivestars/01.00.00.00.00.00-recent30-0-0-1-2

也就是我们翻到第几页的时候

链接地址的最后一个参数会跟着变

那么我们等会在 python 中可以用一个变量

来实现获取不同页数的内容

可以看到

我们通过 GET 请求,获得的请求头

服务器返回的数据

我们要的就是前 500 本书的

排名

书名

图片地址

作者

推荐指数

五星评分次数

价格

通过源码我们可以看到

 

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

主要思路

使用 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)

首先需要请求当当网,使用requests模块中的get方法,发起get请求

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">&yen;(.*?)</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]
       }

如果大家学过BeautifulSoup,那么解析这段代码就很容易了

最后写到文件中

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()

整合如下:

import requests
import re
import json


def write_item_to_file(item):
   print('开始写入数据 ====> ' + str(item))
   with open('dangdang.txt', 'a', encoding='UTF-8') as f:
       f.write(json.dumps(item, ensure_ascii=False) + '\n')
       f.close()
   str_item = str(item)
  

def func2(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">&yen;(.*?)</span>.*?</li>',re.S)
    items = re.findall(pattern,html)
    print(items)
    return items


if __name__ == '__main__':
    for i in range(1, 26):
        func2(i)
    # text = "JGod is a handsome boy,but he is a ider"
    # print (re.findall('\w*o\w*', text))  # 查找有o的单词








 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值