request+BeautifulSoup Top 500 本五星好评书籍

网页分析

节约时间,不废话介绍了,直接上例子!!!
我们就使用 requests 和 BeautifulSoup来写一个爬虫

作为一个爱看书的你(说的跟真的似的)在这里插入图片描述
怎么能发现好书呢? 所以我们学习 500 本好五星评书籍 怎么样?
在这里插入图片描述
ok 接下来就是学习 python 的正确姿势,请在电脑的陪同下边看本文边练习。

首先我们要对我们的目标网站进行分析先摸清对方的底我们才能战无不胜
在这里插入图片描述
打开这个书籍排行榜的地址
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 标签中
在这里插入图片描述
那么我们等会就可以使用BeautifulSoup来进行过滤我们要的信息一顿分析完了之后接下来撸代码了。
在这里插入图片描述

主要思路

使用 page 变量来实现翻页
我们使用 requests 请求当当网
然后将返回的 HTML 进行BeautifulSoup解析
解析完之后就把内容存到文件中
在这里插入图片描述
请求当当网当我们请求成功之后拿到源代码
在这里插入图片描述
拿到源代码了就要对其解析使用BeautifulSoup获取我们想要的关键信息获取到了之后我们封装一下数据

打印一下看看结果

在这里插入图片描述
随后再把书的封面给下载下来,在这里插入图片描述

没毛病!!!获取完 500 本书的数据之后存到 当当图书.xlsx文件
在这里插入图片描述
完成,前 500 本书的数据就被我们拿到啦
在这里插入图片描述

这是成果:

在这里插入图片描述
在这里插入图片描述

以下是全部代码:

import requests
import csv
from bs4 import BeautifulSoup
from lxml import etree
import xlwt
import os.path
import re

def get_content(url):
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'}
    try:
        response = requests.get(url,headers)
        if response.status_code == 200:
            return response.text
    except requests.RequestException as e:
        print(e)
        return None

book = xlwt.Workbook(encoding='utf-8', style_compression=0)

sheet = book.add_sheet('豆瓣电影Top250', cell_overwrite_ok=True)
sheet.write(0, 0, '排名')
sheet.write(0, 1, '名称')
sheet.write(0, 2, '评论')
sheet.write(0, 3, '图片')
sheet.write(0, 4, '详情页')
sheet.write(0, 5, '价钱')
sheet.write(0, 6, '作者')

n = 1



def get_data(response):
    soup = BeautifulSoup(response,'lxml')
    all_list = soup.find(class_="bang_list clearfix bang_list_mode").find_all('li')
    item = {}
    for i in all_list:
        ranking = i.find('div').string
        title = i.find('div',class_="name").find('a').text
        pf = i.find('div',class_="biaosheng").find('span').string
        Images = i.find('a').find('img').get('src')
        ditail = i.find('a').get('href')
        monmy = i.find('p').find('span',class_="price_n").string.strip('¥')
        if i.find(class_="publisher_info").find('a') is not None:   # 处理没有找到相应标签的 并继续执行下去
            aoter = i.find(class_="publisher_info").find('a').text
        else:
            aoter = 'NOT AVAILABLE'
        print('爬取===>','\n' + ranking,'\n',title,'\n',pf,'\n',Images,'\n',ditail,'\n',monmy,'\n',aoter)

        save_Images(Images,title)
        save_csv(ranking,title,pf,Images,ditail,monmy,aoter)


def save_csv(ranking,title,pf,Images,ditail,monmy,aoter):
    global n
    sheet.write(n, 0, ranking)
    sheet.write(n, 1, title)
    sheet.write(n, 2, pf)
    sheet.write(n, 3, Images)
    sheet.write(n, 4, ditail)
    sheet.write(n, 5, monmy)
    sheet.write(n, 6, aoter)
    n = n + 1



def save_Images(Images,title):
    if not os.path.exists('当当图片'):
        os.mkdir('当当图片')
    big = '[?<>|"/\:]'
    new_title = re.sub(big,"",title)
    image_data = requests.get(Images).content
    with open('当当图片\\' + new_title + '.jpg',mode='wb')as f:
        f.write(image_data)
        print('正在保存图片:',title)



def main(page):
    url = 'http://bang.dangdang.com/books/fivestars/1-' + str(page)
    print(f'=========================================正在爬取第{page}页的数据============================================')
    response = get_content(url)
    get_data(response)


if __name__ == '__main__':
    for i in range(1,26):
        main(i)
book.save(u'当当图书.xlsx')

友们你们支持是我最大的动力。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王同学在这

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值