Python Соскоб - таблица с более чем одним текстовым элементом - PullRequest
0 голосов
/ 04 мая 2020

Python нуб здесь. Это мой первый python код. Я пытаюсь вычеркнуть список аккаунтов Instagram и их подписчиков с этого сайта . Я могу извлечь данные, но мне трудно получить их в правильном формате в формате CSV. Я хочу извлечь данные с помощью заголовков Instagram Handle, Followers, Posts для всех страниц этого сайта. Вот мой код, любая помощь будет принята с благодарностью.

import requests
from bs4 import BeautifulSoup

url ='https://www.trackalytics.com/the-most-followed-instagram-profiles/page/1/'

headers= {'User-Agent': 'Mozilla/5.0'}

response = requests.get(url)


r = requests.get(url)

soup = BeautifulSoup(response.content, 'lxml')

table2 = soup.find_all('table', recursive=True)

table = table2[0]

with open ("instagram.txt", 'w') as file:
    for row in table.find_all('tr'):
     for cell in row.find_all('td'):
        container = cell.text.strip()
        file.write(container)
        

1 Ответ

1 голос
/ 04 мая 2020

Во-первых: вы должны использовать модуль csv для создания правильного файла CSV. Используя только обычные open() и write(), вы должны вручную преобразовать каждую строку данных в строку со значениями, разделенными , и \n в конце. Но могут потребоваться другие более сложные изменения - ie. введите текст " ", если в тексте , или \n.

Второе: вам может потребоваться более сложный код для очистки данных перед сохранением - ie. Вы можете удалить пробелы, табуляции, \n, ( ), разбить текст на две колонки и т. д. c.

В-третьих: вам может потребоваться l oop для чтения других страниц.

import requests
from bs4 import BeautifulSoup
import csv

# --- functions ---

def get_page(number):
    url = 'https://www.trackalytics.com/the-most-followed-instagram-profiles/page/{}/'.format(number)
    headers= {'User-Agent': 'Mozilla/5.0'}

    response = requests.get(url)
    soup = BeautifulSoup(response.content, 'lxml')

    return soup

def get_data(soup):
    table = soup.find('table')

    results = []

    for row in table.find_all('tr'):
        all_cells = row.find_all('td')

        # skip empty rows
        if all_cells:
            a = all_cells[0].find('span').text.strip()

            b = all_cells[1].text.strip()

            c = all_cells[2].text.strip().split('\n')
            c = [clean(item) for item in c]

            d = all_cells[3].text.strip().split('\n')
            d = [clean(item) for item in d]

            e = all_cells[3].text.strip().split('\n')
            e = [clean(item) for item in e]

            f = all_cells[3].text.strip().split('\n')
            f = [clean(item) for item in f]

            results.append([a,b,c[0],c[1],d[0],d[1],e[0],e[1],f[0],f[1]])

    return results

def clean(text):
    return text.strip().replace(' ', '').replace(',', '').replace('(', '').replace(')', '')

def write_data(data):

    with open ("instagram.txt", 'w') as writer:
        cvs_writer = csv.writer(writer)

        # write header
        cvs_writer.writerow([
            'Rank',
            'Profile',
            'Total Followers',
            'Total Followers today',
            'Total Following',
            'Total Following today',
            'Total Posts',
            'Total Posts today',
            'Total Influence',
            'Total Influence today'
        ])

        cvs_writer.writerows(data)

# --- main ---

all_data = []

for number in range(1, 10):
    print('page:', number)
    soup = get_page(number)
    data = get_data(soup)
    all_data.extend(data)

write_data(all_data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...