网页新闻抓取(查看网页源码的时候(chrome浏览器)中的查看方法 )
优采云 发布时间: 2022-04-01 07:22网页新闻抓取(查看网页源码的时候(chrome浏览器)中的查看方法
)
标签,然后找到这个标签下的所有标签,然后再次找到该标签,然后找到所需的数据。
但是,当我们打开查看网页的源代码时(比如chrome浏览器,右键查看网页的源代码),发现源代码中并没有我们需要的数据,而是类似的东西到一个模板。数据通过后续的动态加载加载。
当我们使用爬虫进行爬取时,我们得到的是相同的源代码,但是我们当然无法获取数据。
Tips1:在分析网页时,可以先查看网页的源代码,看看里面有没有你需要的数据。如果有,可以继续分析。如果不是,则意味着数据是动态加载的,您需要改变主意。
1.2 如何获取数据
既然在网页源代码中找不到数据,那我们从哪里得到数据呢?
这涉及到一个叫“抓包”的词,听起来可能很深奥很难,但其实很简单。我们知道,必须通过发起网络请求来获取数据,即网页向服务器发送请求,然后服务器返回所需的数据。我们使用一些工具和方法将网页的请求发送到服务器以及浏览器返回的数据。截取分析,这个过程就是“抓包”。
可能大家还有点迷茫,下面我来详细演示一下。
打开开发者工具,切换到网络,然后刷新网页(这里可以捕获页面加载过程中对服务器的各种类型的请求)。
那么上图中红框圈出来的就是我们一一抓到的请求包,包括js脚本、css文件、图片等。在众多的“请求包”中我们要找到收录数据的包我们需要。
从上到下点击列表中的请求(可以在 Preview 中预览请求返回的数据),看看我们要查找的请求是哪个。
点击上图中箭头标记的请求后,预览中的内容就是布局导航栏中的内容(点击预览中的小箭头展开),我们就成功找到了正确的请求。
即抓包成功!
1.3 如何使用抓包?
我们抓到了收录数据的请求包,但是具体怎么使用呢?如何在爬虫程序中使用它来通过它来爬取数据?
仍然是那个请求,我们切换到 Headers 选项卡以查看有关此请求的一些基本信息。
主要关注几个部分Request URL(请求链接),Request Method(请求方法),Query String Parameters(请求参数),(当然是请求头中的那些东西,User-Agent,Cookie等,根据实际情况而定情况如何添加如何添加)。
我们的目的是通过python代码模拟浏览器发出这个请求,直接获取服务端返回的数据(返回的数据就是之前预览的那个)。
import requests
url = "https://www.shobserver.com/staticsg/data/journal/2021-04-24/navi.json?ver=1619268138175"
r = requests.get(url)
print(r.text)
我们简单写几行代码来模拟这个过程(url是上图中Request URL的内容,requests.get()是因为Request Method是GET)。
运行结果如下,可以成功获取数据。
1.4 如何爬取其他日期的数据
运行上面的代码,我们可以得到截至2021年4月24日的新闻数据,那么如果我们要爬取其他日期的新闻数据呢?
这里我们观察请求的 url
有一段2021-04-24,我们猜测,这可能是用来控制获取数据的日期,改成其他日期如2021-04-20再试一次。
发现也可以成功。
这样我们就知道可以通过修改url中的日期字符串来抓取指定日期的数据了。
1.5 解析数据
这个请求返回的数据是一个json格式的字符串,我们需要使用json库来解析。
(可能有同学要问,怎么知道一串乱码是json格式的?总之看两个特征,一个是用大括号{}包裹的,另一个是key value的格式, 是 xxx : xxx 的形式,如果实在不知道怎么判断,直接去抓包部分看预览,如果有可以折叠和展开的小箭头,那就是json格式)
我们可以看到pages中有一个pages列表,每个page的articleList都有一个文章列表,里面收录了我们需要的page和文章列表信息。具体解析Python代码这里不做讨论,源码贴在文末。
1.6 如何攀登文章详情
首先点击文章的文本页面,和之前一样的分析方法。不难知道,文本的内容也是动态加载的,通过如下请求获取文本的数据。
让我们写一个简单的代码来验证
import requests
url = "https://www.shobserver.com/staticsg/data/journal/2021-04-24/01/article/312840.json?ver=1619271661571"
r = requests.get(url)
print(r.text)
运行结果
通过分析这个请求的url可以知道,/2021-04-24是日期,/01是页码,/312840是文章的id。
至此,我们完成了网站的分析,讲解了如何判断网站的数据是动态加载还是静态加载,如果是动态加载,如何抓包,如何使用它在抓包等之后,并抓包到新闻页面列表、文章列表、文章请求正文内容的接口。如果上面的内容有什么我没有解释清楚,或者有什么我不太明白的地方,可以留言问我。
写下下面的代码就可以正式爬取了。
二、编码链接
以下为爬虫源码,供大家学习交流,请勿用于非法用途。
import requests
import bs4
import os
import datetime
import time
import json
def fetchUrl(url):
'''
功能:访问 url 的网页,获取网页内容并返回
参数:目标网页的 url
返回:目标网页的 html 内容
'''
headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
}
r = requests.get(url, headers=headers)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
def saveFile(content, path, filename):
'''
功能:将文章内容 content 保存到本地文件中
参数:要保存的内容,路径,文件名
'''
# 如果没有该文件夹,则自动生成
if not os.path.exists(path):
os.makedirs(path)
# 保存文件
with open(path + filename, 'w', encoding='utf-8') as f:
f.write(content)
def download_jfrb(year, month, day, destdir):
'''
功能:网站 某年 某月 某日 的新闻内容,并保存在 指定目录下
参数:年,月,日,文件保存的根目录
'''
url = 'https://www.shobserver.com/staticsg/data/journal/' + year + '-' + month + '-' + day + '/navi.json'
html = fetchUrl(url)
jsonObj = json.loads(html)
for page in jsonObj["pages"]:
pageName = page["pname"]
pageNo = page["pnumber"]
print(pageNo, pageName)
for article in page["articleList"]:
title = article["title"]
subtitle = article["subtitle"]
pid = article["id"]
url = "https://www.shobserver.com/staticsg/data/journal/" + year + '-' + month + '-' + day + "/" + str(pageNo) + "/article/" + str(pid) + ".json"
print(pid, title, subtitle)
html = fetchUrl(url)
cont = json.loads(html)["article"]["content"]
bsobj = bs4.BeautifulSoup(cont, 'html.parser')
content = title + subtitle + bsobj.text
print(content)
path = destdir + '/' + year + month + day + '/' + str(pageNo) + " " + pageName + "/"
fileName = year + month + day + '-' + pageNo + '-' + str(pid) + "-" + title + '.txt'
saveFile(content, path, fileName)
if __name__ == '__main__':
'''
主函数:程序入口
'''
# 爬取指定日期的新闻
newsDate = input('请输入要爬取的日期(格式如 20210416 ):')
year = newsDate[0:4]
month = newsDate[4:6]
day = newsDate[6:8]
download_jfrb(year, month, day, 'Data')
print("爬取完成:" + year + month + day)
以上是爬取单日新闻文章的爬虫。如果想爬取一段时间内的新闻文章数据,可以参考《Python网络爬虫:爬取人民日报文章》中的代码修改。
三、运行效果
运行程序并输入20210424后,爬虫会自动爬取2021年4月24日的新闻数据,并保存在Data/20210424/目录下。
2021 年 12 月 15 日更新
为通过审核,部分涉及敏感内容的网站截图已被删除,仅保留部分解释爬虫技术所必需的截图,部分涉及网站的页面将被重新编码。我希望每个人都能理解。
如果在文章中有没有解释清楚,或者解释有问题的地方,请在评论区批评指正,或者扫描下方二维码,加我微信,大家可以学习和学习一起交流,一起进步。