天天看点

python简易爬虫练习:搜狐网新闻爬取

python爬虫:搜狐网新闻爬取

python爬虫练习:搜狐网新闻爬取

帮朋友写了一个课程设计,目的是获得新闻页面的标题、时间以及正文内容。

写的很简单,并没有很复杂的知识,应该很好理解。

首先是导入我们需要的各种库,其中requests是第三方库,记得用pip安装一下

import requests
    import re
    import os      

首先要从搜狐主页面上获得所需要的所有html代码

# 获得搜狐页面的内容
def get_all_url(url):
    try:
        # 获取总的html内容
        html = getHTMLText(url)
        return html
    except:
        print("failed connect")


# 获得html内容,套路内容
def getHTMLText(url):
    try:
        # requests爬虫的正常操作,访问获得返回
        r = requests.get(url)
        # 判断是否成功?
        r.raise_for_status()
        # 改变编码方式,转为UTF-8
        r.encoding = r.apparent_encoding
        # 返回html正文内容
        return r.text
    except:
        return ''      

然后我们需要分析出html中所有的超链接,这里需要调用一下re库。

如果不会正则表达式的话,自己去学,这里不多讲了。

需要注意的是,这里获得的是所有的url链接,并没有分析该url是否是新闻的url。当然,后面有判断

# 分析内容,获得我需要的链接们
def parsePage(html):
    plt = []
    try:
        # findall函数的意思:(pattern, string),将所有匹配项组成一个列表,并返回该列表
        # 匹配符合url链接格式的所有内容
        plt = re.findall('http://www\.sohu\.com(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', html)

    except:
        print("介个地方出错了")
    print(plt)
    return plt      

这里同样用re库分析出新闻的标题,发出时间以及新闻正文内容。

注意不同的网站有不同的html习惯写法,写爬虫的时候肯定是要花一些时间来分析网页,按F12就可以查看所有的html代码了。

由于我不确定图片之类的算不算正文,所以我就把正文的一大坨东西全部拿了进来。

# 正则分析获得时间与标题,嘻嘻
def title_and_time(html):
    tat = []
    try:
        # findall函数的意思:(pattern, string),将所有匹配项组成一个列表,并返回该列表
        # 获得时间,若无法匹配就返回空列表
        time = re.findall('dateUpdate" content="(.*)" />', html)
        # 获得标题,若无法匹配就返回空列表
        title = re.findall("title>(.*)</title", html)
        # 文章正文内容,若无法匹配就返回空列表
        article = re.findall('<article class="article" id="mp-editor">([\s\S]*)</article>', html)
        # 三者组成一个列表,传回去嘻嘻
        # 若其中有的为空列表,则不占用位置
        # 因此如果是正规的新闻页面,tat的长度len应该是3
        tat = title + time + article
    except:
        print("捏个地方出错了")
    return tat      

以上就是我们所需要的所有方法了,下面我把全部代码放出来,供大家参考。

# code="utf-8"
# 人生苦短,我用python
# 转行不易,请多鼓励


import requests
import re
import os


# 刚过完61儿童节的二十多岁的小朋友们上车啦,here we go



# 获得搜狐页面的内容
def get_all_url(url):
    try:
        # 获取总的html内容
        html = getHTMLText(url)
        return html
    except:
        print("failed connect")


# 获得html内容,套路内容
def getHTMLText(url):
    try:
        # requests爬虫的正常操作,访问获得返回
        r = requests.get(url)
        # 判断是否成功?
        r.raise_for_status()
        # 改变编码方式,转为UTF-8
        r.encoding = r.apparent_encoding
        # 返回html正文内容
        return r.text
    except:
        return ''

# 分析内容,获得我需要的链接们
def parsePage(html):
    plt = []
    try:
        # findall函数的意思:(pattern, string),将所有匹配项组成一个列表,并返回该列表
        # 匹配符合url链接格式的所有内容
        plt = re.findall('http://www\.sohu\.com(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', html)

    except:
        print("介个地方出错了")
    print(plt)
    return plt



# 正则分析获得时间与标题,嘻嘻
def title_and_time(html):
    tat = []
    try:
        # findall函数的意思:(pattern, string),将所有匹配项组成一个列表,并返回该列表
        # 获得时间,若无法匹配就返回空列表
        time = re.findall('dateUpdate" content="(.*)" />', html)
        # 获得标题,若无法匹配就返回空列表
        title = re.findall("title>(.*)</title", html)
        # 文章正文内容,若无法匹配就返回空列表
        article = re.findall('<article class="article" id="mp-editor">([\s\S]*)</article>', html)
        # 三者组成一个列表,传回去嘻嘻
        # 若其中有的为空列表,则不占用位置
        # 因此如果是正规的新闻页面,tat的长度len应该是3
        tat = title + time + article
    except:
        print("捏个地方出错了")
    return tat




# 以下是正式开始操作主函数

def main():
    # 开始访问搜狐网,并获得对应html代码
    html = get_all_url("http://www.sohu.com/")
    # 正则表达式分析取出新闻url链接
    sp_url = parsePage(html)
    # 设置一个列表,用于存储新闻标题以及时间
    answer = []

    # 判断保存的路径存在不 不存在就创建一个呗嘻嘻嘻嘻
    path = "新闻//"
    # 如果路径存在则返回True,否则返回false
    isExists = os.path.exists(path)

    # 判断结果
    if not isExists:
        # 如果不存在则创建目录
        # 创建目录操作函数
        os.makedirs(path)

        print(path + ' 创建成功')
    else:
        # 如果目录存在则不创建,并提示目录已存在
        print(path + ' 目录已存在')

    # 遍历每一个新闻url链接
    for url in sp_url:
        # 获得每个新闻页面的html代码
        html_sp = get_all_url(url)
        # 获得每个页面的标题以及时间
        title_time = title_and_time(html_sp)

        # 设置一个临时变量
        tt=0
        # 如果是正常新闻的话,则len==3,即可对tt重新赋值
        if(len(title_time) == 3):
            tt = title_time[0] + "\n" + title_time[1] + "\n" + title_time[2] + "\n"

        # 判断一下是正常新闻,即可写入answer
        if tt != 0:
            print(tt)  # 程序运行期间随便输出点东西,不然就很无聊
            answer.append(tt)   # 将这个新闻作为一个字符串element添加到answer最后


            # 写入文件
            try:
                # 每个新闻的题目自动生成一个txt文件
                with open("新闻//" + title_time[0] + ".txt", "w+") as f:
                    # 参数为列表,writelines可以将每一个元素写入txt
                    f.writelines(answer)
                    # 关闭文件,其实不写也一样的
                    f.close()
            except:
                pass


# 主程序运行
if __name__ == '__main__':
    main()


# 输出一句话,告诉我结束了
print("搜狐网新闻爬取已完成")

# 完工