#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’ не поддерживает индексацию»