Я хочу сделать скребок, который очищает страницу заказа ресторана на Zomato, извлекает меню еды и записывает его в файл JSON.Вот мой код:
import re
import urllib
from urllib import parse
from bs4 import BeautifulSoup
from urllib.parse import urlparse
import urllib.request
from selenium import webdriver
from bs4 import NavigableString
import sys
import json
browser = None
try:
browser = webdriver.Firefox()
except Exception as error:
print(error)
class ZomatoRestaurant:
def __init__(self, url):
self.url = url
# print("opening")
self.html_text = None
try:
browser.get(self.url)
self.html_text = browser.page_source
# self.html_text = urllib.request.urlopen(url).read().decode('utf-8')
# self.html_text = requests.get(url).text
except Exception as err:
print(str(err))
return
else:
print('Access successful.')
self.soup = None
if self.html_text is not None:
self.soup = BeautifulSoup(self.html_text, 'lxml')
def scrap(self):
if self.soup is None:
return {}
soup = self.soup
menu_details = dict()
name_anchor = soup.find("a", attrs={"class": "o2header-title"})
if name_anchor:
menu_details['restaurant_name'] = name_anchor.text.strip()
else:
menu_details['restaurant_name'] = ''
menu_details['dish_mappings'] = []
for div in soup.find_all("div", attrs={'class': 'ui item item-view'}):
child_div_dish_name = div.find("div", attrs={'class': 'header'})
child_div_dish_price = div.find("div", attrs={'class': 'description'})
menu_details['dish_detail']=[]
if child_div_dish_name:
menu_details[dish_detail]['dish_name'].append(child_div_dish_name.get_text())
menu_details[dish_detail]['dish_price'].append(child_div_dish_price.get_text())
return menu_details
if __name__ == '__main__':
if browser is None:
sys.exit()
out_file = open("zomato_menu.json", "a")
with open("order_online_menu.txt", "r", encoding="utf-8") as f:
for line in f:
zr = ZomatoRestaurant(line)
json.dump(zr.scrap(), out_file)
out_file.write('\n')
out_file.close()
browser.close()
Веб-ответ Zomato является динамическим, и он отфильтровывает запросы, которые он видит как сделанные ботами.По этой же причине я не могу использовать библиотеки Python, такие как urllib, запросы и т. Д., Для выполнения запросов на доступность HTML.Таким образом, я использовал браузер для отправки запросов вместо скриптов Zomato.Все, что мне нужно, это браузер, в моем случае, Mozilla Firefox, чтобы облегчить сценарий.Я использовал драйвер Gecko в Selen для взаимодействия с Firefox. Selenium не имитирует сеанс браузера, как большинство других пакетов, это настоящий сеанс браузера.Писать для селена - это в основном написание набора действий и подача их в браузер.
Проблема, с которой я сталкиваюсь, состоит в том, что веб-сайт имеет сложную структуру, а код, который я написал, не может получить меню с веб-сайта,но я не мог найти недостаток в этом.Может кто-то попытаться определить ошибку или то, что было написано неправильно, что приводит к тому, что мой выходной файл JSON имеет пустые атрибуты, такие как:
{"restaurant_name": "", "dish_mappings": []}
{"restaurant_name": "", "dish_mappings": []}
Примеры ссылок, которые я использовал для этого кода: ПорядокСтраница ресторана в Индоре
Страница заказа другого ресторана