首页 > 解决方案 > Python:如何填写网络表单并获取生成的页面源

问题描述

我正在尝试编写一个python脚本来抓取http://www.fakenewsai.com/并告诉我一篇新闻文章是否是假新闻。我希望脚本将给定的新闻文章输入网站的url输入字段并点击submit按钮。然后,我想抓取网站以确定文章是“假”还是“真实”新闻,如网站上显示的那样。

我成功地使用seleniumand完成了这个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库来复制此代码,例如mechanicalsouppyppeteerscrapy. 但是,作为 的初学者python,我并没有取得多大的成功。我希望有人可以通过解决方案为我指明正确的方向。

标签: pythonpython-3.xseleniumweb-scrapingautomation

解决方案


出于上述目的,在我看来,分析网站、了解其功能然后自动化浏览器行为而不是用户行为会更简单。

在网站上尝试在浏览器上按 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:联系网站所有者讨论将他或她的基础设施用于您的项目是公平的。


推荐阅读