本文已参与「新人创造礼」活动,一同开启创造之路

追风赶月莫停留,平芜尽处是春山。

2021.7.14更新:阅读器标识运用Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0也便是火狐阅读器内核的,我发现用chrome已经加载不出新的一页了。文中的代码已经更新了。

一、网页剖析

翻开网址 较真查验渠道

Python爬虫实战(一):腾讯新闻的较真查证平台,抓取疫情谣言数据
翻开开发者形式,刷新网页,往下翻看的时分注意到刷新出来了一个恳求 URL
Python爬虫实战(一):腾讯新闻的较真查证平台,抓取疫情谣言数据

恳求到的数据是

Python爬虫实战(一):腾讯新闻的较真查证平台,抓取疫情谣言数据
正好能够和网页中的内容对应起来。
Python爬虫实战(一):腾讯新闻的较真查证平台,抓取疫情谣言数据

Python爬虫实战(一):腾讯新闻的较真查证平台,抓取疫情谣言数据
其中还包含标题、言论的真实性、时刻、查验的要点以及查验者。

二、接口剖析

url剖析

vp.fact.qq.com/loadmore?ar…

咱们能够很简单的发现page=1是表明页数,去验证一下发现当page=0的时分其实回来的是第一页的数据。 token=U2FsdGVkX19IPDkKITF2xCZa%252FxETYaJM%252BPz7pppjc5ZVBjEbahmQ%252F33hOL42W%252BAN,这个便是网站设置的Session。其实这个让他保持不变就行,失效了再换 stopic=&_=1619407484449,看到后边的13位数字第一反应是时刻戳,而且还是毫秒等级的时刻戳,事实便是如此。

Python爬虫实战(一):腾讯新闻的较真查证平台,抓取疫情谣言数据

回来数据剖析

Python爬虫实战(一):腾讯新闻的较真查证平台,抓取疫情谣言数据
尽管显示的回来数据类型是text类型,可是看这阅读的格局总感觉像是JSON格局的
Python爬虫实战(一):腾讯新闻的较真查证平台,抓取疫情谣言数据
发现回来的数据是jsonp1(json_data)这种格局的,所以咱们只要把jsonp1()去掉然后提取中间的内容就能够格局化为json数据了

三、编写代码

知道了url规矩,以及回来数据的格局,那现在咱们的任务便是构造url然后恳求数据 咱们能够设置两个变量page, timestamp代表页数和时刻戳 page改变很简单,用for循环直接循环就OK

for page in range(0, 100):

timestamp的话就要凭借time库来生成

timestamp = int(time.time()*1000)

现在来构造url:

url = "https://vp.fact.qq.com/loadmore?artnum=0&token=U2FsdGVkX19IPDkKITF2xCZa%252FxETYaJM%252BPz7pppjc5ZVBjEbahmQ%252F33hOL42W%252BAN&page={}&stopic=&_={}&callback=jsonp1".format(page, timestamp)

接下来生成前100页的url:

for page in range(0, 100):
    timestamp = int(time.time()*1000)
    url = "https://vp.fact.qq.com/loadmore?artnum=0&token=U2FsdGVkX19IPDkKITF2xCZa%252FxETYaJM%252BPz7pppjc5ZVBjEbahmQ%252F33hOL42W%252BAN&page={}&stopic=&_={}&callback=jsonp1".format(page, timestamp)   

关于每个url咱们都要去用requests库中的get办法去恳求数据: 所以咱们为了便利就把恳求网页的代码写成了函数get_html(url),传入的参数是url回来的是恳求到的内容。

def get_html(url):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0"
    }
    response = requests.get(url, headers=headers)
    response.encoding = response.apparent_encoding
    time.sleep(3)	# 加上3s 的延时防止被反爬
    return response.text

现在咱们用到的requests.get()只传入了两个参数url, headers,其实还有更多参数,请读者自行百度。 这个网站只需要这两个参数就足够了。 传入headers目的是为了模仿阅读器进行拜访,防止被反爬。

