Форум сайта python.su
1. Не могу разобраться, как указать путь(select), выводит не совсем то, или другой вариант?
2. Не могу прикрутить цикл к пагинации, что бы все страницы парсило.
3. Может лучше все делать в сессии - requests_html import HTMLSession?
import csv import fake_useragent import requests from bs4 import BeautifulSoup as bs def get_html(url): user_agent = fake_useragent.UserAgent() user = user_agent.random headers = {'User-Agent': str(user)} r = requests.get(url, headers=headers, params='') return r.text def get_page_links(html): soup = bs(html, 'lxml') ads = soup.find('div', class_='col-md-12 search-result').find_all('div', class_='search-result_item') all_links = [] for ad in ads: link = 'https://tourism.gov.ru' + ad.find('a', class_='search-result_item_link').get('href') all_links.append(link) return all_links def get_page_data(html): soup = bs(html, 'lxml') try: title = soup.find('div', class_='col-sm-9 col-xs-12 content').find('h1').text except Exception: title = '' try: inn = soup.select('div.col-sm-9.col-xs-12.content > div:nth-child(8) > div:nth-child(2)') except Exception: inn = '' data = {'Название': title, 'ИНН': inn, } return data def write_csv(data): with open('any.csv', 'a') as f: writer = csv.writer(f) writer.writerow((data["Название"], data["ИНН"])) def main(): url = 'https://tourism.gov.ru/operators/' all_links = get_page_links(get_html(url)) for link in all_links: html = get_html(link,) data = get_page_data(html) write_csv(data) if __name__ == '__main__': main()
Отредактировано sasholy (Дек. 16, 2020 12:25:46)
Офлайн
насчет пагинации, делим 4289 на 10 записей на стр., получаем 429 страниц, их все можно в цикле for перебрать.
я ваш код не запускал, но select отдает список, а вам нужно одно значение.
и в сессии делать парсинг - считается хорошим тоном.
Офлайн
robishoя все равно не шарю как это сделать, а возможно беря атрибут из следущая страница методом while True пока не исчезнет атребут, как сделать?
насчет пагинации, делим 4289 на 10 записей на стр., получаем 429 страниц, их все можно в цикле for перебрать.я ваш код не запускал, но select отдает список, а вам нужно одно значение. и в сессии делать парсинг - считается хорошим тоном.
Отредактировано sasholy (Дек. 16, 2020 16:03:44)
Офлайн
надо get_page_links(html) применить для всех 429 страниц
urls = [] for i in range(430): url = 'https://tourism.gov.ru/operators/' + f'?PAGEN_1={i}' links = get_page_links(get_html(url)) urls.append(links)
for url in urls: data = get_page_data(get_html(url))
Офлайн
robisho
надо get_page_links(html) применить для всех 429 страниц
def main(): urls = [] for i in range(100): url = 'https://tourism.gov.ru/operators/' + f'?PAGEN_1={i}' links = get_page_links(get_html(url)) urls.append(links) for url in urls: data = get_page_data(get_html(url)) print(data)
Офлайн
urls_list = [] for i in range(1, 430): url = 'https://tourism.gov.ru/operators/' + f'?PAGEN_1={i}' links = get_page_links(get_html(url)) urls_list.append(links) print(f'{i}') # для наглядности работы парсера for urls in urls_list: for url in urls: data = get_page_data(get_html(url))
inn = soup.select('div.col-sm-9.col-xs-12.content > div:nth-child(8) > div:nth-child(2)')[0].text.strip()
Отредактировано robisho (Дек. 17, 2020 04:14:15)
Офлайн
robishoспс мил человек!
Офлайн
а как сделать, что бы с каждым циклом user agent менялся, ну что бы не банили?
Офлайн
можно сначала достать id а потом по ним перейти на страницу с именнем и инн
import requests import re url = 'https://tourism.gov.ru/operators/' headers = { 'User-Agent': 'Mozilla/5.0', 'Accept': 'application/json, text/javascript, */*; q=0.01', 'Accept-Language': 'ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3', 'Accept-Encoding': 'gzip, deflate, br', 'X-Requested-With': 'XMLHttpRequest', 'Connection': 'keep-alive', } response =requests.get(url,headers = headers,params='PAGEN_1=429') print(response.status_code) data_json = response.json() print(data_json) data_html = data_json['html'] target = re.findall(r'id=\d+',data_html) print(target)
Офлайн
xam1816спс, но я имел в виду с моим кодом(fake_useragent), как мне ваш код прописать в свой?
можно сначала достать id а потом по ним перейти на страницу с именнем и инн
Офлайн