我正在尝试编写一个将刮除python
并告诉我新闻文章是否为假新闻的http://www.fakenewsai.com/脚本。我希望脚本将给定的新闻文章输入到网站的url
输入字段中,然后单击submit
按钮。然后,我想抓取该网站,以确定该文章是网站上显示的“假”还是“真实”新闻。
我使用selenium
和ChromeDriver
成功完成了此操作,但是脚本非常慢(> 2分钟),并且没有在Heroku
上运行(使用flask
)。供参考,这是我使用的代码:
from selenium import webdriver
import time
def fakeNews(url):
if url.__contains__("https://"):
url = url[8:-1]
if url.__contains__("http://"):
url = url[7:-1]
browser = webdriver.Chrome("static/chromedriver.exe")
browser.get("http://www.fakenewsai.com")
element = browser.find_element_by_id("url")
element.send_keys(url)
button = browser.find_element_by_id("submit")
button.click()
time.sleep(1)
site = "" + browser.page_source
result = ""
if(site[site.index("opacity: 1")-10] == "e"):
result = "Fake News"
else:
result = "Real News"
browser.quit()
return result
print(fakeNews('https://www.nytimes.com/2019/11/02/opinion/sunday/instagram-social-media.html'))
我已经尝试使用其他python
库(例如mechanicalsoup
,pyppeteer
和scrapy
)复制此代码。但是,作为python
的初学者,我没有找到太大的成功。我希望有人可以通过解决方案为我指明正确的方向。
主要变慢发生在启动Chrome浏览器并找到第一个URL时。请注意,您正在为每个请求启动浏览器。您可以在初始化步骤中启动浏览器,并且仅根据请求执行自动化部分。这将大大提高性能。
出于上述目的,我认为分析网站,了解网站的功能然后自动执行浏览器行为(而不是用户行为)会更加简单。
[在网站上尝试在浏览器上单击F12,打开“网络”选项卡,在输入框上粘贴URL,然后单击“提交”,您将看到它先发送HTTP OPTIONS请求,然后发送POST请求到URL。然后,服务器将返回JSON响应。
因此,您可以使用Python的请求模块(docs)自动执行POST请求,而不必使用非常复杂的代码来模拟点击并抓取结果。
一个可以建立的非常简单的示例是:
import json
import requests
def fake_news():
url = 'https://us-central1-fake-news-ai.cloudfunctions.net/detect/'
payload = {'url': 'https://www.nytimes.com/'}
headers = {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'en-US,en;q=0.5',
'Connection': 'keep-alive', 'Content-Length': '103', 'Content-type': 'application/json; charset=utf-8',
'DNT': '1', 'Host': 'us-central1-fake-news-ai.cloudfunctions.net', 'Origin': 'http://www.fakenewsai.com',
'Referer': 'http://www.fakenewsai.com/', 'TE': 'Trailers',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0'}
response_json = requests.post(url, data=json.dumps(payload), headers=headers).text
response = json.loads(response_json)
is_fake = int(response['fake'])
if is_fake == 0:
print("Not fake")
elif is_fake == 1:
print("Fake")
else:
print("Invalid response from server")
if __name__ == "__main__":
fake_news()
PS:可以联系网站的所有者,讨论使用他或她的基础设施来处理您的项目,这是公平的。