首页 > 解决方案 > 将“尝试”合并到从保存在 csv 文件中的 url 列表中抓取电子邮件地址

问题描述

我正在寻找从我以 CSV 或 JSON 格式保存的 url 列表构建刮板。这不是垃圾邮件,我有一个我不想一个一个访问的大列表!我的目标是有一个脚本来搜索 url 列表,连接到网站并抓取它的电子邮件地址。最终目标是将 url 和电子邮件保存在 xls 文件中,其中包含每个业务数据的行,例如:

在此处输入图像描述

| 业务 1 网址 | 业务 1 个电子邮件联系人。|

| 业务 2 网址 | 业务 2 电子邮件联系。|

业务 1 网址 = b1url

理想情况下,脚本将:

  1. 查看 b1url,搜索电子邮件地址,如果不在页面上,请查看联系我们页面,

它可以通过在页面上搜索@website.com 或在页面中搜索html 中的[href*=mailto] 来实现。

  1. 移动到 b2url,在搜索到 b1url + b1url 联系我们页面后,冲洗并重复列表。

  2. 如果脚本可以获取网页名称,作为另一列将非常有帮助,但不是必需的。

iimport pandas as pd
import requests
import bs4
import re


src_df = pd.read_csv('C:/src_file.csv')

def get_email(soup):
    try:
        email = re.findall(r'([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+)', response.text)[-1]
        return email
    except:
        pass

    try:
        email = soup.select("a[href*=mailto]")[-1].text
    except:
        print ('Email not found')
        email = ''
        return email


for i, row in src_df.iterrows():
    url = 'http://www.' + row['website']
    try:
        response = requests.get(url)
        soup = bs4.BeautifulSoup(response.text, 'html.parser')
    except:
        print ('Unsucessful: ' + str(response))
        continue

    
    email = get_email(soup)


    src_df.loc[i,'Email'] = email
    print ('website:%s\nemail: %s\n' %(url, email))

src_df.to_csv('output.csv', index=False)
    

如果主页中没有电子邮件,我希望脚本搜索“联系我们”页面或“联系方式”、“关于”或“关于我们页面”。如果它可以在搜索完 url 列表的其余部分之后执行此操作,那就太好了,例如如果 email = No Value,搜索 'b1url.com/contact' 会更好地减少被阻止的机会。下面的代码包含我想在上面的代码中集成的“try”函数。

        # Check if there is any email address in the homepage. 
        emails = soup.find_all(text=re.compile('.*@'+domain[1]+'.'+domain[2].replace("/","")))
        emails.sort(key=len)
        print(emails[0].replace("\n",""))
        final_result = emails[0]
    except:
        # Searching for Contact Us Page's url.
        try:
            flag = 0
            for link in links:
                if "contact" in link.get("href") or "Contact" in link.get("href") or "CONTACT" in link.get("href") or 'contact' in link.text or 'Contact' in link.text or 'CONTACT' in link.text:
                    if len(link.get("href"))>2 and flag<2:
                        flag = flag + 1
                        contact_link = link.get("href")

        except:
            pass

        domain = domain[0]+"."+domain[1]+"."+domain[2]
        if(len(contact_link)<len(domain)):
            domain = domain+contact_link.replace("/","")
        else:
            domain = contact_link

        try:
            # Check if there is any email address in the Contact Us Page. 
            res = requests.get(domain)
            soup = BeautifulSoup(res.text,"lxml")
            emails = soup.find_all(text=re.compile('.*@'+mailaddr[7:].replace("/","")))
            emails.sort(key=len)
            try:
                print(emails[0].replace("\n",""))
                final_result = emails[0]
                return final_result
            except:
                pass
        except Exception as e:
            pass

    return ""

标签: python

解决方案


推荐阅读