requests+bs4爬取网页内容——以爬取网页文章信息为例

一、引言

  • 目标网址:https://gary666.com/learn

  • 爬取方式:requests+bs4

  • 难度:易

  • 基本爬取的内容:
    在这里插入图片描述

  • 输出:页面中所有的文章的标题、内容、作者、文章分类、时间 对应上图(标题为win10python安装配置selenium 、作者是Gary、文章分类python、时间2020-7-9)

  • 选做内容:

  1. 数据存储:txt、excel、数据库(mysql、sqlite等)
  2. 翻页:https://gary666.com/learn?page=2,url示例,获取所有页的文章的标题、内容、作者、类型、时间(循环实现)
  3. 优化代码(设置浏览器头部信息;封装爬取函数、解析函数,即涉及requests的封装一个函数,涉及bs4的封装一个函数,提高代码的可扩展性、方便复用;完善注释)

二、网页分析

对网页进行分析,是进行网页爬虫的重要步骤之一。(此处不会具体讲解网页分析的过程,具体可参照https://blog.csdn.net/twk121109281/article/details/90401671)
1.获取url:通过观察页面获取url地址的规律以及总的页码数:构造url地址的列表。首先我们观察每一个页面的url地址的区别,发现它有以page=“页面数”这样的规律。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
于是我们可以根据这个规律进行对网页进行循环:

for i in range(1,10):

2.接着就是发送请求,获取响应
发送请求需要我们使用requests模块,可以用下面的代码进行:

#请求网页内容
def request(num):
    # 设置浏览器头部信息
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36'
    }
    url = 'https://gary666.com/learn?page='+str(num)  # 需要请求的网页的链接
    html = requests.get(url,headers=headers)  # get方式请求数据
    # print(html.status_code)  # 查看请求的状态码(200表示请求正常)
    html.encoding = html.apparent_encoding  # 设置编码,防止由于编码问题导致文字错乱
    # print(html.text)  # 查看请求到的内容
    content = html.text
    return content

3.跟着就是提取所有文章数据
提取数据需要我们使用BeautifulSoup模块。
我们通过审查元素可以看到每一个文章模块就是一个div标签.
在这里插入图片描述
提取所有文章数据可以用下面代码进行:

# 解析需要的内容
# 解析器自带的是html.parser,也可以用lxml,兼容性更好,不过要单独安装第三方库
def soup(content):
    soup = BeautifulSoup(content, "html.parser")
    # 获取所有的文章信息
    div_list = soup.find_all("div",class_="blogs")  # 注意: 若属性名是 class 则需要在后面加个下划线,写成 class_
    return div_list

4.然后提取单个文章的所有信息
我们下面以一篇文章的标题为例,提取信息(注:我使用的是火狐浏览器)。
在这里插入图片描述
在这里插入图片描述文章的标题在<h3 class="blogtitle"></h3>标签内
于是我们用下列代码提取文章的标题:

div.find("h3").string

5.最后保存数据
我们将爬取的文章数据保存到txt文件中,如下面代码所示:

f = open("requests+bs4.txt", "w")
    for i in range(1,10):
        content=request(i)
        div_list=soup(content)
        for div in div_list:  # 循环查看每个文章的信息并存储到txt文件中
            f.write(
                "******************************************************************************************************\n")
            f.write("篇名: " + div.find("h3").string + "\n")
            f.write("作者: " + div.find("li", class_="author").string + "\n")
            f.write("类别: " + div.find("li", class_="lmname").string + "\n")
            f.write("时间: " + div.find("li", class_="timer").string + "\n")
            f.write("内容: " + div.find("p").string + "\n")
f.close()

三、完整代码

########################################################################################################################
# -*- coding: utf-8 -*-
# author:lyq
########################################################################################################################
# 导入需要用到的库
import requests
from bs4 import BeautifulSoup

#请求网页内容
def request(num):
    # 设置浏览器头部信息
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36'
    }
    url = 'https://gary666.com/learn?page='+str(num)  # 需要请求的网页的链接
    html = requests.get(url,headers=headers)  # get方式请求数据
    # print(html.status_code)  # 查看请求的状态码(200表示请求正常)
    html.encoding = html.apparent_encoding  # 设置编码,防止由于编码问题导致文字错乱
    # print(html.text)  # 查看请求到的内容
    content = html.text
    return content

# 解析需要的内容
# 解析器自带的是html.parser,也可以用lxml,兼容性更好,不过要单独安装第三方库
def soup(content):
    soup = BeautifulSoup(content, "html.parser")
    # 获取所有的文章信息
    div_list = soup.find_all("div",class_="blogs")  # 注意: 若属性名是 class 则需要在后面加个下划线,写成 class_
    return div_list

if __name__ == '__main__':
    f = open("requests+bs4.txt", "w")
    for i in range(1,10):
        content=request(i)
        div_list=soup(content)
        for div in div_list:  # 循环查看每个文章的信息并存储到txt文件中
            f.write(
                "******************************************************************************************************\n")
            f.write("篇名: " + div.find("h3").string + "\n")
            f.write("作者: " + div.find("li", class_="author").string + "\n")
            f.write("类别: " + div.find("li", class_="lmname").string + "\n")
            f.write("时间: " + div.find("li", class_="timer").string + "\n")
            f.write("内容: " + div.find("p").string + "\n")
    f.close()

四、执行结果在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值