Python爬虫实战(一):腾讯新闻的较真查证平台,抓取疫情谣言数据
能够在这里找到headers 的相关信息,咱们现在只需要其中的user-agent就足够了。

上文说到回来的数据其实是个伪json格局的数据,咱们做一下处理就能变成json格局的数据

for page in range(0, 100):
    timestamp = int(time.time()*1000)
    url = "https://vp.fact.qq.com/loadmore?artnum=0&token=U2FsdGVkX19IPDkKITF2xCZa%252FxETYaJM%252BPz7pppjc5ZVBjEbahmQ%252F33hOL42W%252BAN&page={}&stopic=&_={}&callback=jsonp1".format(page, timestamp)
	html = get_html(url)	# 此刻html里边存的是伪json格局的数据
    html = html[7:-1]	# 用字符串提取提取出来中间的json格局的内容

咱们运用json库来格局化数据使其更便利咱们后续的提取

response = json.loads(html)

到此,数据处理部分就完成了,下一步便是数据提取了。

Python爬虫实战(一):腾讯新闻的较真查证平台,抓取疫情谣言数据
咱们发现数据都在content标签下,所以咱们用

response = response['content']

来提取列表里数据,此刻response是一个列表类型的数据 那咱们就来遍历这个列表提取所需要的数据并存到一个字典中

for i in response:
	data = {}
	data['explain'] = i['explain']
	data['title'] = i['title']
	data['date'] = i['date']
	data['result'] = i['result']
	data['author'] = i['author']
	data['abstract'] = i['abstract']

那接下来便是保存了,我也写了个函数save_data(data)传入的是字典类型的数据

def save_data(data):
    title = ["title", "date", "explain", "result", "author", "abstract"]
    with open("疫情谣言数据.csv", "a", encoding="utf-8", newline="")as fi:
        fi = csv.writer(fi)		# 引进csv库
        fi.writerow([data[i] for i in title])	# 写入文件

提取完数据然后调用保存函数就OK了

for i in response:
    data = {}
    data['explain'] = i['explain']
    data['title'] = i['title']
    data['date'] = i['date']
    data['result'] = i['result']
    data['author'] = i['author']
    data['abstract'] = i['abstract']
    save_data(data)

完好代码

# -*- coding:utf-8 -*-
# @time: 2021/4/26 11:05
# @Author: pioneer
# @Environment: Python 3.7
import json
import requests
import csv
import time
def get_html(url):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0"
    }
    response = requests.get(url, headers=headers)
    response.encoding = response.apparent_encoding  # 自动识别并设置编码
    time.sleep(3)   # 加入3s延时,防止被反爬
    return response.text
def save_data(data):
    title = ["title", "date", "explain", "result", "author", "abstract"]
    with open("疫情谣言数据.csv", "a", encoding="utf-8", newline="")as fi:
        fi = csv.writer(fi)     # 导入csv库
        fi.writerow([data[i] for i in title])   # 写入文件
def get_data():
    for page in range(0, 100):
    	print(page)
        timestamp = int(time.time()*1000)
        url = "https://vp.fact.qq.com/loadmore?artnum=0&token=U2FsdGVkX19IPDkKITF2xCZa%252FxETYaJM%252BPz7pppjc5ZVBjEbahmQ%252F33hOL42W%252BAN&page={}&stopic=&_={}&callback=jsonp1".format(page, timestamp)
        html = get_html(url)    # 此刻html里边存的是伪json格局的数据
        html = html[7:-1]   # 用字符串提取提取出来中间的json格局的内容
        response = json.loads(html)
        response = response['content']  # 提取数据列表
        for i in response:
            data = {}
            data['explain'] = i['explain']
            data['title'] = i['title']
            data['date'] = i['date']
            data['result'] = i['result']
            data['author'] = i['author']
            data['abstract'] = i['abstract']
            save_data(data)
if __name__ == '__main__':
    get_data()

得到的部分数据截图

Python爬虫实战(一):腾讯新闻的较真查证平台,抓取疫情谣言数据
欢迎一键三连哦! 还想看哪个网站的爬虫?欢迎留言,说不定下非必须剖析的便是你想要看的!