Python: как заполнить веб-форму и получить исходный код страницы - PullRequest
1 голос
/ 05 ноября 2019

Я пытаюсь написать сценарий 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, я не нашел большого успеха. Я надеялся, что кто-то может указать мне правильное направление с решением.

Ответы [ 2 ]

1 голос
/ 05 ноября 2019

Для заявленной цели, на мой взгляд, было бы гораздо проще проанализировать сайт, понять его функциональность и затем автоматизировать поведение браузера вместо поведения пользователя.

Попробуйте нажать 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: Было бы справедливо связаться с владельцем веб-сайта, чтобы обсудить использование его или ее инфраструктуры. для вашего проекта.

0 голосов
/ 05 ноября 2019

Основное замедление происходит при запуске браузера Chrome и поиске первого URL. Обратите внимание, что вы запускаете браузер для каждого запроса. Вы можете запустить браузер на этапе инициализации и выполнять только части автоматизации по запросу. Это значительно повысит производительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...