使用PyCharm编写爬虫程序,爬取当当网 Top 500 本五星好评书籍

使用PyCharm编写爬虫程序,爬取当当网 Top 500 本五星好评书籍

我们就使用 requests 和 re 来写一个爬虫

  • 提问:
    怎么能发现好书呢?
  • 回答:
    不知道 哈哈哈哈哈~~~~~
    所以我们爬取当当网的前 500 本好五星评书籍

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

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

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 中可以用一个变量
来实现获取不同页数的内容
也就是我们翻到第几页的时候
链接地址的最后一个参数会跟着变
那么我们等会在 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:
        print(item)  # 打印测试获取到的信息
        # 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">.*?target="_blank">(.*?)</a>.*?class="tuijian">(.*?)</span>.*?class="publisher_info">.*?target="_blank">(.*?)</a>.*?class="publisher_info">.*?target="_blank">(.*?)</a>.*?class="biaosheng">.*?<span>(.*?)</span></div>.*?<p><span\sclass="price_n">&yen;(.*?)</span>.*?<span\sclass="price_r">&yen;(.*?)</span>.*?<span\sclass="price_s">(.*?)</span>.*?</li>',
        re.S)
    items = re.findall(pattern, html)
    for item in items:
        yield {
            '排名': item[0],
            '图书封面': item[1],
            '图书名': item[2],
            '图书评论数': item[3],
            '五星评分': item[4],
            '作者': item[5],
            '出版社': item[6],
            '五星评分次数': item[7],
            '图书折后价': item[8],
            '图书原价': item[9],
            '折扣额度': item[10]
        }

打印下看看结果
打开此处注释即可
在这里插入图片描述
在这里插入图片描述
没毛病
下面我们直接获取25页500条数据
编写for循环

# 自动获取25页500条数据
for i in range(1, 26):
    main(i)

存储到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()

完成启动项目
在这里插入图片描述
在这里插入图片描述
整体代码如下

import json
import re

import requests


# 封装一个执行函数
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:
        # print(item)  # 打印测试获取到的信息
        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 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()


def parse_result(html):
    '''
    :param html:
    :return:
    下标0:图书排名
    下标1:图书封面
    下标2:图书名
    下标3:图书评论数
    下标4:五星评分
    下标5:作者名称
    下标6:出版社
    下标7:五星评分次数
    下标8:图书折后价
    下标9:图书原价 <span\sclass="price_r">&yen;(.*?)</span>.*?
    下标10:折扣额度 <span\sclass="price_s">(.*?)</span>.*?
    '''
    pattern = re.compile(
        '<li>.*?list_num.*?(\d+).</div>.*?<img src="(.*?)".*?class="name".*?title="(.*?)">.*?class="star">.*?target="_blank">(.*?)</a>.*?class="tuijian">(.*?)</span>.*?class="publisher_info">.*?target="_blank">(.*?)</a>.*?class="publisher_info">.*?target="_blank">(.*?)</a>.*?class="biaosheng">.*?<span>(.*?)</span></div>.*?<p><span\sclass="price_n">&yen;(.*?)</span>.*?<span\sclass="price_r">&yen;(.*?)</span>.*?<span\sclass="price_s">(.*?)</span>.*?</li>',
        re.S)
    items = re.findall(pattern, html)
    for item in items:
        yield {
            '排名': item[0],
            '图书封面': item[1],
            '图书名': item[2],
            '图书评论数': item[3],
            '五星评分': item[4],
            '作者': item[5],
            '出版社': item[6],
            '五星评分次数': item[7],
            '图书折后价': item[8],
            '图书原价': item[9],
            '折扣额度': item[10]
        }


if __name__ == '__main__':
    # 自动获取25页500条数据
    for i in range(1, 26):
        main(i)
  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值