python - Python:如何填写网络表单并获取生成的页面源
问题描述
我正在尝试编写一个python
脚本来抓取http://www.fakenewsai.com/并告诉我一篇新闻文章是否是假新闻。我希望脚本将给定的新闻文章输入网站的url
输入字段并点击submit
按钮。然后,我想抓取网站以确定文章是“假”还是“真实”新闻,如网站上显示的那样。
我成功地使用selenium
and完成了这个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
,我并没有取得多大的成功。我希望有人可以通过解决方案为我指明正确的方向。
解决方案
出于上述目的,在我看来,分析网站、了解其功能然后自动化浏览器行为而不是用户行为会更简单。
在网站上尝试在浏览器上按 F12,打开 Network 选项卡,将 URL 粘贴到输入框中,然后单击 submit,您将看到它发送 HTTP OPTIONS 请求,然后向 URL 发送 POST 请求。然后服务器返回一个 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:联系网站所有者讨论将他或她的基础设施用于您的项目是公平的。
推荐阅读
- python - Pybind11:外部类型作为返回值
- html - 向 Shopify 添加自定义页脚?
- c++ - 根据参数创建派生类的新实例
- recursion - 模拟二进制加法 - DrRacket 中级学生与 Lambda
- python - 打包时如何设置解释器标志
- css - 填充空格后 Tailwind CSS 截断
- ruby-on-rails - 在 Ubuntu 中安装中间人的问题
- java - FlexibleSerchQuery 中的日期减法
- opencv - 使用 OpenVR TrackedCamera 进行 OpenCV 立体校正和块匹配
- c - 编译 uboot 时出现“flex 扫描仪中的输入失败”错误