1 Востаннє редагувалося Eff1c (08.02.2020 15:55:01)

Тема: парсер на bs4 помилка в find_all

Пишу парсер для Instagram. Повинен парсити підписників і відстежуваних в масиви. Порівнювати ці два масиви, щоб дізнатися на яких людей заданий користувач підписаний, які за ним не стежать (тобто хто не підписаний взаємно).

Код
import requests
from bs4 import BeautifulSoup


def get_html(url):
    r = requests.get(url)
    return r.text

def get_followers(url):
    html = get_html(url + "followers/")
    soup = BeautifulSoup(html, 'lxml')

    blocks = soup.find('div', class_='isgrP').find_all('div', class_='uu6c_')
    followers = []
    for block in blocks:
        follower = block.find('div', class_='d7ByH').find('a').get('href')
        followers.append(follower)

    return followers

def get_following(url):
    html = get_html(url + "following/")
    soup = BeautifulSoup(html, 'lxml')

    blocks = soup.find('div', class_='isgrP').find_all('li')
    following = []
    for block in blocks:
        follow = block.find('a', class_='FPmhX notranslate  _0imsa ').get('href')
        following.append(follow)

    return following

def main():
    url = "https://www.instagram.com/" + input("Введіть нікнейм: \n") + "/"
    followers = get_followers(url)
    following = get_following(url)
    output = list(set(following) - set(followers))
    for i in output:
        print("https://www.instagram.com/" + i + "/")


if __name__ == '__main__':
    main()

Видає помилку:

Traceback (most recent call last):
  File "/home/eff1c/parser/instagram.py", line 43, in <module>
    main()
  File "/home/eff1c/parser/instagram.py", line 35, in main
    followers = get_followers(url)
  File "/home/eff1c/parser/instagram.py", line 13, in get_followers
    blocks = soup.find('div', class_='isgrP').find_all('div', class_='uu6c_')
AttributeError: 'NoneType' object has no attribute 'find_all'

2

Re: парсер на bs4 помилка в find_all

Ну так проблема ж не в find_all, а в тому, що find повертає None. І взагалі, нащо ви find_all серед результатів find робите?

https://www.crummy.com/software/Beautif … /doc/#find

If find_all() can’t find anything, it returns an empty list. If find() can’t find anything, it returns None.

Подякували: Eff1c, leofun012

3

Re: парсер на bs4 помилка в find_all

Вже протестив і зрозумів, що find повертає None

koala написав:

нащо ви find_all серед результатів find робите?

Орієнтувався на код іншої людини
Він спочатку за допомогою find витягугвав блок з всіма даними, а потім за допомогою find_all серед результату забирав список повторяючих блоків з даними. В його випадку це був блок списку товарів на Авіто (по певному пошуковому запиті), а потім окремо кожен товар з нього.
То потрібно одразу find_all (без лишніх дій) на div з певним класом написати?

4

Re: парсер на bs4 помилка в find_all

У будь-якому разі:
- я щось не бачу, щоб ви якісь аутентифікаційні дані надсилали. Як instagram дізнається, чиїх саме фоловерів ви запитуєте?
- назви класів d7ByH, isgrP і т.д. виглядають автозгенерованими. Тобто далеко не факт, що вони так само зватимуться на іншій сторінці.

Подякували: Eff1c1

5

Re: парсер на bs4 помилка в find_all

koala написав:

Як instagram дізнається, чиїх саме фоловерів ви запитуєте?

Я ввожу нік і вставляю його в посилання

url = "https://www.instagram.com/" + input("Введіть нікнейм: \n") + "/"
koala написав:

назви класів d7ByH, isgrP і т.д. виглядають автозгенерованими. Тобто далеко не факт, що вони так само зватимуться на іншій сторінці.

Теж про це думав, але як дізнатися загальні назви?

6

Re: парсер на bs4 помилка в find_all

Все, зрозумів в чому проблема
Коли дивився код сторінки був залогінений  *FACEPALM*
Думав, що розлогіненим теж можна дивитись так як сторінка не приватна і ця інформація доступна. Але саме підписники і підписки дивитись не можна.
Тепер проблема в тому як залогінитись. Потрібна якась бібліотека, якщо так то яка?

7

Re: парсер на bs4 помилка в find_all

Та тим же request-ом, тільки куки поставити.

Подякували: Eff1c1