当前位置: 首页 > news >正文

使用亮数据代理IP爬取PubMed文章链接和邮箱地址

  • 💂 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】
  • 🤟 一站式轻松构建小程序、Web网站、移动应用:👉注册地址
  • 🤟 基于Web端打造的:👉轻量化工具创作平台
  • 💅 想寻找共同学习交流,摸鱼划水的小伙伴,请点击【全栈技术交流群】

目录

    • 背景
    • 爬取文章链接
    • 使用代理 IP 进行爬取
    • 爬取邮箱地址
    • 完整代码
    • 总结

背景

最近有同事询问我是否能够帮忙从 PubMed 网站上批量爬取一些邮箱地址,因为其中可能包含我们的潜在客户。我开始尝试了一下,首先选择了一个关键词 h3k56 进行搜索,得到了 228 个结果(文章)。

在这里插入图片描述

爬取文章链接

我们首先需要获取这些文章的链接。在 PubMed 网站上,每个页面只显示十篇文章,并且链接是按照一定规律排列的。

在这里插入图片描述

我们可以将搜索关键词 ‘h3k56’ 的 PubMed 搜索基础 URL 列出来:

base_url = "https://pubmed.ncbi.nlm.nih.gov/?term=h3k56&page="

接下来,我们可以使用 requests 库发送 HTTP 请求,获取网页内容。我们先获取每个页面的文章链接,然后将这些链接存储在一个列表中。以下是具体步骤:

首先,我们导入了 requestsBeautifulSoup 库,它们用于发送 HTTP 请求和解析 HTML 页面。

import requests
from bs4 import BeautifulSoup

然后,我们定义了基础的 PubMed 搜索 URL base_url,用于搜索关键词 'h3k56',以及总共的页面数 total_pages 和用于存储文章链接的列表 article_links

base_url = "https://pubmed.ncbi.nlm.nih.gov/?term=h3k56&page="  # PubMed搜索基础URL,搜索关键词'h3k56'
total_pages = 23  # 总共的页面数
article_links = []  # 存储文章链接的列表

接下来,我们使用一个循环来遍历每一页的链接,并发送 HTTP 请求以获取页面内容。

for page_num in range(1, total_pages + 1):url = base_url + str(page_num)  # 构建当前页面的完整URLresponse = requests.get(url)  # 发起GET请求获取页面内容

在每次请求成功后,我们使用 BeautifulSoup 解析页面内容,查找具有 'docsum-title' 类的 <a> 标签,并提取其中的 href 属性,拼接成完整的文章链接,并将其添加到 article_links 列表中。

if response.status_code == 200:  # 如果响应码为200,表示请求成功soup = BeautifulSoup(response.text, 'html.parser')  # 使用BeautifulSoup解析页面内容for a in soup.find_all('a', class_='docsum-title', href=True):  # 查找具有'docsum-title'类的<a>标签article_links.append("https://pubmed.ncbi.nlm.nih.gov" + a['href'])  # 将找到的文章链接添加到列表中

最后,我们打印出所有爬取到的文章链接列表。

print(article_links)  # 打印所有文章链接列表

运行程序,大概等待了半分钟,完整输出了 228 篇文章的链接。

在这里插入图片描述
这样,我们就完成了获取 PubMed 文章链接的过程。接下来,我们将介绍如何使用代理 IP 进行爬取,并爬取文章中的邮箱地址。

好的,现在我们来继续介绍如何使用代理 IP 进行爬取,并爬取文章中的邮箱地址。

使用代理 IP 进行爬取

考虑到一些网站对频繁访问或大量请求会有限制,可能采取封禁IP或者设立验证码等措施。使用IP代理服务可以使爬虫在请求目标网站时轮换IP,从而规避了被网站封禁的风险。这里我采用的是亮数据IP代理服务。

首先,我们需要导入 requests 库,并定义一个代理 IP 的地址。假设代理 IP 的地址是 http://127.0.0.1:8000

import requestsproxy = "http://127.0.0.1:8000"

接着,我们修改发送请求的方式,使用 requests.get 方法的 proxies 参数来设置代理 IP。

response = requests.get(url, proxies={"http": proxy, "https": proxy})

这样,我们就可以通过代理 IP 发送请求了。接下来我们获取文章中的邮箱地址。

爬取邮箱地址

为了使用Selenium库获取文章中的邮箱地址,我们首先需要导入相关的库。Selenium是一个自动化测试工具,可以模拟用户在浏览器中的操作,比如点击、输入、提交表单等。

from selenium import webdriver
import re
import time

然后,我们需要设置Chrome浏览器的选项,以及要爬取的文章链接列表和存储提取到的邮箱地址的列表。

# 设置ChromeOptions以指定Chrome二进制文件位置和其他选项
chrome_options = webdriver.ChromeOptions()
chrome_options.binary_location = "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe"  # 请根据你的Chrome安装路径进行修改# 加载ChromeDriver并应用Chrome选项
driver = webdriver.Chrome(options=chrome_options)# 要爬取的文章链接列表
article_links = ['https://pubmed.ncbi.nlm.nih.gov/35290816/', 'https://pubmed.ncbi.nlm.nih.gov/33668997/', ...]  # 这里省略了大部分链接# 存储提取到的邮箱地址
email_addresses = []

然后我们可以使用Selenium模拟浏览器打开每个文章链接,并从页面中提取邮箱地址。

# 遍历文章链接列表
for link in article_links:driver.get(link)time.sleep(2)  # 等待页面加载# 使用正则表达式查找页面中的邮箱地址email_matches = re.findall(r'[\w\.-]+@[\w\.-]+\.[a-zA-Z]+', driver.page_source)# 如果找到邮箱地址则添加到列表中if email_matches:for email in email_matches:email_addresses.append(email)

最后,关闭浏览器并打印提取到的邮箱地址。

# 关闭浏览器
driver.quit()# 打印提取到的邮箱地址
print(email_addresses)

这样,我们就可以使用Selenium库在每个文章链接中提取到邮箱地址了。

运行效果如下,selenium 会自动打开浏览器,访问这两百多个页面

在这里插入图片描述

待页面访问完成即可输出邮箱地址

在这里插入图片描述

到这里我们就大功告成了。

完整代码

import requests
from bs4 import BeautifulSoup
from selenium import webdriver
import re
import time# 定义代理IP地址
proxy = {'http': 'http://your_proxy_ip:your_proxy_port','https': 'https://your_proxy_ip:your_proxy_port'
}# 设置请求头
headers = {'User-Agent': 'Your User Agent'
}# 设置ChromeOptions以指定Chrome二进制文件位置和其他选项
chrome_options = webdriver.ChromeOptions()
chrome_options.binary_location = "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe"  # 请根据你的Chrome安装路径进行修改
chrome_options.add_argument('--proxy-server=http://your_proxy_ip:your_proxy_port')  # 添加代理IP地址# 加载ChromeDriver并应用Chrome选项
driver = webdriver.Chrome(options=chrome_options)# PubMed搜索基础URL,搜索关键词'h3k56'
base_url = "https://pubmed.ncbi.nlm.nih.gov/?term=h3k56&page="# 总共的页面数
total_pages = 23# 存储文章链接的列表
article_links = []# 遍历页面获取文章链接
for page_num in range(1, total_pages + 1):url = base_url + str(page_num)  # 构建当前页面的完整URLtry:# 发起GET请求获取页面内容response = requests.get(url, headers=headers, proxies=proxy)if response.status_code == 200:  # 如果响应码为200,表示请求成功soup = BeautifulSoup(response.text, 'html.parser')  # 使用BeautifulSoup解析页面内容for a in soup.find_all('a', class_='docsum-title', href=True):  # 查找具有'docsum-title'类的<a>标签article_links.append("https://pubmed.ncbi.nlm.nih.gov" + a['href'])  # 将找到的文章链接添加到列表中else:print(f"检索页面失败 {url}")  # 请求失败时输出错误信息except Exception as e:print(f"请求异常: {e}")# 打印所有文章链接列表
print(article_links)# 存储提取到的邮箱地址
email_addresses = []# 遍历文章链接列表并提取邮箱地址
for link in article_links:try:driver.get(link)time.sleep(2)  # 等待页面加载# 使用正则表达式查找页面中的邮箱地址email_matches = re.findall(r'[\w\.-]+@[\w\.-]+\.[a-zA-Z]+', driver.page_source)# 如果找到邮箱地址则添加到列表中if email_matches:for email in email_matches:email_addresses.append(email)except Exception as e:print(f"提取邮箱地址异常: {e}")# 关闭浏览器
driver.quit()# 打印提取到的邮箱地址
print(email_addresses)

总结

以上是一个简单的爬虫示例,展示了如何使用亮数据的IP代理服务来爬取网页链接以及邮箱地址。通过亮数据的IP代理服务,我们可以轻松地突破网站的封锁,实现数据的高效获取。希望通过以上示例能够帮助大家更好地理解IP代理服务的重要性和使用方法。

如果您对IP代理服务感兴趣,可以通过亮数据官网了解更多信息。

http://www.lryc.cn/news/366604.html

相关文章:

  • electron调用dll时应用程序闪退
  • 单片机原理及技术(三)—— AT89S51单片机(二)(C51编程)
  • 摄影店展示服务预约小程序的作用是什么
  • 【数据分析基础】实验一 Python运算符、内置函数、序列基本用法
  • 【Redis】构建强韧的远程Redis连接与端口保障机制完美指南
  • Flowable项目启动报错#java.time.LocalDateTime cannot be cast to java.lang.String
  • 《数字电路》
  • STM32F103 点亮LED闪烁与仿真
  • 阿里云服务器发送邮件失败 Could not connect to SMTP host: smtp.xxx.com, port: 465;
  • Socket编程权威指南(二)完美掌握TCP流式协议及Socket编程的recv()和send()
  • 当C++的static遇上了继承
  • Three.js中的Raycasting技术:实现3D场景交互事件的Raycaster详解
  • 5 分钟内构建一个简单的基于 Python 的 GAN
  • 智能硬件产品中常用的参数存储和管理方案
  • SwiftUI中Mask修饰符的理解与使用
  • 全光网络与传统网络架构的对比分析
  • stack overflow复现
  • mybatis使用笔记
  • 学习笔记——路由网络基础——路由概述
  • 在量子计算时代,大数据技术将面临哪些挑战和机遇?
  • 怎么换自己手机的ip地址
  • 搭建 Langchain-Chatchat 详细过程
  • C++期末复习
  • 2005-2022年各省居民人均消费支出数据(无缺失)
  • swaggerHole:针对swaggerHub的公共API安全扫描工具
  • 【Rust】——面向对象设计模式的实现
  • C#朗读语音
  • c++ 简单的日志类 CCLog
  • 一文读懂 Compose 支持 Accessibility 无障碍的原理
  • Redis到底支不支持事务?