Python爬虫实战教程:爬取网易新闻
优采云 发布时间: 2020-08-18 04:37Python爬虫实战教程:爬取网易新闻
前言
本文的文字及图片来源于网路,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。
作者: Amauri
PS:如有须要Python学习资料的小伙伴可以加点击下方链接自行获取
此文属于入门级级别的爬虫,老司机们就不用看了。
本次主要是爬取网易新闻,包括新闻标题、作者、来源、发布时间、新闻正文。
首先我们打开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库就是拿来进行网路恳求的,说白了就是模拟浏览器来获取资源。
由于我们采集的是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,异步采集。