10.4---Python入门之-爬虫-虎嗅网站内容解析及,及结果保存MySQL表

"""


"""
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个

红包金额最低5元

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

抵扣说明:

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

余额充值