Как мне выполнить поиск на веб-сайте с помощью модуля «запросы»?

#python #web-scraping #beautifulsoup #request

#python #очистка веб-сайта #beautifulsoup #запрос

Вопрос:

Я хочу выполнить поиск по названиям разных компаний на веб-сайте. Ссылка на веб-сайт: https://www.firmenwissen.de/index.html

На этом веб-сайте я хочу использовать поисковую систему и поиск компаний. Вот код, который я пытаюсь использовать:

 from bs4 import BeautifulSoup as BS
import requests
import re

companylist = ['ABEX Dachdecker Handwerks-GmbH']

url = 'https://www.firmenwissen.de/index.html'

payloads = {
        'searchform': 'UFT-8',
        'phrase':'ABEX Dachdecker Handwerks-GmbH',
        "mainSearchField__button":'submit'
        }

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}

html = requests.post(url, data=payloads, headers=headers)
soup = BS(html.content, 'html.parser')
link_list= []

links = soup.findAll('a')

for li in links:
    link_list.append(li.get('href'))
print(link_list)
  

Этот код должен вывести меня на следующую страницу с информацией о компании. Но, к сожалению, он возвращает только домашнюю страницу. Как я могу это сделать?

Комментарии:

1. Извините, но этот код возвращает все ссылки на странице, что вы подразумеваете под домашней страницей ??

2. Да, вы правы. Но код возвращает ссылку с домашней страницы. Я хочу использовать поисковую систему домашней страницы, чтобы найти информацию о конкретной компании. чего, к сожалению, я не могу. Это должно привести меня к следующей странице, где будет показан результат поиска.

3. На странице используется javascript, который requests модуль не поддерживает. Попробуйте вместо этого использовать что-то вроде selenium.

Ответ №1:

Измените свой первоначальный URL, по которому вы выполняете поиск. Берите только подходящие href файлы и добавляйте в набор, чтобы гарантировать отсутствие дубликатов (или измените селектор, чтобы возвращать только одно совпадение, если это возможно); добавьте эти элементы в конечный набор для выполнения цикла, чтобы обеспечить выполнение только требуемого количества ссылок. Я использовал Session , предполагая, что вы повторите для многих компаний.

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

Это схема.

 from bs4 import BeautifulSoup as BS
import requests
from selenium import webdriver

d = webdriver.Chrome()
companyList = ['ABEX Dachdecker Handwerks-GmbH','SUCHMEISTEREI GmbH']

url = 'https://www.firmenwissen.de/ergebnis.html'
baseUrl = 'https://www.firmenwissen.de'
headers = {'User-Agent': 'Mozilla/5.0'}

finalLinks = set()

## searches section; gather into set

with requests.Session() as s:
    for company in companyList:
        payloads = {
        'searchform': 'UFT-8',
        'phrase':company,
        "mainSearchField__button":'submit'
        }

        html = s.post(url, data=payloads, headers=headers)
        soup = BS(html.content, 'lxml')

        companyLinks = {baseUrl   item['href'] for item in soup.select("[href*='firmeneintrag/']")}
        # print(soup.select_one('.fp-result').text)
        finalLinks = finalLinks.union(companyLinks)

for item in finalLinks:
    d.get(item)
    info  = d.find_element_by_css_selector('.yp_abstract_narrow')
    address =  d.find_element_by_css_selector('.yp_address')
    print(info.text, address.text)

d.quit()
  

Только первые ссылки:

 from bs4 import BeautifulSoup as BS
import requests
from selenium import webdriver

d = webdriver.Chrome()
companyList = ['ABEX Dachdecker Handwerks-GmbH','SUCHMEISTEREI GmbH', 'aktive Stuttgarter']

url = 'https://www.firmenwissen.de/ergebnis.html'
baseUrl = 'https://www.firmenwissen.de'
headers = {'User-Agent': 'Mozilla/5.0'}

finalLinks = []

## searches section; add to list

with requests.Session() as s:
    for company in companyList:
        payloads = {
        'searchform': 'UFT-8',
        'phrase':company,
        "mainSearchField__button":'submit'
        }

        html = s.post(url, data=payloads, headers=headers)
        soup = BS(html.content, 'lxml')

        companyLink = baseUrl   soup.select_one("[href*='firmeneintrag/']")['href']
        finalLinks.append(companyLink)

for item in set(finalLinks):
    d.get(item)
    info  = d.find_element_by_css_selector('.yp_abstract_narrow')
    address =  d.find_element_by_css_selector('.yp_address')
    print(info.text, address.text)
d.quit()
  

Комментарии:

1. Это то, что вы имели в виду?

2. большое вам спасибо. Ваш код отлично работает так, как я ищу. But I want to grab address: abex Dachdecker Handwerks GmbH Weingartener Str. 31 76229 Karlsruhe, Deutschland

3. Да, я действительно поблагодарил вас. Но есть проблема. Если я использую название этой компании ‘aktive Stuttgarter’. Код запускает всю ссылку. Я просто хочу перейти по первой ссылке, которая является правильной информацией о компании. как я могу выбрать первую ссылку.

4. Да, это тоже нормально. Спасибо.

5. получена эта ошибка «TypeError: объект ‘set’ не поддерживает индексацию»