Парсинг нескольких страниц bs4 python
Создал парсер сайта. Если парсить один url, код работает. Но т.к. мне нужны данные с всех страниц, что есть в массиве, слегка модифицировал код. После этого он перестал выдавать вообще что либо. Ошибок не выдает. Сам код: https://pastebin.com/AQ3AR6WZ . Решения данной проблемы на форуме пока не нашел. Заранее спасибо всем знатокам
import requests
import re
from bs4 import BeautifulSoup
import pandas as pd
def get_html(url):
r = requests.get(url)
return r.text
def get_name_count(html):
result = pd.DataFrame(columns=['Название', 'Колличество'])
names = []
counts = []
soup = BeautifulSoup(html, 'lxml')
items_name = soup.find_all('a', {'class': 'products__list-item-name'})
for item in items_name:
name = item.get_text().strip()
names.append(name)
items_count = soup.find_all("div", class_="products__list-item-remains")
for item in items_count:
count = item.get_text().strip()
counts.append(count)
result['Название'] = names
result['Колличество'] = counts
return names, counts
url_list = [
'https://smokelab.me/catalog/tabak/adalya-50-g/', 'https://smokelab.me/catalog/tabak/afzal-40-g/',
'https://smokelab.me/catalog/tabak/alfakher-50-g/', 'https://smokelab.me/catalog/tabak/b3-50-g/',
'https://smokelab.me/catalog/tabak/black-burn-100-g/', 'https://smokelab.me/catalog/tabak/burn-100-g/?page=2'
'https://smokelab.me/catalog/tabak/black-burn-20-g/', 'https://smokelab.me/catalog/tabak/black-burn-200-g/',
'https://smokelab.me/catalog/tabak/bonche-80-g/', 'https://smokelab.me/catalog/tabak/burn-20-g/'
'https://smokelab.me/catalog/tabak/burn-200-g/','https://smokelab.me/catalog/tabak/burn-200-g/?page=2',
'https://smokelab.me/catalog/tabak/daily-hookah-200-g/','https://smokelab.me/catalog/tabak/daily-hookah-200-g/?page=2',
'https://smokelab.me/catalog/tabak/daily-hookah-40-g/','https://smokelab.me/catalog/tabak/daily-hookah-40-g/?page=2',
'https://smokelab.me/catalog/tabak/daly-code-20-g/','https://smokelab.me/catalog/tabak/darkside-100-g/',
'https://smokelab.me/catalog/tabak/darkside-100-g/?page=2','https://smokelab.me/catalog/tabak/darkside-100-g/?page=3',
'https://smokelab.me/catalog/tabak/darkside-100-g/?page=4','https://smokelab.me/catalog/tabak/darkside-100-g/?page=5',
'https://smokelab.me/catalog/tabak/darkside-250-g/','https://smokelab.me/catalog/tabak/darkside-250-g/?page=2',
'https://smokelab.me/catalog/tabak/darkside-250-g/?page=3','https://smokelab.me/catalog/tabak/darkside-250-g/?page=4',
'https://smokelab.me/catalog/tabak/darkside-250-g/?page=5','https://smokelab.me/catalog/tabak/darkside-core-(medium)-30-g/',
'https://smokelab.me/catalog/tabak/darkside-shot-30-g/','https://smokelab.me/catalog/tabak/do-you-tobacco-50-g/',
'https://smokelab.me/catalog/tabak/duft-100-g/','https://smokelab.me/catalog/tabak/duft-100-g/?page=2',
'https://smokelab.me/catalog/tabak/duft-all-in-25-g/','https://smokelab.me/catalog/tabak/element-100-g/',
'https://smokelab.me/catalog/tabak/element-100-g/?page=2','https://smokelab.me/catalog/tabak/element-100-g/?page=3',
'https://smokelab.me/catalog/tabak/element-200-g/','https://smokelab.me/catalog/tabak/element-200-g/?page=2',
'https://smokelab.me/catalog/tabak/element-200-g/?page=3','https://smokelab.me/catalog/tabak/element-40-g/',
'https://smokelab.me/catalog/tabak/element-40-g/?page=2','https://smokelab.me/catalog/tabak/element-40-g/?page=3',
'https://smokelab.me/catalog/tabak/element-40-g/?page=4','https://smokelab.me/catalog/tabak/frigate-20g/',
'https://smokelab.me/catalog/tabak/malaysian-tobacco-50-g/','https://smokelab.me/catalog/tabak/malaysian-tobacco-50-g/?page=2',
'https://smokelab.me/catalog/tabak/matt-pear-250-g/','https://smokelab.me/catalog/tabak/matt-pear-250-g/?page=2',
'https://smokelab.me/catalog/tabak/matt-pear-50-g/','https://smokelab.me/catalog/tabak/must-have-125-g/',
'https://smokelab.me/catalog/tabak/must-have-125-g/?page=2','https://smokelab.me/catalog/tabak/must-have-125-g/?page=3',
'https://smokelab.me/catalog/tabak/nash-40-g/','https://smokelab.me/catalog/tabak/satyr-100-g/',
'https://smokelab.me/catalog/tabak/satyr-100-g/?page=2','https://smokelab.me/catalog/tabak/satyr-100-g/?page=3',
'https://smokelab.me/catalog/tabak/satyr-100-g/?page=4','https://smokelab.me/catalog/tabak/satyr-25-g/',
'https://smokelab.me/catalog/tabak/satyr-25-g/?page=2','https://smokelab.me/catalog/tabak/sebero-100-g/',
'https://smokelab.me/catalog/tabak/sebero-100-g/?page=2','https://smokelab.me/catalog/tabak/sebero-20-g/',
'https://smokelab.me/catalog/tabak/sebero-20-g/?page=2','https://smokelab.me/catalog/tabak/sebero-200-g/',
'https://smokelab.me/catalog/tabak/sebero-200-g/?page=2','https://smokelab.me/catalog/tabak/sebero-40-g/',
'https://smokelab.me/catalog/tabak/sebero-40-g/?page=2','https://smokelab.me/catalog/tabak/sebero-le-75-g/',
'https://smokelab.me/catalog/tabak/smoke-angels-100-g/','https://smokelab.me/catalog/tabak/spectrum-100-g/',
'https://smokelab.me/catalog/tabak/spectrum-100-g/?page=2','https://smokelab.me/catalog/tabak/spectrum-100-g/?page=3',
'https://smokelab.me/catalog/tabak/spectrum-100-g/?page=4','https://smokelab.me/catalog/tabak/spectrum-250-g/',
'https://smokelab.me/catalog/tabak/spectrum-250-g/?page=2','https://smokelab.me/catalog/tabak/spectrum-250-g/?page=3',
'https://smokelab.me/catalog/tabak/tangiers-100-g/','https://smokelab.me/catalog/tabak/tangiers-100-g/?page=2',
'https://smokelab.me/catalog/tabak/tangiers-100-g/?page=3','https://smokelab.me/catalog/tabak/tangiers-100-g/?page=4',
'https://smokelab.me/catalog/tabak/tangiers-100-g/?page=5','https://smokelab.me/catalog/tabak/tangiers-250-g/',
'https://smokelab.me/catalog/tabak/tangiers-250-g/?page=2','https://smokelab.me/catalog/tabak/tangiers-250-g/?page=3',
'https://smokelab.me/catalog/tabak/tangiers-250-g/?page=4','https://smokelab.me/catalog/tabak/tangiers-250-g/?page=5',
'https://smokelab.me/catalog/tabak/world-tobacco-original-20-g/','https://smokelab.me/catalog/tabak/world-tobacco-original-20-g/?page=2',
'https://smokelab.me/catalog/tabak/world-tobacco-original-20-g/?page=3','https://smokelab.me/catalog/tabak/world-tobacco-original-200-g/',
'https://smokelab.me/catalog/tabak/x-tobacco-50-g/','https://smokelab.me/catalog/tabak/x-tobacco-50-g/?page=2',
'https://smokelab.me/catalog/tabak/zomo-50-g/','https://smokelab.me/catalog/tabak/sarma-100-g/',
'https://smokelab.me/catalog/tabak/severnyij-100-g/','https://smokelab.me/catalog/tabak/severnyij-100-g/?page=2',
'https://smokelab.me/catalog/tabak/severnyij-25-g/','https://smokelab.me/catalog/tabak/severnyij-25-g/?page=2',
]
for url in url_list:
get_name_count(get_html(url))
Ответы (2 шт):
скорее всего сайт после частых запросов понимает, что к нему запросы делает бот, поэтому можно попробовать делать запросы с рандомной задержкой, чтобы смоделировать поведение человека, например так:
from random import uniform
from time import sleep
for url in url_list:
get_name_count(get_html(url))
sleep(uniform(1, 5))
обьяснение: uniform возвращает рандомное вещественное значение из интервала, sleep останавливает выполнение на нужное кол-во секунд
Чисто теоретически "вообще ничего не происходит" потому, что в Вашем коде нет никакого вывода, тоесть вообще никуда. Но если предположить, что в оригинале (не в том что по ссылке, там вывода тоже нет) он есть, то все должно работать.
Позволю себе предложить свой вариант кода:
import pandas as pd
from bs4 import BeautifulSoup as Soup
import requests
if __name__ == '__main__':
site_url = 'https://smokelab.me/%s'
response = requests.get(site_url % 'catalog/tabak/')
soup = Soup(response.content, 'html.parser')
links = [site_url % a['href'] for a in soup.find('div', class_='catalog__sidebar').find_all('a')]
constructor = {
'Название': [],
'Количество': []
}
for link in links:
response = requests.get(link)
soup = Soup(response.content, 'html.parser')
items = soup.find_all('div', class_='products__list-item')
for item in items:
title = item.find('a', class_='products__list-item-name').text.strip()
qty = item.find('div', class_='products__list-item-remains').strong.text.strip()
constructor['Название'] += [title]
constructor['Количество'] += [qty]
pd.DataFrame(constructor).to_excel('./result.xlsx', index=False)
Получается 880 позиций.