爬虫项目实战:利用爬虫模板爬取豆瓣图书Top250


概要

利用爬虫模板进行项目实战
昨天博主发了一篇爬虫:解决动态刷新、基于selenium框架的爬虫、解决登录以及验证码问题(含爬虫模板),介绍了爬虫如何解决动态刷新、基于selenium框架的爬虫、如何解决登录以及验证吗问题,以及分享了爬虫的源码:爬虫模板、基于selenium框架的爬虫模板(包含登录与验证码问题)、爬虫项目实战:爬虫模板爬取单位净值 (动态更新网址)。

今天我们再利用爬虫模板来进行简单的入门项目:爬取豆瓣图书Top250。

整体架构流程

整体架构流程基于爬虫模板
由于豆瓣图书没有使用太强的反爬机制,html源码利用F12打开开发人员工具看得到也爬得到,所以这里我们直接使用简单的爬虫模板就可以了。当然读者也可以尝试使用基于selenium的爬虫模板自己动手尝试,模板请在概要或者源码的链接里自取。

技术细节

需要做的修改:

  • Step 2: 解析网页并提取目标数据
  • Step 3: 存储数据到本地或其他持久化存储服务器中
  • Step 4: 控制流程,调用上述函数完成数据抓取任务

Step 2: 解析网页并提取目标数据

这一步是对爬取到的html源码进行解析,需要我们对html语言有一定的了解,可以简单了解一下HTML 教程- (HTML5 标准),同时还需要对BeautifulSoup有了解,可以参考python爬虫之Beautifulsoup模块用法详解
这里我们主要爬取图书的书名、作者、评分、简介。我们打开一个网页豆瓣读书 Top 250,F12打开开发人员工具,查看对应的html源码。在这里插入图片描述
可以看到
1.书名:在class为pl2的div标签的a标签里面,由于a标签没有容易找的属性,所以我们查找div标签。

data_list = []
data_list.append([i.find('a')['title'] for i in soup.find_all(name='div', attrs={'class': 'pl2'})])  # 书名 # 书名

2.作者:在class为pl的p标签里面,可以直接找。

data_list.append([i.text for i in soup.find_all(name='p',attrs={'class':'pl'})])  # 作者

3.评分:虽然也是在一个div标签里,但是它主要是在class为rating_nums的span标签里面,也是可以直接找的。

data_list.append([i.text for i in soup.find_all(name='span',attrs={'class':'rating_nums'})])  # 评分

4.简介:一样是在一个p标签里面,但它所在的span标签有class为inq,可以直接查找。不过比起其它三个,某些书没有这一项,所以有可能会对应不上,于是对于没有的,我们把它设为空。因此,我们也没办法直接查找span标签了,所以我们通过它的祖先标签tr,class值为item间接搜索它,找到的直接添加在数据列表,没有就加空字符串。

list=[]  # 简介
for i in soup.find_all(name='tr',attrs={'class':'item'}):
     if(i.find(name='span', attrs={'class': 'inq'})):  # 简介存在
         list.append(i.find(name='span',attrs={'class':'inq'}).text)
     else:  # 简介可能不存在
         list.append(' ')
data_list.append(list)

Step 3: 存储数据到本地或其他持久化存储服务器中

在step2中,我们将爬取到250本书的书名、作者、评分、简介分别存在一个列表当中,一共4个列表,再把它们放在一个大列表中。这一步要做的是就是把他们存储在txt或者其它文件当中,还是比较简单的,主要就是文件的读取而已。

with open('豆瓣图书Top250.txt','a', encoding='utf-8') as file:
	for i in range(25):
        file.write("书名:" + result_list[0][i] + '\n')
        file.write("作者:" + result_list[1][i] + '\n')
        file.write("评分:" + result_list[2][i] + '\n')
        file.write("简介:" + result_list[3][i] + '\n')
        file.write('=' * 50 + '\n')

Step 4: 控制流程,调用上述函数完成数据抓取任务

这一步只需稍微修改,原因是豆瓣的每一页只有25本书,而我们要爬取的是Top250的。那么如何解决呢,观察榜单的链接可以发现榜单的每一页的链接都只是在 https://book.douban.com/top250?start= 的后面加上0、25…而已,所以简单遍历一下就可以了。

spider = MySpider()
url = "https://book.douban.com/top250?start="
for page in range(0,250,25):
    target_url=url+str(page)
    html_content = spider.get_html_content(target_url)
    if html_content:
        result_list = spider.parse_html(html_content)
        spider.store_data(result_list)
    else:
        print("网页访问失败")

结果

部分结果如图
在这里插入图片描述

源码

爬虫模板请看爬虫:解决动态刷新、基于selenium框架的爬虫、解决登录以及验证码问题(含爬虫模板)

import requests
from bs4 import BeautifulSoup
from fake_useragent import UserAgent
from tqdm import trange


class MySpider():
    def __init__(self):
        pass

    # Step 1: 访问网页并获取响应内容
    def get_html_content(self, url):
        headers = {
            'User-Agent': UserAgent().random
        }  # 请求头,爬虫程序通过加上请求头伪装成浏览器
        data = {'name': 'huoyouxing'}
        try:
            response = requests.get(url, data=data, headers=headers)
            response.raise_for_status()  # 判断返回的Response类型状态是不是200
            response.encoding = response.apparent_encoding  # 从内容中分析出的响应内容编码
            html_content = response.text  # 网页内容
            return html_content  # 返回网页内容
        except Exception as e:
            print(f"网络请求异常:{e}")
            return None

    # Step 2: 解析网页并提取目标数据
    def parse_html(self, html_content):
        soup = BeautifulSoup(html_content, 'html.parser')  # 解析 html 数据
        # TODO:根据需求编写解析代码,并将结果保存到合适的数据结构中
        data_list = []
        data_list.append(
            [i.find('a')['title'] for i in soup.find_all(name='div', attrs={'class': 'pl2'})])  # 书名
        data_list.append([i.text for i in soup.find_all(name='p', attrs={'class': 'pl'})])  # 作者
        data_list.append([i.text for i in soup.find_all(name='span', attrs={'class': 'rating_nums'})])  # 评分
        list = []  # 简介
        for i in soup.find_all(name='tr', attrs={'class': 'item'}):
            if i.find(name='span', attrs={'class': 'inq'}):  # 简介存在
                list.append(i.find(name='span', attrs={'class': 'inq'}).text)
            else:  # 简介可能不存在
                list.append(' ')
        data_list.append(list)
        return data_list

    # Step 3: 存储数据到本地或其他持久化存储服务器中
    def store_data(self, result_list):
        # TODO:编写存储代码,将数据结果保存到本地或其他服务器中
        with open('豆瓣图书Top250.txt', 'a', encoding='utf-8') as file:
            for i in range(25):
                file.write("书名:" + result_list[0][i] + '\n')
                file.write("作者:" + result_list[1][i] + '\n')
                file.write("评分:" + result_list[2][i] + '\n')
                file.write("简介:" + result_list[3][i] + '\n')
                file.write('=' * 50 + '\n')


# Step 4: 控制流程,调用上述函数完成数据抓取任务
if __name__ == '__main__':
    spider = MySpider()
    url = "https://book.douban.com/top250?start="
    for page in trange(0, 250, 25):
        target_url = url + str(page)
        html_content = spider.get_html_content(target_url)
        if html_content:
            result_list = spider.parse_html(html_content)
            spider.store_data(result_list)
        else:
            print("网页访问失败")

  • 36
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
你好!对于爬取菜谱网站,你可以使用 Python 的 requests 和 BeautifulSoup 库来实现。首先,你需要发送请求获取网页的 HTML 内容,然后使用 BeautifulSoup 解析该内容,提取出你所需的菜谱信息。 以下是一个简单的示例代码,以爬取美食天下网站(www.meishij.net)为例: ```python import requests from bs4 import BeautifulSoup def get_recipe(url): response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') # 在这里根据网页结构提取菜谱信息 # 例如,获取菜名和食材 recipe_name = soup.find('h1', class_='recipe-title').text.strip() ingredients = soup.find('div', class_='particulars').ul.find_all('li') ingredient_list = [] for ingredient in ingredients: ingredient_list.append(ingredient.text.strip()) # 输出菜谱名称和食材列表 print("菜谱名称:", recipe_name) print("食材列表:", ingredient_list) # 菜谱详情页的URL recipe_url = 'https://www.meishij.net/1' get_recipe(recipe_url) ``` 对于爬取豆瓣 Top250 电影榜单,同样可以使用 requests 和 BeautifulSoup 库来实现。以下是一个简单的示例代码: ```python import requests from bs4 import BeautifulSoup def get_top250(): url = 'https://movie.douban.com/top250' response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') movie_list = soup.find('ol', class_='grid_view').find_all('li') for movie in movie_list: # 获取电影排名、名称和评分 rank = movie.find('em').text title = movie.find('span', class_='title').text rating = movie.find('span', class_='rating_num').text # 输出电影信息 print("排名:", rank) print("名称:", title) print("评分:", rating) print() get_top250() ``` 以上代码只是一个简单示例,你可以根据具体的网页结构和需求进行相应的修改和扩展。希望能对你有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

cxlhyx

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

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

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

打赏作者

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

抵扣说明:

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

余额充值