此文属于入门级级别的爬虫,老司机们就不用看了。html
本次主要是爬取网易新闻,包括新闻标题、做者、来源、发布时间、新闻正文。python
首先咱们打开163的网站,咱们随意选择一个分类,这里我选的分类是国内新闻。而后鼠标右键点击查看源代码,发现源代码中并无页面正中的新闻列表。这说明此网页采用的是异步的方式。也就是经过api接口获取的数据。面试
那么确认了以后可使用F12打开谷歌浏览器的控制台,点击Network,咱们一直往下拉,发现右侧出现了:"... special/00804KVA/cm_guonei_03.js? .... "之类的地址,点开Response发现正是咱们要找的api接口。json
能够看到这些接口的地址都有必定的规律:“cm_guonei_03.js”、 “cm_guonei_04.js”,那么就很明显了:api
http://temp.163.com/special/0...*).js
上面的链接也就是咱们本次抓取所要请求的地址。
接下来只须要用到的python的两个库:浏览器
- requests
- json
- BeautifulSoup
requests库就是用来进行网络请求的,说白了就是模拟浏览器来获取资源。
因为咱们采集的是api接口,它的格式为json,因此要用到json库来解析。BeautifulSoup是用来解析html文档的,能够很方便的帮咱们获取指定div的内容。网络
下面开始编写咱们爬虫:app
第一步先导入以上三个包:异步
import json import requests from bs4 import BeautifulSoup
接着咱们定义一个获取指定页码内数据的方法:post
def get_page(page): url_temp = 'http://temp.163.com/special/00804KVA/cm_guonei_0{}.js' return_list = [] for i in range(page): url = url_temp.format(i) response = requests.get(url) if response.status_code != 200: continue content = response.text # 获取响应正文 _content = formatContent(content) # 格式化json字符串 result = json.loads(_content) return_list.append(result) return return_list
这样子就获得每一个页码对应的内容列表:
以后经过分析数据可知下图圈出来的则是须要抓取的标题、发布时间以及新闻内容页面。
既然如今已经获取到了内容页的url,那么接下来开始抓取新闻正文。
在抓取正文以前要先分析一下正文的html页面,找到正文、做者、来源在html文档中的位置。
咱们看到文章来源在文档中的位置为:id = "ne_article_source" 的 a 标签。
做者位置为:class = "ep-editor" 的 span 标签。
正文位置为:class = "post_text" 的 div 标签。
下面试采集这三个内容的代码:
def get_content(url): source = '' author = '' body = '' resp = requests.get(url) if resp.status_code == 200: body = resp.text bs4 = BeautifulSoup(body) source = bs4.find('a', id='ne_article_source').get_text() author = bs4.find('span', class_='ep-editor').get_text() body = bs4.find('div', class_='post_text').get_text() return source, author, body
到此为止咱们所要抓取的全部数据都已经采集了。
那么接下来固然是把它们保存下来,为了方便我直接采起文本的形式来保存。下面是最终的结果:
格式为json字符串,“标题” : [ ‘日期’, ‘url’, ‘来源’, ‘做者’, ‘正文’ ]。
要注意的是目前实现的方式是彻底同步的,线性的方式,存在的问题就是采集会很是慢。主要延迟是在网络IO上,下次能够升级为异步IO,异步采集,有兴趣的能够关注下次的文章。