Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 16, 2020 12:13:22

sasholy
Зарегистрирован: 2018-08-21
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

Help! Парсер

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)

Офлайн

#2 Дек. 16, 2020 15:28:05

robisho
Зарегистрирован: 2020-10-19
Сообщения: 60
Репутация: +  2  -
Профиль   Отправить e-mail  

Help! Парсер

насчет пагинации, делим 4289 на 10 записей на стр., получаем 429 страниц, их все можно в цикле for перебрать.
я ваш код не запускал, но select отдает список, а вам нужно одно значение.
и в сессии делать парсинг - считается хорошим тоном.

Офлайн

#3 Дек. 16, 2020 16:02:37

sasholy
Зарегистрирован: 2018-08-21
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

Help! Парсер

robisho
насчет пагинации, делим 4289 на 10 записей на стр., получаем 429 страниц, их все можно в цикле for перебрать.я ваш код не запускал, но select отдает список, а вам нужно одно значение. и в сессии делать парсинг - считается хорошим тоном.
я все равно не шарю как это сделать, а возможно беря атрибут из следущая страница методом while True пока не исчезнет атребут, как сделать?

Отредактировано sasholy (Дек. 16, 2020 16:03:44)

Офлайн

#4 Дек. 16, 2020 16:37:30

robisho
Зарегистрирован: 2020-10-19
Сообщения: 60
Репутация: +  2  -
Профиль   Отправить e-mail  

Help! Парсер

надо 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)

получите список всех компаний, а потом для каждой применить get_page_data(html) тоже в цикле for
 for url in urls:
    data = get_page_data(get_html(url))

Офлайн

#5 Дек. 16, 2020 17:00:26

sasholy
Зарегистрирован: 2018-08-21
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

Help! Парсер

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)
не выдает ссылки? ток 10

Офлайн

#6 Дек. 17, 2020 03:32:12

robisho
Зарегистрирован: 2020-10-19
Сообщения: 60
Репутация: +  2  -
Профиль   Отправить e-mail  

Help! Парсер

 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))

в предыдущем варианте на выходе получался список списков, поэтому нужно было добавить еще один цикл for

а инн, так как select отдает список, а список из одного элемента, то
 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)

Офлайн

#7 Дек. 17, 2020 10:45:48

sasholy
Зарегистрирован: 2018-08-21
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

Help! Парсер

robisho
спс мил человек!

Офлайн

#8 Дек. 17, 2020 10:49:53

sasholy
Зарегистрирован: 2018-08-21
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

Help! Парсер

а как сделать, что бы с каждым циклом user agent менялся, ну что бы не банили?

Офлайн

#9 Дек. 17, 2020 12:26:00

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1393
Репутация: +  124  -
Профиль   Отправить e-mail  

Help! Парсер

можно сначала достать 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)

Офлайн

#10 Дек. 17, 2020 14:25:33

sasholy
Зарегистрирован: 2018-08-21
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

Help! Парсер

xam1816
можно сначала достать id а потом по ним перейти на страницу с именнем и инн
спс, но я имел в виду с моим кодом(fake_useragent), как мне ваш код прописать в свой?

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version