Форум программистов, компьютерный форум, киберфорум
Наши страницы
Python: Web
Войти
Регистрация
Восстановить пароль
 
onhor
0 / 0 / 0
Регистрация: 24.03.2017
Сообщений: 6
#1

Не создается файл с данными при парсинге сайта - Python

24.03.2017, 14:35. Просмотров 364. Ответов 8
Метки нет (Все метки)

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#!/usr/bin/env python3.6
# _*_ coding:utf-8 _*_
import requests
from bs4 import BeautifulSoup
import csv
 
def get_html(url):
    r = requests.get(url)
    return r.text
 
def get_total_pages(html):
    soup = BeautifulSoup(html, 'lxml')
 
    pages = soup.find('div', class_='pagination-pages').find_all('a', class_='pagination-page')[-1].get('href')
    total_pages = pages.split('=')[1].split('&')[0]
 
    return int(total_pages)
 
 
def write_csv(data):
    with open('avito.csv', 'a') as f:
        writer = csv.writer(f)
 
        writer.writerow((data['title'],
                         data['price'],
                         data['address'],
                         data['time'],
                         data['url']))
 
def get_page_data(html):
    soup = BeautifulSoup(html, 'lxml')
 
    ads = soup.find('div', class_='catalog-list').find_all('div', class_='item_table')
 
    for ad in ads:
        #title, price, address, time, url
        try:
            title = ad.find('div', class_='description').find('h3').text.strip()
        except:
            title = ''
 
        try:
            url = 'https://www.avito.ru' + ad.find('div', class_='description').find('h3').find('a').get('href')
        except:
            url = ''
 
        try:
            price = ad.find('div', class_='about').text.strip()
        except:
            price = ''
 
        # try:
        #     metro =
 
        try:
            address = ad.find('p', class_='address').text.strip()
        except:
            address = ''
 
        try:
            time = ad.find('div', class_='data').find('div', class_='date').text.strip()
        except:
            time = ''
 
            data = {'title': title,
                    'price': price,
                    'address': address,
                    'time': time,
                    'url': url}
 
            write_csv(data)
 
 
def main():
    url = 'https://www.avito.ru/novosibirsk/kvartiry/sdam/na_dlitelnyy_srok/1-komnatnye?p=1&i=1&pmax=14000&user=1'
    base_url = 'https://www.avito.ru/novosibirsk/kvartiry/sdam/na_dlitelnyy_srok/1-komnatnye?'
    page_part = 'p='
    query_part = '&i=1&pmax=14000&user=1'
 
    total_pages = get_total_pages(get_html(url))
 
    for i in range(1, total_pages+1):
        url_gen = base_url + page_part + str(i) + query_part
        #print(url_gan)
        html = get_html(url_gen)
        get_page_data(html)
 
 
if __name__ == '__main__':
    main()
Сделал по уроку на ютюбе, ошибку не выдает, но файл с данными не создает. Помогите люди добрые, получить результаты. Да и понять в чем ошибка хочется.
http://www.cyberforum.ru/python/thread1453190.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.03.2017, 14:35
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Не создается файл с данными при парсинге сайта (Python):

Ошибка при парсинге
Здравствуйте. Пытаюсь написать простой парсер, но возникла непонятная ошибка...

Реализовать многопоточность при парсинге сайтов
Привет парни!) есть код ,но вообще не отстреливаю как реализовать...

Невалидный PNG при парсинге Grab
Уважаемые программисты, помогите, пожалуйста, решить проблему. Пишу...

Как выудить необходимы данные при парсинге
Добрый день Мне необходимо спарсить данную страницу...

KeyError при парсинге AJAX(json).Python 3.6.2
Всем привет, решил написать парсер на python одного сайта, где данные...

8
Wohilas
18 / 18 / 2
Регистрация: 22.09.2015
Сообщений: 22
25.03.2017, 13:06 #2
Python
1
2
3
4
5
6
7
8
9
10
11
12
        try:
            time = ad.find('div', class_='data').find('div', class_='date').text.strip()
        except:
            time = ''
 
            data = {'title': title,
                    'price': price,
                    'address': address,
                    'time': time,
                    'url': url}
 
            write_csv(data)
У вас вызов функции write_csv находится в блоке с исключением. Соответственно он будет срабатывать только когда словит здесь любое исключение (не ловите все исключения):
Python
1
time = ad.find('div', class_='data').find('div', class_='date').text.strip()
1
onhor
0 / 0 / 0
Регистрация: 24.03.2017
Сообщений: 6
26.03.2017, 14:45  [ТС] #3
Не думаю что дело в исключениях, скорее всего у меня проблема с кодировкой, потому что если в место .text.strip() cnfdk. encode('utf-8').strip() то все начинает работать и файл создается, таблица формируется. выглядит так:
0
Миниатюры
Не создается файл с данными при парсинге сайта  
Jabbson
Модератор
Эксперт по компьютерным сетям
3344 / 2419 / 745
Регистрация: 03.11.2009
Сообщений: 7,759
Записей в блоге: 3
26.03.2017, 18:44 #4
Цитата Сообщение от onhor Посмотреть сообщение
Не думаю что дело в исключениях
не думаете, а зря.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
...
        try:
            time = ad.find('div', class_='data').find('div', class_='date').text.strip()
        except:
            time = ''
 
            data = {'title': title,
                    'price': price,
                    'address': address,
                    'time': time,
                    'url': url}
 
            write_csv(data)
