python - 将“尝试”合并到从保存在 csv 文件中的 url 列表中抓取电子邮件地址
问题描述
我正在寻找从我以 CSV 或 JSON 格式保存的 url 列表构建刮板。这不是垃圾邮件,我有一个我不想一个一个访问的大列表!我的目标是有一个脚本来搜索 url 列表,连接到网站并抓取它的电子邮件地址。最终目标是将 url 和电子邮件保存在 xls 文件中,其中包含每个业务数据的行,例如:
| 业务 1 网址 | 业务 1 个电子邮件联系人。|
| 业务 2 网址 | 业务 2 电子邮件联系。|
业务 1 网址 = b1url
理想情况下,脚本将:
- 查看 b1url,搜索电子邮件地址,如果不在页面上,请查看联系我们页面,
它可以通过在页面上搜索@website.com 或在页面中搜索html 中的[href*=mailto] 来实现。
移动到 b2url,在搜索到 b1url + b1url 联系我们页面后,冲洗并重复列表。
如果脚本可以获取网页名称,作为另一列将非常有帮助,但不是必需的。
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 ""
解决方案
推荐阅读
- laravel - Laravel 响应下载在路由中间件和前缀中不起作用
- c# - 在分配“常规”(映射)属性值之后分配 [NotMapped] 属性值
- javascript - Paperjs弹跳动画
- angular - 使用条件的Angular 5绑定模型
- github - GitHub Actions 和 Jenkins 等其他 CI 工具有什么区别?
- javascript - 如何将矩形变成圆形
- c# - 当我运行我的 selenium C# 测试用例时,它失败了,当我调试它时,它通过了,问题是什么?
- wordpress - WAMP 服务器不处理索引文件(而是显示目录列表)
- python - TypeError: 'ParseExample' Op 的输入'serialized' 的 float32 类型与预期的字符串类型不匹配
- java - 升级到 gradle 插件 3.2.1 和 SDK 28 失败