Найти - Пользователи
Полная версия: Help! Парсер
Начало » Python для новичков » Help! Парсер
1 2
sasholy
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()
robisho
насчет пагинации, делим 4289 на 10 записей на стр., получаем 429 страниц, их все можно в цикле for перебрать.
я ваш код не запускал, но select отдает список, а вам нужно одно значение.
и в сессии делать парсинг - считается хорошим тоном.
sasholy
robisho
насчет пагинации, делим 4289 на 10 записей на стр., получаем 429 страниц, их все можно в цикле for перебрать.я ваш код не запускал, но select отдает список, а вам нужно одно значение. и в сессии делать парсинг - считается хорошим тоном.
я все равно не шарю как это сделать, а возможно беря атрибут из следущая страница методом while True пока не исчезнет атребут, как сделать?
robisho
надо 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))
sasholy
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
robisho
 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()
sasholy
robisho
спс мил человек!
sasholy
а как сделать, что бы с каждым циклом user agent менялся, ну что бы не банили?
xam1816
можно сначала достать 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)
sasholy
xam1816
можно сначала достать id а потом по ним перейти на страницу с именнем и инн
спс, но я имел в виду с моим кодом(fake_useragent), как мне ваш код прописать в свой?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB