创建了一个小型解析器
import requests
from bs4 import BeautifulSoup
URL = 'https://apteka.ru/vendor/Эгис%20Фармацевтический%20завод%20ЗАО/'
HEADERS = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36',
'accept': '*/*'}
HOST = 'https://apteka.ru'
def get_html(url, params=None):
r = requests.get(url, headers=HEADERS, params=params)
return r
def get_content(html):
soup = BeautifulSoup(html, 'html.parser')
items = soup.find_all('div', class_='catalog-card card-flex')
lp = []
for item in items:
count = item.find('span', class_='light-button__label').get_text(strip=True)
if count == 'Купить':
lp.append({
'name': item.find('a', class_='catalog-card__name').get_text(strip=True),
'vendor': item.find('span', class_='emphasis').get_text(strip=True),
'price': item.find('span', class_='moneyprice__roubles').get_text(strip=True),
'currency': item.find('span', class_='moneyprice__currency').get_text(strip=True),
'link': HOST + item.find('a').get('href')
})
else:
lp.append({
'link': HOST + item.find('a').get('href')
})
return lp
def parse():
html = get_html(URL)
if html.status_code == 200:
lp = get_content(html.text)
print(lp)
else:
print('Error')
parse()
问题:
- 如果在网站上
count = 'Купить'
- 这意味着只有一种剂量,否则有选择。lp
然后在我只放的数组中link
。当数组已经形成时,您是否需要在操作期间get_content(html)
通过额外的调用link
或在之后检查?插入同一个数组如何更正确?parse()
lp
- 如何绕过所有页面,而不仅仅是第一个?
更新:
- 不必要的问题,改变了结构,现在更好更快
- 绕过执行如下(如果页面上没有产品卡,则会在页面上显示一个新类):
def parse():
i = 1
LP = []
# Для каждой страницы
while get_html(URL, {'page': i}).status_code == 200:
html = get_html(URL, {'page': i})
soup = BeautifulSoup(html.text, 'html.parser')
page = soup.find('div', class_='catalog-empty-response')
# Остановка в случае пустой витрины на странице
if page:
break
else:
lp = get_content(html.text)
LP = LP + lp
i = i + 1
print(LP)
有三种方法:
形成所有可能的链接,下载。但这并不总是可能的。
递归下载。当我们得到一个新链接时,我们只需调用“下载页面”函数。如果页面和嵌套很少,那么它工作得很好并且很容易编码。
列出方式。原理图代码