Python Automation Scraping Program - Иногда получаю 511 код ошибки, а иногда нет - PullRequest
0 голосов
/ 11 февраля 2020

Я пытаюсь создать программу, которая открывает Firefox, используя Selenium, получает файлы HAR, используя BrowserMobProxy, получая ссылку внутри файлов, которая ведет на страницу JSON. Программа очищает файлы HAR и очищает данные JSON каждые 5 секунд. Проблема в том, что иногда, когда я пытаюсь его очистить, я получаю 511 ошибку -

<!DOCTYPE html><html><head><title>Apache Tomcat/8.0.32 (Ubuntu) - Error report</title><style type="text/css">H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}.line {height: 1px; background-color: #525D76; border: none;}</style> </head><body><h1>**H**TTP Status 511 - something went wrong with your request**** (2)</h1><div class="line"></div><p><b>type</b> Status report</p><p><b>message</b> <u>**something went wrong with your request** (2)</u></p><p><b>description</b> <u>**T**he client needs to authenticate to gain network access.****</u></p><hr class="line"><h3>Apache Tomcat/8.0.32 (Ubuntu)</h3></body></html>

Обратите внимание на 511 код ошибки E Trrr **, который требуется клиенту для аутентификации для получения доступа к сети.

А иногда это удается и возвращает требуемый словарь-

{"alerts":[{"country":"IL","nThumbsUp":2,"city"... 

Почему это так?

Может быть важно сказать, что страница JSON имеет около 1-3 время истечения секунд, но я измерил, пока программа не получит данные, и оно составляет около 0,0000385 секунд, так что, похоже, это не проблема.

Мои теории на данный момент таковы, что программа очищает данные Каждые x секунд соединение прерывается, но я думаю, что это привело бы к гигантской ошибке c, моя вторая опровергнутая теория состояла в том, что это была просто проблема ограничения скорости, поэтому я использовал time.sleep () и приостановил его для 3 секунды, но безуспешно.

Было бы очень полезно, если вы найдете способ исправить это или укажете на ошибку в моем коде.

Код (Это немного грязно сейчас, но я все еще сделал нет возможности это исправить)

import os
import json
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from browsermobproxy import Server
import schedule
import requests
import timeit
from fake_useragent import UserAgent

i = 1

print("""Waze Police Scraper

Waze Police Scraper will open the Mozilla Firefox browser, onto Waze's live map website.
It'll scrape all the police's lcoations from your preferred lcoation, including police traps that are voted by Waze's users.
Near every cop location it'll show the Number of upvotes, and downvotes and from that the probability of the users's report being true.

Instructions:


""")


def personalised_info():
    auto_or_manual = input("Do you want the software to scrape the waze map manually or Automatically? ")

    sec = input("Every how much seconds do you want the scraper to scrape the data? maximum is 30 seconds, while minimum is 5 seconds. By not inputting anything the value will be set to the recommended value of 5 seconds. ")
    return auto_or_manual, sec

def start_server():
    global server, proxy, driver
    server = Server("C:\\Users\\Yahav\\Downloads\\browsermob-proxy-2.1.4-bin\\browsermob-proxy-2.1.4\\bin\\browsermob-proxy")

    useragent = UserAgent()
    useragent.update()

    server.start()
    proxy = server.create_proxy()

    #proxy.wait_for_traffic_to_stop(6000, 9000)


    profile = webdriver.FirefoxProfile()
    profile.set_proxy(proxy.selenium_proxy())
    profile.set_preference("general.useragent.override", useragent.random)
    driver = webdriver.Firefox(executable_path = "C:\\Users\\Yahav\\Downloads\\geckodriver-v0.26.0-win64\\geckodriver.exe", firefox_profile=profile)
    # Navigate to the application home page
    driver.get("https://www.waze.com/livemap?utm_source=waze_website&utm_campaign=waze_website")

urls = []
t = 1
data_parsed = {}
inner_nested_data_parsed = {}
data_list = []

def get_data(urls, t, data_parsed, inner_nested_data_parsed):
    start = timeit.timeit()  # Measure time
    global i
    #tag the har(network logs) with a name
    har = proxy.new_har("waze_{0}.format(i)")

    # Finding the URL requests where the data is stored in JSON format
    har = str(har)
    str_1 = "https://www.waze.com/il-rtserver/web/TGeoRSS?"
    str_2 = "&types=alerts%2Ctraffic%2Cusers"

    indx_1 = har.find(str_1)
    indx_2 = har.find(str_2)

    url = har[indx_1:indx_2]

    url = url + str_2

    urls.append(url)

    print(urls)

    for d in urls:
        if d == str_2:
            data = {}  # To overcome the 'refrenced before assignment' error
            print("what")
        if d != str_2:
            data_request = requests.get(url)
            data = data_request.text  #Getting data
            end = timeit.timeit()  # Measure time
            data_list.append(data)
            print(type(data), url)
            print(end - start)  #Time to get data

    if url == "&types=alerts%2Ctraffic%2Cusers":  # If user not moving than 'url' will be equal to the string
        print("Move your cursor to your preferred location.")
    else:
        if type(data) is dict:
            for x in range(len(data["alerts"])):
                if (data["alerts"][x]["type"]) == "POLICE":
                    inner_nested_data_parsed["type"] = (data["alerts"][x]["type"])
                    if data["alerts"][x]["subtype"] != "":  # Not working for some reason
                        inner_nested_data_parsed["subtype"] = (data["alerts"][x]["subtype"])
                    else:
                        True # Just to fill the space
                    inner_nested_data_parsed["country"] = (data["alerts"][x]["country"])
                    inner_nested_data_parsed["nThumbsUp"] = (data["alerts"][x]["nThumbsUp"])
                    inner_nested_data_parsed["confidence"] = (data["alerts"][x]["confidence"])
                    inner_nested_data_parsed["reliability"] = (data["alerts"][x]["reliability"])
                    inner_nested_data_parsed["speed"] = (data["alerts"][x]["speed"])
                    inner_nested_data_parsed["location_x"] = (data["alerts"][x]["location"]["x"])
                    inner_nested_data_parsed["location_y"] = (data["alerts"][x]["location"]["y"])

                    data_parsed[t] = inner_nested_data_parsed

                    t += 1
                    inner_nested_data_parsed = {}  # resets the dictionary so the elements in the list "alerts" won't be added to the same value of "t" in the dictionary "data_parsed"
                else:
                    continue
        else:
            print("fuck", type(data))

    print(data)
    """ # Logs to file
    path_log_file = "demofile3.txt"
    if os.path.exists(path_log_file):  #Checks if file exists
        f = open(path_log_file, "w")
        print(data)
        f.write(str(data))
        f.flush()
        f.close()

    else:
        f = open(path_log_file, "x")
        f = open(path_log_file, "w")
        f.write(str(data))
        f.flush()
        f.close()
    """

    server.stop()
    # close the browser window
    #driver.quit()
    i += 1
    return i

print(data_parsed)

auto_or_manual, sec = personalised_info()

if auto_or_manual == "A":
    if not sec:  # Default
        sec = 10
        print(True, 4)
        start_server() 
        schedule.every(sec).seconds.do(get_data, urls, t, data_parsed, inner_nested_data_parsed)
    if sec.isdigit() == True:  # If input is digit
        print(True, 4)
        start_server() 
        schedule.every(int(sec)).seconds.do(get_data, urls, t, data_parsed, inner_nested_data_parsed)
    else:
        print("Please enter a valid number.")
        personalised_info()

else:
    print(None)
    #Manual
#proxy.new_har("waze")


#driver.get("about:preferences#privacy")

while True:  # User defined 
    schedule.run_pending()

1 Ответ

1 голос
/ 12 февраля 2020

Код состояния 511 означает, что вам необходимо пройти аутентификацию для доступа к дополнительным данным.

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

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