Python Selenium: как go перейти к поисковому URL Google, при этом страница не отображается как "не найден", "доступ запрещен" или "отказано в разрешении" - PullRequest
1 голос
/ 12 марта 2020

Я только начал работать с Selenium, чтобы узнать о создании веб-страниц, и сейчас я пытаюсь запустить поиск в Google, а затем выполнить итерации моего кода по каждому из 5 лучших URL-адресов, которые возвращал мой поиск.

Мой поиск в Google будет загружаться правильно, но когда я go по любому из URL-адресов результатов поиска, на странице будет отображаться страница "не найден", "доступ запрещен" или "отказано в разрешении". Это также происходит, если я вручную вставляю URL. Как я могу обойти это?

Или я неправильно перехожу на следующий URL? В настоящее время я сбрасываю URL driver.get.

from bs4 import BeautifulSoup
from selenium import webdriver
import requests
import re

search = '5 most popular dog breeds'
driver = webdriver.Chrome()
driver.get('https://www.google.co.in/#q=' + search)
b = driver.current_url
page = requests.get(b)
soup = BeautifulSoup(page.content, features="lxml")
links = soup.findAll("a")
urlList = []

# Put first 5 URLs of search into array x.
for link in soup.find_all("a",href=re.compile("(?<=/url\?q=)(htt.*://.*)")):
    urlList.append(re.split(":(?=http)",link["href"].replace("/url?q=","")))
    if len(urlList) == 5:
        break

driver.get(urlList[0][0])
url = driver.current_url
page = requests.get(url)
pgsource = driver.page_source

1 Ответ

0 голосов
/ 14 марта 2020

Вы открываете страницы правильно. Похоже, что вы получаете дополнительные параметры запроса при получении href для элементов a.

Я изменил ваш код, чтобы получать только те ссылки, которые соответствуют этому шаблону регулярных выражений для ссылок 'https?:\/\/[a-zA-Z0-9\.\-\/]+', и принимать только 1 ссылка на веб-элемент (в вашем случае это иногда было 2).

# Put first 5 URLs of search into array x.
for link in soup.find_all("a", href=re.compile("(?<=/url\?q=)(htt.*://.*)")):
    r = re.findall(pattern=re.compile('https?:\/\/[a-zA-Z0-9\.\-\/]+'), string=link['href'])[0]
    urlList.append(r)

    if len(urlList) == 5:
        break

print(urlList[0])
driver.get(urlList[0])
pgsource = driver.page_source
print(pgsource)

Вы также можете просто использовать Selenium для той же цели, без Beautiful Soup, это будет выглядеть так:

from selenium import webdriver

search = '5 most popular dog breeds'
driver = webdriver.Chrome()
driver.get('https://www.google.co.in/#q=' + search)
# Using XPath to filter desired elements instead of regex:
links = driver.find_elements_by_xpath("//a[@href!='' and contains(@ping,'/url?sa')]")

urls = []
for link in links[1:6]:
    urls += [link.get_attribute('href')]

print(urls[0])
driver.get(urls[0])
pgsource = driver.page_source
print(pgsource)

Это сработало для меня. Надеюсь, это поможет, удачи.

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