一、引言
-
爬取方式:requests+bs4
-
难度:易
-
基本爬取的内容:
-
输出:页面中所有的文章的标题、内容、作者、文章分类、时间 对应上图(标题为win10python安装配置selenium 、作者是Gary、文章分类python、时间2020-7-9)
-
选做内容:
- 数据存储:txt、excel、数据库(mysql、sqlite等)
- 翻页:https://gary666.com/learn?page=2,url示例,获取所有页的文章的标题、内容、作者、类型、时间(循环实现)
- 优化代码(设置浏览器头部信息;封装爬取函数、解析函数,即涉及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()