"""
"""
import urllib.request
import MySQLdb
from bs4 import BeautifulSoup
"""
自定义:
爬取 指定网页中,所有的新闻url地址 方法
"""
def parse_index_page(url):
## 获取虎嗅网站首页的内容
index_page = urllib.request.urlopen(url).read().decode("utf-8")
## 解析内容
# 创建一个Beautiful对象,用来格式化处理内容
soup = BeautifulSoup(index_page, features="html.parser")
# 过滤 所有文章url (文章的url都是a标签)
a_list = soup.select("a[href]")
# 定义一个 空set集合, 用来存放首页中所有的url
url_set = set()
# 获取 a标签中,href属性的值 (for 循环遍历 a标签数组集合,筛选出自己所需的信息)
for a_tag in a_list:
# 获取 标签中属性值方法: 标签["属性名称"]
href = a_tag["href"]
if "article" in href and "http" not in href and "/1.html" not in href:
# 由于解析出的url,有重复元素,所以需要用set集合特性,进行去重操作;
url_set.add(href)
return url_set
'''
自定义解析网站内容的方法
'''
def parse_article(url_set):
article_list = list() ## 创建一个list对象,用来存放最终解析后的结果集;
for url in url_set:
#### 1.拼接为完整的网站url
url = "https://www.huxiu.com" + url
print("网址: " + url) # 打印结果查看
#### 2.调用打开网页方法,进入解析后的url链接中,获取该网页的全部数据
the_page = urllib.request.urlopen(url)
## 3.调用BeautifulSoup方法,对网页内容进行格式化.[格式化时,为防止报错,需要指定得到网页内容的格式,]
page_soup = BeautifulSoup(markup=the_page, features="html.parser")
#### 4.获取标题: (目前测试两种方法:)
## 方法1:直接用标签访问的方法
# title = page_soup.title # 返回标签
# title = page_soup.title.get_text() # 用get_text() 方法,把标签转为text文本;
# title = page_soup.title.string # 把得到的标签用.string方法,得到文本值
## 方法2: 用CSS选择器
## [返回的值为list集合,如果需要得到具体的内容,就需要用索引获取值,且转换为string类型]
# title = page_soup.select("title") # 返回集合
title = page_soup.select("title")[0].string # 得到具体值
## 打印结果
print(title) ## 打印文本内容的抬头,标题
#### 5.获取时间 [有的网页中没有时间标签,会报错,此处注销]
# time = page_soup.select(".article__time")[0].string
# print(time)
############################
# 3 三个参数查询,找不到具体的值,查询失败,后期用到了再去学习
#### 6.获取收藏个数
#### 7.获取评论个数
#### 8.获取点赞个数
############################
#### 9.获取文章内容
content_value = ""
## (1) 查找出我们需要的文章内容标签标识,并得到返回值. (返回一个数组集合)
# content = page_soup.select(".article__content") # 获取class中的,等于"article__content"标识的值.文章内容标识
content = page_soup.select("#article-content") # 用id的值去匹配,id标签用#标识.
# print(content)
## (2) 从得到的返回值数组中,查询出我们所需要的标签信息 [即文章内容,是被p标签包裹的,我们要得到所有的p标签内容]
if len(content) < 1:
continue
p_list = content[0].select("p")
# print(p_list)
## (3) 遍历p标签数组,解析处理文本内容信息
for p in p_list:
## 过滤掉不需要的标签信息 (这里过滤掉作者,出品等信息)
span_list = p.select("span[class=text-remarks]")
if len(span_list) > 0:
continue
## 获取正文内容
p_value = p.string
## 后期的业务逻辑处理:
# 判断:如果为空,或者为空字符串,则跳过
if p_value == None or p_value == " ":
continue
# print(p_value)
## 把最后解析好的数据(即文章内容),放入string对象中,并换行;
content_value = content_value + p.string + "\n"
print(content_value)
article_list.append((url, title, content_value))
return article_list
'''
保存数据到MySQL中
'''
def save_article_to_MySQL(article_list):
## 1.创建连接MySQL数据库的对象
db = MySQLdb.connect("192.168.66.66", "hive", "Abc123..", "python", 3306,charset="utf8")
## 2.使用cursor() 方法,创建MySQL数据库游标对象,获取操作游标:
cursor = db.cursor()
## 定义创表语句
create_table_sql="""
CREATE TABLE IF NOT EXISTS `article_huxiu` (
`url` varchar(500) DEFAULT NULL,
`title` varchar(500) DEFAULT NULL,
`content` text
)
ENGINE=InnoDB
DEFAULT CHARSET=utf8
;
"""
## 创建新表
cursor.execute("drop table if exists article_huxiu")
cursor.execute(create_table_sql)
## 定义插入表语句 (%s,占位符,获取传入的参数)
insert_sql="""
insert into article_huxiu(
url ,
title ,
content
)
values(
%s,
%s,
%s
)
"""
## 调用 executemany() 方法,传入指定的sql查询语句,以及本地处理好的数据内容
cursor.executemany(insert_sql,article_list)
## 关闭本次的游标连接
cursor.close()
## 数据库对象提交任务
db.commit()
## 数据库对象关闭本次连接
db.close()
## 自定义方法调用
## 定义需要爬取的网站URL
if __name__ == '__main__':
## 一、指定 需要爬取的网站url:
url_target = "https://www.huxiu.com"
## 二、调用上面定义的,(解析网页内容,得到url) 的方法: [返回一个set集合,无序但去重的数据集合]
url_set = parse_index_page(url_target)
## 打印解析方法返回的结果
# print(url_set) # 打印 解析出的所有url信息
## 三、循环遍历集合,遍历指定网站中的所有网页链接,获取其内容:
article_list = parse_article(url_set)
print(article_list)
## 四、保存数据到MySQL数据库
save_article_to_MySQL(article_list)
10.4---Python入门之-爬虫-虎嗅网站内容解析及,及结果保存MySQL表
最新推荐文章于 2025-04-24 17:46:29 发布