...
это означает - если произошло исключение при поиске даты, сохранить пустое время и записать в csv.

Добавлено через 55 секунд
PS имена модулей для переменных - не славная идея
0
onhor
0 / 0 / 0
Регистрация: 24.03.2017
Сообщений: 6
26.03.2017, 19:30  [ТС] #5
Я не до конца понимаю как мне написать, без исключения что ли?

Python
1
2
3
4
5
6
7
8
9
10
        try:
            time = ad.find('div', class_='data').find('div', class_='date').text.strip()
 
        data = {'title': title,
                'price': price,
                'address': address,
                'time': time,
                'url': url}
 
        write_csv(data)
Так? Я сразу попробовал, не работает, неверный синтаксис.
0
onhor
0 / 0 / 0
Регистрация: 24.03.2017
Сообщений: 6
26.03.2017, 19:36  [ТС] #6
А как есть выдает ошибку с кодировкой.
0
Миниатюры
Не создается файл с данными при парсинге сайта  
Jabbson
Модератор
Эксперт по компьютерным сетям
3344 / 2419 / 745
Регистрация: 03.11.2009
Сообщений: 7,759
Записей в блоге: 3
26.03.2017, 20:20 #7
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import requests
from bs4 import BeautifulSoup as bs
import csv
import re
 
 
def get_html(url):
    r = requests.get(url)
    return r.content
 
 
def get_total_pages(html):
    soup = bs(html, 'lxml')
    last_nav_link = soup.select('div.pagination-pages a')[-1]
    total_pages = re.search(r'\?p=(\d+)&', str(last_nav_link)).group(1)
    return int(total_pages)
 
 
def get_page_data(html):
    soup = bs(html, 'lxml')
    ads = soup.select('div.description')
    page_ads = []
 
    for ad in ads:
 
        title_tag = ad.find('a', class_='item-description-title-link')
 
        title = title_tag.text.strip()
        url = 'https://www.avito.ru' + title_tag.get('href')
        price = ad.find('div', class_='about').find(text=True, recursive=False).strip()
        address = ad.find('p', class_='address').text.strip()
        date = ad.find('div', class_='date').text.strip()
        page_ads.append({'title': title, 'price': price, 'address': address, 'time': date, 'url': url})
 
    return page_ads
 
 
def main():
    url_template = 'https://www.avito.ru/novosibirsk/kvartiry/sdam/na_dlitelnyy_srok/1-komnatnye?p={}&i=1&pmax=14000&user=1'
 
    total_pages = get_total_pages(get_html(url_template.format(1)))
 
    with open('avito.csv', 'w', encoding='utf-8') as f:
        writer = csv.DictWriter(f, fieldnames=['title', 'price', 'address', 'time', 'url'])
        writer.writeheader()
 
        for i in range(1, total_pages + 1):
            page_url = url_template.format(i)
            print(page_url)
            page_html = get_html(page_url)
            page_ads = get_page_data(page_html)
 
            writer.writerows(page_ads)
 
if __name__ == '__main__':
    main()
Не создается файл с данными при парсинге сайта
0
onhor
0 / 0 / 0
Регистрация: 24.03.2017
Сообщений: 6
26.03.2017, 22:21  [ТС] #8
Большое спасибо! Буду разбираться. В IDLE и Саблайме запустилось нормально, а в атоме выдает ошибку на подключение модуля:
0
Миниатюры
Не создается файл с данными при парсинге сайта  
onhor
0 / 0 / 0
Регистрация: 24.03.2017
Сообщений: 6
27.03.2017, 08:28  [ТС] #9
Про ошибку с исключением, я добавил кодировку при создании файла как в примере выше и мой вариант тоже корректно заработал. Спасибо еще раз за подсказку.
Python
1
with open('avito.csv', 'a', encoding='utf-8') as f:
Проблема запуском в Atom решилась дописыванием:

#!/usr/bin/env python3.6
# _*_ coding:utf-8 _*_
0
27.03.2017, 08:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.03.2017, 08:28
Привет! Вот еще темы с решениями:

При парсинге таблицы не видит значения ячеек [requests, lxml]
Здравствуйте. Пытаюсь получить значения ссылок на праздники с этого сайта...

При парсинге сайта содержание в строке выводится не на языке сайта
Здравствуйте. Помогите решить проблему. Сайт в браузере на русском. Когда я его...

Не создается файл с данными
Решил попробовать запустить пример из книги,который должен создать файл и...

При нажатии на кнопку файл не создается на диске, а он создается только после сворачивания или закрытия окна...
Знакомлюсь с графическим интерфейсом Java Swing. Появилась такая проблема: при...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru