网页新闻抓取(此文属于入门级级别的爬虫,老司机们就不用看了)
优采云 发布时间: 2022-04-15 21:31网页新闻抓取(此文属于入门级级别的爬虫,老司机们就不用看了)
本文属于入门级爬虫,老司机不用看。html
这次我们主要抓取网易新闻,包括新闻标题、作者、来源、发布时间、新闻正文。Python
首先我们打开163的网站,我们可以随意选择一个类别。我这里选择的类别是国内新闻。然后右键查看源码,发现源码中页面中间没有新闻列表。这意味着该页面是异步的。即通过api接口获取的数据。面试
然后确认可以用F12打开谷歌浏览器的控制台后,点击网络,我们一直往下拉,在右侧发现:“... special/00804KVA/cm_guonei_03.js?.. ..” 这样的地址,点击Response,发现就是我们要找的api接口。json
可以看出这些接口的地址有一定的规律:“cm_guonei_03.js”、“cm_guonei_04.js”,那么很明显:api
*).js
上面的链接也是我们这次爬取要请求的地址。
接下来只需要用到python的两个库:browser
请求 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”的标签。
作者的立场是: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字符串,"title": ['date', 'url', 'source', 'author', 'body']。
需要注意的是,目前的实现方式是完全同步和线性的,问题是采集会很慢。主要延迟在网络IO,下次可以升级为异步IO,异步采集,感兴趣的可以关注下文章。