Как я могу оптимизировать мой веб-скребок для 40k + ссылок - PullRequest
0 голосов
/ 05 марта 2020

Со списком из 40 тыс. Ссылок, из которых приходится извлекать электронные письма / названия компаний - навсегда так, как я это сделал.

  1. Все сайты выглядят одинаково, но им не хватает идентификаторов или какого-либо надлежащего порядка / классификации. Таким образом, я должен искать, используя regex для электронной почты (или я так думаю). В остальном это легко, они находятся в том же порядке / месте. Если я использую его на правильном веб-сайте, как это может быть быстрее?

  2. После этого я добавляю все в словарь - потому что, если электронное письмо повторяется, оно не добавляется. Но тогда я не знаю, как добавить все в файл Excel. Прямо сейчас это разделено на 2 колонки. Было бы неплохо -> каждому свой столбец. И я также чувствую, что это слагги sh и медленно.

  3. Было бы быстрее написать все после каждой находки? в случае взлома кода. Или это только продлит время.

  4. Основная проблема заключается в том, что имеется 1 электронное письмо - несколько компаний и в 10 раз больше доменов. Есть ли способ иметь такие строки? электронная почта - названия компаний - домены электронная почта - названия компаний - домены
from bs4 import BeautifulSoup
import pandas as pd
from openpyxl import load_workbook
import requests
import re
import csv
from datetime import datetime
import time

def details_pag_antillephone(URL, restrans, detalii):
    page = requests.get(URL)
    soup = BeautifulSoup(page.content, 'html.parser')
    results = soup.find('div', class_=restrans)
    detalii = results.find_all('div', class_=detalii)
    return detalii, soup


dataDic = {}
links = []

df = pd.read_excel(r'C:\Users\Adrian\Desktop\40k_links.xlsx')
links = df['Unnamed: 7'].tolist()

start_time = datetime.now()
for i in links[10000:15000]: # Run 5000 intervals, takes too long otherwise
    if i != float:  # sometimes there are floats in the excel file, or empty
        URL = 'http://' + i  # add before to complete the link - to access
        try:   # sometimes there is no email, and otherwise it breaks the code apparently. Workaround? 
            validator = details_pag_antillephone(URL, 'col-md-9', 'flex-row') #col-md-9 is the box containing the text, flex-row contains the company, name, address
            company = validator[0][0].text.strip().split('\n')[1] # always the 1st after split
            address = validator[0][2].text.strip().split('\n')[1] 
            email = re.findall('[\w\.-]+@[\w\.-]+', validator[1].text)[0]
            websites = re.findall('www.[\w\.-]+', validator[1].text)
            dataDic[email] = [company, '  '*20, address, websites]
        except:
            continue
end_time = datetime.now()
print('Duration: {}'.format(end_time - start_time))


df = pd.DataFrame(list(dataDic.items()), columns=['Company', 'Detalii'])
print(df)
with pd.ExcelWriter(r'C:\Users\Adrian\Desktop\All_test_1.xlsx') as writer:
    df.to_excel(writer)

Пример того, с чем я сейчас работаю:

<div class="col-md-9">
            <div class="box">
              <h3>Antillephone License Validation</h3>
              <div class="details subheader">This page was generated on Mar 5, 2020</div>
              <div class="separator"></div>
                <div class="flex-row">
                  <div>Company name</div>
                  <div>Hero Island N.V. </div>
                </div>
                  <div class="separator"></div>
                  <div class="flex-row">
                    <div>Trade name</div>
                    <div>Hero Island N.V. </div>
                  </div>
                <div class="separator"></div>
                <div class="flex-row">
                  <div>Address</div>
                  <div>Curacao, CW</div>
                </div>
                <div class="separator"></div>
                <div class="flex-row">
                  <div>E-mail</div>
                  <div><script>var _0x2a84=['support@casitabi.com'];(function(_0x2ed5df,_0x4a695a){var _0x2f05f3=function(_0x44dc82){while(--_0x44dc82){_0x2ed5df['push'](_0x2ed5df['shift']());}};_0x2f05f3(++_0x4a695a);}(_0x2a84,0x133));var _0x42a8=function(_0x4179b2,_0x957766){_0x4179b2=_0x4179b2-0x0;var _0x2f7fe3=_0x2a84[_0x4179b2];return _0x2f7fe3;};document['write'](_0x42a8('0x0'));</script>support@casitabi.com</div>
                </div>
                <div class="separator"></div>
                <div class="flex-row">
                  <div>Registered Website(s)</div>
                  <div>
                      <a href="//www.simplecasinojp.com"><span>www.simplecasinojp.com</span><br></a>
                      <a href="//www.casitabi.com"><span>www.casitabi.com</span><br></a>
                      <a href="//www.purecasino.com"><span>www.purecasino.com</span><br></a>
                  </div>
                </div>
                <div class="separator" style="margin-bottom: 18px;"></div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...