Доступ запрещен при очистке сайтов с помощью Selenium и Chromedriver в Python - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь почерпнуть некоторую информацию с веб-сайта Департамента зданий Нью-Йорка C, используя селен и хром-драйвер в python, но при запуске кода я получаю страницу "Отказано в доступе". Я попытался прочитать все, что я могу об этой проблеме в Интернете, и я попытался изменить настройки пользовательского агента chromedriver, но безрезультатно. Я подтвердил, что этот код работает, когда я пытаюсь очистить другой веб-сайт.

Для контекста я специально пытаюсь очистить имя владельца, адрес электронной почты, номер здания и название улицы от сайтов с идентификаторами зданий, таких как следующее: http://a810-bisweb.nyc.gov/bisweb/JobsQueryByNumberServlet?passjobnumber=321555811&passdocnumber=&go10=+GO+&requestid=0.

Я очень новичок в Python, поэтому я ожидаю, что моя ошибка может быть довольно базовой c. Любая помощь будет высоко ценится.

Вот мой код:

from selenium.webdriver import Chrome
import pandas as pd

# I am using selenium and chromedriver for the headless browser, and pandas for output to a csv.

webdriver = "/Users/laurenmackler/Coding/DOB_Scraper/env_scraper_1/bin/chromedriver"

from selenium.webdriver.chrome.options import Options

driver = Chrome(webdriver)

# I tried to add these lines to make the DOB website not recognize that I'm using a headless browser, but it did anyways.

user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36'
chrome_options = Options()
chrome_options.add_argument('user-agent={0}'.format(user_agent))

# These job IDs are for two residential buildings in brooklyn which just received certificates of occupancy.
# I first wanted to be able to scrape just two such websites before attempting to scrape several hundred.

job_ids = ("321555811","320624286")

# You can see the pages here:
# http://a810-bisweb.nyc.gov/bisweb/JobsQueryByNumberServlet?passjobnumber=320624286&passdocnumber=&go10=+GO+&requestid=0
# http://a810-bisweb.nyc.gov/bisweb/JobsQueryByNumberServlet?passjobnumber=321555811&passdocnumber=&go10=+GO+&requestid=0
# I wanted to be able to scrape from two different pages at first, but eventually I would need to somehow be able to list hundreds or thousands of job IDs.

for job_id in job_ids:

    url = "http://a810-bisweb.nyc.gov/bisweb/JobsQueryByNumberServlet?passjobnumber=" + str(job_id) + "&passdocnumber=&go10=+GO+&requestid=0"

    driver.get(url)

# Now, I am trying to scrape four particular pieces of information from each page: the owner name, the owner email, the house number, and the street.
# The DOB website does not have clean html IDs or distinctive classes, so I first searched for all "content" classes, and then specified the specific data with Xpaths.

    items = len(driver.find_elements_by_class_name("content"))

    total = []
    for item in range(items):
        contents = driver.find_elements_by_class_name("content")
        for content in contents:
            owner_name = content.find_element_by_xpath('/html/body/center/table[35]/tbody/tr[3]/td[2]').text
            owner_email = content.find_element_by_xpath('/html/body/center/table[35]/tbody/tr[7]/td[2]').text
            house_number = content.find_element_by_xpath('/html/body/center/table[7]/tbody/tr[3]/td[2]').text
            street_name =  content.find_element_by_xpath('/html/body/center/table[7]/tbody/tr[3]/td[4]').text
            new = ((owner_name,owner_email,house_number,street_name))
            total.append(new)
        df = pd.DataFrame(total,columns=['name','email','address','street'])
        df.to_csv('certificate_of_occupancy.csv')
driver.close()

# Lines 34-37 are intended to output the scraped data into a csv file.

# When the chromedriver window pops up when I run the code, I see the text "access denied".

Любая помощь или указатели будут искренне оценены. Спасибо!

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