一、引言

  • 目标网址:https://gary666.com/learn
  • 爬取方式:requests+bs4
  • 难度:易
  • 基本爬取的内容:
  • request爬取网页 爬取网页内容_html

  • 输出:页面中所有的文章的标题、内容、作者、文章分类、时间 对应上图(标题为win10python安装配置selenium 、作者是Gary、文章分类python、时间2020-7-9)
  • 选做内容:
  1. 数据存储:txt、excel、数据库(mysql、sqlite等)
  2. 翻页:https://gary666.com/learn?page=2,url示例,获取所有页的文章的标题、内容、作者、类型、时间(循环实现)
  3. 优化代码(设置浏览器头部信息;封装爬取函数、解析函数,即涉及requests的封装一个函数,涉及bs4的封装一个函数,提高代码的可扩展性、方便复用;完善注释)

二、网页分析

对网页进行分析,是进行网页爬虫的重要步骤之一。(此处不会具体讲解网页分析的过程,具体可参照)

1.获取url:通过观察页面获取url地址的规律以及总的页码数:构造url地址的列表。首先我们观察每一个页面的url地址的区别,发现它有以page=“页面数”这样的规律。

request爬取网页 爬取网页内容_request爬取网页_02


request爬取网页 爬取网页内容_html_03


request爬取网页 爬取网页内容_封装_04


于是我们可以根据这个规律进行对网页进行循环:

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标签.

request爬取网页 爬取网页内容_txt文件_05


提取所有文章数据可以用下面代码进行:

# 解析需要的内容
# 解析器自带的是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.然后提取单个文章的所有信息

我们下面以一篇文章的标题为例,提取信息(注:我使用的是火狐浏览器)。

request爬取网页 爬取网页内容_封装_06


request爬取网页 爬取网页内容_txt文件_07

文章的标题在<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()

四、执行结果

request爬取网页 爬取网页内容_request爬取网页_08