Медленная очистка и не вытягивание всех страниц в ветке - требуется помощь

avatar
George Smiley
8 августа 2021 в 16:37
21
0
0

У меня есть неплохой код, я думаю, для школьника-выпускника, но он не извлекает все данные, для которых, как я думал, он был разработан.

Я изучаю веб-сайт для исследования и думаю, что он извлекает все данные со всех страниц в каждом потоке. Я могу быть совершенно неправ, потому что в некоторых темах будет 1 страница, в некоторых - 7, а в некоторых - 5. Итак, я мог бы сделать это неправильно, но хотел бы получить здесь конструктивную критику. Это может только помочь. Это моя структура и база, которую я предполагаю, прежде чем начнется "веселье":

!pip install random_user_agent

from google.colab import drive
drive.mount('/content/drive')

import time
from time import sleep
import pandas as pd
from bs4 import BeautifulSoup
import requests
import json
import os.path
from os import path
import urllib.request
import random
import concurrent.futures

from random_user_agent.user_agent import UserAgent
from random_user_agent.params import SoftwareName, OperatingSystem
software_names = [SoftwareName.CHROME.value]
operating_systems = [OperatingSystem.WINDOWS.value, OperatingSystem.LINUX.value]   
user_agent_rotator = UserAgent(software_names=software_names, operating_systems=operating_systems, limit=1000)




def empty(df):
   return df.append(pd.Series(), ignore_index=True)

def add(df,col,val):
  df.iloc[-1, df.columns.get_loc(col)] = val  

def req(url):
  user_agent = user_agent_rotator.get_random_user_agent()
  headers = {
      'content-type': 'text/html;charset=UTF-8',
      'Accept-Encoding': 'gzip, deflate, sdch',
      'Accept-Language': 'en-US,en;q=0.8',
      'User-Agent': user_agent,
      'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
  }

  #print(url)
  r = requests.get(url, headers=headers)
  sleep(1)
  html_doc = r.content
  soup = BeautifulSoup(html_doc, 'html.parser')
  #print(soup.prettify())
  return soup
def download_image(url,fullname):
    
    response = requests.get(url)
    file = open(fullname, "wb")
    file.write(response.content)
    file.close()
    print(fullname)

Так что не знаю, если все вышеперечисленное сделано правильно, но это моя первая попытка.

Кроме того, я не могу понять, почему так долго запрашивается и извлекается каждая страница форума. Я думал, что у меня это было, но я думаю, что нет. У меня есть эта часть кода:

#@title

url = 'https://example.com/forums/annoying-discussion.2/'

links= []
for i in range(1695):
  if i ==0:
    print(url)
    so=req(url)
  else:
    print(url+'page-'+str(i+1))
    so=req(url+'page-'+str(i+1))

  l= ['https://example.com'+a.findAll('a')[-1].get('href')for a in so.findAll('div', {'class':'structItem-title'})]
  print(len(links))
  
  i+=1
  links = links + l

Я просматриваю веб-сайт для исследования, и я думал, что он извлекает все данные со всех страниц в каждом потоке. Я могу быть совершенно неправ, потому что в некоторых темах будет 1 страница, в некоторых - 7, а в некоторых - 5. Итак, я мог бы сделать это неправильно, но хотел бы получить здесь конструктивную критику. Это может только помочь. Вот что я запускаю в этом разделе после вышеизложенного:

th=1
imgC = 1
for link in links:
  try:
    pat = '/content/drive/MyDrive/Thread'+str(th)
    os.mkdir(pat)
  except:
    pass
  co = ['link','type','Title','username','Date','Text' , 'Images']
  df = pd.DataFrame(columns=co)
  df = empty(df)
  s=''
  try:

    print(link)
    s=req(link)
    add(df,'link',link)
  except:
    continue
  
  try:
    #print(s.findAll('h1')[1].text)
    #print(s.find('time').text)
    add(df,'type',s.findAll('h1')[1].find('span').text)
    add(df,'Title',s.findAll('h1')[1].text)
    add(df,'Date',s.find('time').text)
    add(df,'username',s.find('span',{'class':'username'}).text)
  except:
    continue

  
  try:
    #print(s.find('div',{'class':'bbWrapper'}).text)
    add(df,'Text',s.find('div',{'class':'bbWrapper'}).text)
  except:
    pass

  try:
    imgs = []
    for a in s.find('div',{'class':'bbWrapper'}).findAll('img'):
      if 'https:' in a.get('src'):
        imgs.append(a.get('src') )
        download_image(a.get('src'),pat+'/'+str(imgC)+'.jpg')
        imgC+=1
         
      else:
        imgs.append('URL'+a.get('src') )
        download_image('URL'+a.get('src').replace(' ','%20'),pat+'/'+str(imgC)+'.jpg')
        imgC+=1
         
    #print(imgs)

    im = ','.join(imgs)
    add(df,'Images',im)
  except Exception as e:
    print(imgs)
    print(e)
    pass
  print(df)
  
  for ar in s.findAll('article',{'class':'message message--post js-post js-inlineModContainer '}):
    df =empty(df)

    try:
      add(df,'username',ar.find('span',{'class':'username'}).text)
      
    except:
      pass  
    add(df,'Date',ar.find('time').text)

    try:
      #print(ar.find('div',{'class':'bbWrapper'}).text)
      add(df,'Text',ar.find('div',{'class':'bbWrapper'}).text)
    except:
      pass

    try:
      imgs = []
      for a in ar.find('div',{'class':'bbWrapper'}).findAll('img'):
        if 'https:' in a.get('src'):
          imgs.append(a.get('src') )
          download_image(a.get('src'),pat+'/'+str(imgC)+'.jpg')
          imgC+=1
         
        else:
          imgs.append('https://example.com'+a.get('src'))
          download_image('https://example.com'+a.get('src').replace(' ','%20'),pat+'/'+str(imgC)+'.jpg')
          imgC+=1
          
      im = ','.join(imgs)
      add(df,'Images',im)
    except Exception as e:
        print(imgs)
        print(e)
        pass
    print(imgs)

    
  print('##################')


  df.to_csv( '/content/drive/MyDrive/'+'Thread'+str(th)+'.csv')
  th+=1

Источник

Ответы (0)