zoukankan      html  css  js  c++  java
  • Python爬虫实战教程:爬取网易新闻

    前言

    本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

    作者: Amauri

    PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取

    http://note.youdao.com/noteshare?id=3054cce4add8a909e784ad934f956cef

    此文属于入门级级别的爬虫,老司机们就不用看了。

    本次主要是爬取网易新闻,包括新闻标题、作者、来源、发布时间、新闻正文。

    首先我们打开163的网站,我们随意选择一个分类,这里我选的分类是国内新闻。然后鼠标右键点击查看源代码,发现源代码中并没有页面正中的新闻列表。这说明此网页采用的是异步的方式。也就是通过api接口获取的数据。

    那么确认了之后可以使用F12打开谷歌浏览器的控制台,点击Network,我们一直往下拉,发现右侧出现了:"... special/00804KVA/cm_guonei_03.js? .... "之类的地址,点开Response发现正是我们要找的api接口。 在这里插入图片描述

    可以看到这些接口的地址都有一定的规律:“cm_guonei_03.js”、 “cm_guonei_04.js”,那么就很明显了:

    http://temp.163.com/special/0...*).js

    上面的连接也就是我们本次抓取所要请求的地址。

    接下来只需要用到的python的两个库:

    • requests

    • json

    • BeautifulSoup

    requests库就是用来进行网络请求的,说白了就是模拟浏览器来获取资源。

    由于我们采集的是api接口,它的格式为json,所以要用到json库来解析。BeautifulSoup是用来解析html文档的,可以很方便的帮我们获取指定div的内容。

    下面开始编写我们爬虫:

    第一步先导入以上三个包:

    import json
    import requests
    from bs4 import BeautifulSoup

    接着我们定义一个获取指定页码内数据的方法:

     1 def get_page(page):
     2     url_temp = 'http://temp.163.com/special/00804KVA/cm_guonei_0{}.js'
     3     return_list = []
     4     for i in range(page):
     5         url = url_temp.format(i)
     6         response = requests.get(url)
     7         if response.status_code != 200:
     8             continue
     9         content = response.text  # 获取响应正文
    10         _content = formatContent(content)  # 格式化json字符串
    11         result = json.loads(_content)
    12         return_list.append(result)
    13     return return_list

    这样子就得到每个页码对应的内容列表:

    在这里插入图片描述

    之后通过分析数据可知下图圈出来的则是需要抓取的标题、发布时间以及新闻内容页面。

    在这里插入图片描述

    既然现在已经获取到了内容页的url,那么接下来开始抓取新闻正文。

    在抓取正文之前要先分析一下正文的html页面,找到正文、作者、来源在html文档中的位置。

    我们看到文章来源在文档中的位置为:id = "ne_article_source" 的 a 标签 作者位置为:class = "ep-editor" 的 span 标签 正文位置为:class = "post_text" 的 div 标签

    下面试采集这三个内容的代码:

     1 def get_content(url):
     2     source = ''
     3     author = ''
     4     body = ''
     5     resp = requests.get(url)
     6     if resp.status_code == 200:
     7         body = resp.text
     8         bs4 = BeautifulSoup(body)
     9         source = bs4.find('a', id='ne_article_source').get_text()
    10         author = bs4.find('span', class_='ep-editor').get_text()
    11         body = bs4.find('div', class_='post_text').get_text()
    12     return source, author, body

    到此为止我们所要抓取的所有数据都已经采集了。

    那么接下来当然是把它们保存下来,为了方便我直接采取文本的形式来保存。下面是最终的结果:

    在这里插入图片描述

    格式为json字符串,“标题” : [ ‘日期’, ‘url’, ‘来源’, ‘作者’, ‘正文’ ]。

    要注意的是目前实现的方式是完全同步的,线性的方式,存在的问题就是采集会非常慢。主要延迟是在网络IO上,可以升级为异步IO,异步采集。

  • 相关阅读:
    4.23计算机网络
    CF436F Banners
    CF1467C Three Bags
    LG P3247 [HNOI2016]最小公倍数
    LG P5473 [NOI2019] I 君的探险
    LG P3261 [JLOI2015]城池攻占
    LG P4149 [IOI2011]Race
    LG P3181 [HAOI2016]找相同字符
    SP7258 SUBLEX
    SP1811 LCS
  • 原文地址:https://www.cnblogs.com/Qqun821460695/p/12001703.html
Copyright © 2011-2022 走看看