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