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>(.*), html)
        # 文章正文内容,若无法匹配就返回空列表
        article = re.findall('
([\s\S]*)
'
, 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>(.*), html)
        # 文章正文内容,若无法匹配就返回空列表
        article = re.findall('
([\s\S]*)
'
, 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("搜狐网新闻爬取已完成") # 完工

由于没有Javascript的动态生成内容,所以整个代码也非常简单,等过段时间有机会的话我再爬一个有js动态生成的来给大家讲一下吧。

你可能感兴趣的:(python简易爬虫练习:搜狐网新闻爬取)