• 1000 содержать адреса электронной почты. Затем я хочу сохранить URL-адреса и адреса электронной почты в файле
csv
.
Например, если я перешел на 10torr.com, программа должна найти каждый из сайтов в основном URL-адресе (ie : 10torr.com/about) и извлекайте все электронные письма.
Ниже приведен список из 5 примеров веб-сайтов, которые в настоящее время находятся в формате фрейма данных при запуске моего кода. Они сохраняются под переменной small_site
.
Полезный ответ будет включать использование указанной ниже пользовательской функции под названием get_info()
. Жесткое кодирование веб-сайтов в самом Spider не является возможным вариантом, так как это будет использоваться многими другими людьми с разной длиной списка веб-сайтов.
Website
http://10torr.com/
https://www.10000drops.com/
https://www.11wells.com/
https://117westspirits.com/
https://www.onpointdistillery.com/
Ниже приведен код, который я использую. Паук, кажется, запускается, но в моем csv
файле нет вывода.
import os
import pandas as pd
import re
import scrapy
from scrapy.crawler import CrawlerProcess
from scrapy.linkextractors.lxmlhtml import LxmlLinkExtractor
small_site = site.head()
#%% Start Spider
class MailSpider(scrapy.Spider):
name = 'email'
def parse(self, response):
links = LxmlLinkExtractor(allow=()).extract_links(response)
links = [str(link.url) for link in links]
links.append(str(response.url))
for link in links:
yield scrapy.Request(url=link, callback=self.parse_link)
def parse_link(self, response):
for word in self.reject:
if word in str(response.url):
return
html_text = str(response.text)
mail_list = re.findall('\w+@\w+\.{1}\w+', html_text)
dic = {'email': mail_list, 'link': str(response.url)}
df = pd.DataFrame(dic)
df.to_csv(self.path, mode='a', header=False)
df.to_csv(self.path, mode='a', header=False)
#%% Preps a CSV File
def ask_user(question):
response = input(question + ' y/n' + '\n')
if response == 'y':
return True
else:
return False
def create_file(path):
response = False
if os.path.exists(path):
response = ask_user('File already exists, replace?')
if response == False: return
with open(path, 'wb') as file:
file.close()
#%% Defines function that will extract emails and enter it into CSV
def get_info(url_list, path, reject=[]):
create_file(path)
df = pd.DataFrame(columns=['email', 'link'], index=[0])
df.to_csv(path, mode='w', header=True)
print('Collecting Google urls...')
google_urls = url_list
print('Searching for emails...')
process = CrawlerProcess({'USER_AGENT': 'Mozilla/5.0'})
process.start()
for i in small_site.Website.iteritems():
print('Searching for emails...')
process.crawl(MailSpider, start_urls=google_urls, path=path, reject=reject)
##process.start()
print('Cleaning emails...')
df = pd.read_csv(path, index_col=0)
df.columns = ['email', 'link']
df = df.drop_duplicates(subset='email')
df = df.reset_index(drop=True)
df.to_csv(path, mode='w', header=True)
return df
url_list = small_site
path = 'email.csv'
df = get_info(url_list, path)
Я не уверен, где я ошибаюсь, поскольку я не получаю сообщений об ошибках. Если вам нужна дополнительная информация, просто спросите. Я пытаюсь получить это уже почти месяц, и мне кажется, что сейчас я просто бьюсь головой об стену.
Большая часть этого кода была найдена в статье Веб-скрапинг для извлечения контактной информации - Часть 1: Списки рассылки через несколько недель. Однако мне не удалось расширить его для своих нужд. При включении функции поиска в Google для получения базовых URL-адресов проблем не возникло.
Заранее благодарим вас за любую помощь, которую вы можете оказать.