[英]Scraping E-mails from Websites
我已經嘗試了其他帖子的多次迭代,但似乎沒有任何幫助或滿足我的需求。
我有一個 URL 列表,我想循環並提取所有包含 email 地址的關聯 URL。 然后我想將 URL 和 Email 地址存儲到csv
文件中。
例如,如果我訪問 10torr.com,程序應該找到主 URL(即:10torr.com/about)中的每個站點並提取任何電子郵件。
下面是通過我的代碼運行時當前采用數據框格式的 5 個示例網站的列表。 它們保存在變量small_site
下。
一個有用的答案將包括使用下面列出的名為get_info()
的用戶定義 function 。 將網站硬編碼到 Spider 本身不是一個可行的選擇,因為這將被許多其他具有不同網站列表長度的人使用。
Website
http://10torr.com/
https://www.10000drops.com/
https://www.11wells.com/
https://117westspirits.com/
https://www.onpointdistillery.com/
下面是我正在運行的代碼。 蜘蛛似乎在運行,但我的csv
文件中沒有 output。
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)
我不確定哪里出錯了,因為我沒有收到任何錯誤消息。 如果您需要更多信息,請詢問。 我已經嘗試了將近一個月了,我覺得此時我只是在用頭撞牆。
此代碼的大部分內容可在文章Web 抓取以提取聯系信息 — 第 1 部分:幾周后的郵件列表中找到。 但是,我沒有成功地將它擴展到我的需要。 在合並他們的谷歌搜索 function 以獲取基本 URL 時,它一次性工作沒有問題。
預先感謝您提供的任何幫助。
花了一段時間,但答案終於來了。 以下是最終答案的產生方式。 這將與原始問題一樣使用不斷變化的列表。
變化最終非常小。 我需要添加以下用戶定義的 function。
def get_urls(io, sheet_name):
data = pd.read_excel(io, sheet_name)
urls = data['Website'].to_list()
return urls
從那里,對get_info()
用戶定義的 function 進行了簡單的更改。 我們需要將此 function 中的google_urls
設置為我們的get_urls
function 並傳入列表。 此 function 的完整代碼如下。
def get_info(io, sheet_name, 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 = get_urls(io, sheet_name)
print('Searching for emails...')
process = CrawlerProcess({'USER_AGENT': 'Mozilla/5.0'})
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
無需進行其他更改即可使其運行。 希望這會有所幫助。
我修改了一些腳本,通過 Shell 運行以下腳本,它可以工作。 也許它將為您提供一個起點。
我建議你使用 shell 因為它在抓取過程中總是拋出錯誤和其他消息
class MailSpider(scrapy.Spider):
name = 'email'
start_urls = [
'http://10torr.com/',
'https://www.10000drops.com/',
'https://www.11wells.com/',
'https://117westspirits.com/',
'https://www.onpointdistillery.com/',
]
def parse(self, response):
self.log('A response from %s just arrived!' % response.url)
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):
html_text = str(response.text)
mail_list = re.findall('\w+@\w+\.{1}\w+', html_text)
dic = {'email': mail_list, 'link': str(response.url)}
for key in dic.keys():
yield {
'email' : dic['email'],
'link': dic['link'],
}
This yields the following output when crawled via Anaconda shell scrapy crawl email -o test.jl
{"email": ["info@ndiscovered.com"], "link": "https://117westspirits.com/"}
{"email": ["8b4e078a51d04e0e9efdf470027f0ec1@sentry.wixpress", "bundle@3.2", "fetch@3.0", "bolt@2.3", "5oclock@11wells.com", "5oclock@11wells.com", "5oclock@11wells.com"], "link": "https://www.11wells.com"}
{"email": ["info@ndiscovered.com"], "link": "https://117westspirits.com/shop?olsPage=search&keywords="}
{"email": ["info@ndiscovered.com"], "link": "https://117westspirits.com/shop?olsPage=search&keywords="}
{"email": ["info@ndiscovered.com"], "link": "https://117westspirits.com/shop"}
{"email": ["info@ndiscovered.com"], "link": "https://117westspirits.com/shop?olsPage=cart"}
{"email": ["info@ndiscovered.com"], "link": "https://117westspirits.com/home"}
{"email": ["8b4e078a51d04e0e9efdf470027f0ec1@sentry.wixpress", "bundle@3.2", "fetch@3.0", "bolt@2.3", "5oclock@11wells.com", "5oclock@11wells.com", "5oclock@11wells.com"], "link": "https://www.11wells.com"}
{"email": ["info@ndiscovered.com"], "link": "https://117westspirits.com/home"}
{"email": ["info@ndiscovered.com"], "link": "https://117westspirits.com/117%C2%B0-west-spirits-1"}
...
...
...
有關更多信息,請參閱Scrapy 文檔
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.