我想在網(wǎng)站上賣食品怎么做建網(wǎng)站費用
- 💂 個人網(wǎng)站:【 摸魚游戲】【神級代碼資源網(wǎng)站】【工具大全】
- 🤟 一站式輕松構(gòu)建小程序、Web網(wǎng)站、移動應(yīng)用:👉注冊地址
- 🤟 基于Web端打造的:👉輕量化工具創(chuàng)作平臺
- 💅 想尋找共同學(xué)習(xí)交流,摸魚劃水的小伙伴,請點擊【全棧技術(shù)交流群】
目錄
- 背景
- 爬取文章鏈接
- 使用代理 IP 進行爬取
- 爬取郵箱地址
- 完整代碼
- 總結(jié)
背景
最近有同事詢問我是否能夠幫忙從 PubMed 網(wǎng)站上批量爬取一些郵箱地址,因為其中可能包含我們的潛在客戶。我開始嘗試了一下,首先選擇了一個關(guān)鍵詞 h3k56 進行搜索,得到了 228 個結(jié)果(文章)。
爬取文章鏈接
我們首先需要獲取這些文章的鏈接。在 PubMed 網(wǎng)站上,每個頁面只顯示十篇文章,并且鏈接是按照一定規(guī)律排列的。
我們可以將搜索關(guān)鍵詞 ‘h3k56’ 的 PubMed 搜索基礎(chǔ) URL 列出來:
base_url = "https://pubmed.ncbi.nlm.nih.gov/?term=h3k56&page="
接下來,我們可以使用 requests 庫發(fā)送 HTTP 請求,獲取網(wǎng)頁內(nèi)容。我們先獲取每個頁面的文章鏈接,然后將這些鏈接存儲在一個列表中。以下是具體步驟:
首先,我們導(dǎo)入了 requests
和 BeautifulSoup
庫,它們用于發(fā)送 HTTP 請求和解析 HTML 頁面。
import requests
from bs4 import BeautifulSoup
然后,我們定義了基礎(chǔ)的 PubMed 搜索 URL base_url
,用于搜索關(guān)鍵詞 'h3k56'
,以及總共的頁面數(shù) total_pages
和用于存儲文章鏈接的列表 article_links
。
base_url = "https://pubmed.ncbi.nlm.nih.gov/?term=h3k56&page=" # PubMed搜索基礎(chǔ)URL,搜索關(guān)鍵詞'h3k56'
total_pages = 23 # 總共的頁面數(shù)
article_links = [] # 存儲文章鏈接的列表
接下來,我們使用一個循環(huán)來遍歷每一頁的鏈接,并發(fā)送 HTTP 請求以獲取頁面內(nèi)容。
for page_num in range(1, total_pages + 1):url = base_url + str(page_num) # 構(gòu)建當(dāng)前頁面的完整URLresponse = requests.get(url) # 發(fā)起GET請求獲取頁面內(nèi)容
在每次請求成功后,我們使用 BeautifulSoup 解析頁面內(nèi)容,查找具有 'docsum-title'
類的 <a>
標(biāo)簽,并提取其中的 href
屬性,拼接成完整的文章鏈接,并將其添加到 article_links
列表中。
if response.status_code == 200: # 如果響應(yīng)碼為200,表示請求成功soup = BeautifulSoup(response.text, 'html.parser') # 使用BeautifulSoup解析頁面內(nèi)容for a in soup.find_all('a', class_='docsum-title', href=True): # 查找具有'docsum-title'類的<a>標(biāo)簽article_links.append("https://pubmed.ncbi.nlm.nih.gov" + a['href']) # 將找到的文章鏈接添加到列表中
最后,我們打印出所有爬取到的文章鏈接列表。
print(article_links) # 打印所有文章鏈接列表
運行程序,大概等待了半分鐘,完整輸出了 228 篇文章的鏈接。
這樣,我們就完成了獲取 PubMed 文章鏈接的過程。接下來,我們將介紹如何使用代理 IP 進行爬取,并爬取文章中的郵箱地址。
好的,現(xiàn)在我們來繼續(xù)介紹如何使用代理 IP 進行爬取,并爬取文章中的郵箱地址。
使用代理 IP 進行爬取
考慮到一些網(wǎng)站對頻繁訪問或大量請求會有限制,可能采取封禁IP或者設(shè)立驗證碼等措施。使用IP代理服務(wù)可以使爬蟲在請求目標(biāo)網(wǎng)站時輪換IP,從而規(guī)避了被網(wǎng)站封禁的風(fēng)險。這里我采用的是亮數(shù)據(jù)IP代理服務(wù)。
首先,我們需要導(dǎo)入 requests 庫,并定義一個代理 IP 的地址。假設(shè)代理 IP 的地址是 http://127.0.0.1:8000
。
import requestsproxy = "http://127.0.0.1:8000"
接著,我們修改發(fā)送請求的方式,使用 requests.get
方法的 proxies
參數(shù)來設(shè)置代理 IP。
response = requests.get(url, proxies={"http": proxy, "https": proxy})
這樣,我們就可以通過代理 IP 發(fā)送請求了。接下來我們獲取文章中的郵箱地址。
爬取郵箱地址
為了使用Selenium庫獲取文章中的郵箱地址,我們首先需要導(dǎo)入相關(guān)的庫。Selenium是一個自動化測試工具,可以模擬用戶在瀏覽器中的操作,比如點擊、輸入、提交表單等。
from selenium import webdriver
import re
import time
然后,我們需要設(shè)置Chrome瀏覽器的選項,以及要爬取的文章鏈接列表和存儲提取到的郵箱地址的列表。
# 設(shè)置ChromeOptions以指定Chrome二進制文件位置和其他選項
chrome_options = webdriver.ChromeOptions()
chrome_options.binary_location = "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe" # 請根據(jù)你的Chrome安裝路徑進行修改# 加載ChromeDriver并應(yīng)用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)
最后,關(guān)閉瀏覽器并打印提取到的郵箱地址。
# 關(guān)閉瀏覽器
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'
}# 設(shè)置請求頭
headers = {'User-Agent': 'Your User Agent'
}# 設(shè)置ChromeOptions以指定Chrome二進制文件位置和其他選項
chrome_options = webdriver.ChromeOptions()
chrome_options.binary_location = "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe" # 請根據(jù)你的Chrome安裝路徑進行修改
chrome_options.add_argument('--proxy-server=http://your_proxy_ip:your_proxy_port') # 添加代理IP地址# 加載ChromeDriver并應(yīng)用Chrome選項
driver = webdriver.Chrome(options=chrome_options)# PubMed搜索基礎(chǔ)URL,搜索關(guān)鍵詞'h3k56'
base_url = "https://pubmed.ncbi.nlm.nih.gov/?term=h3k56&page="# 總共的頁面數(shù)
total_pages = 23# 存儲文章鏈接的列表
article_links = []# 遍歷頁面獲取文章鏈接
for page_num in range(1, total_pages + 1):url = base_url + str(page_num) # 構(gòu)建當(dāng)前頁面的完整URLtry:# 發(fā)起GET請求獲取頁面內(nèi)容response = requests.get(url, headers=headers, proxies=proxy)if response.status_code == 200: # 如果響應(yīng)碼為200,表示請求成功soup = BeautifulSoup(response.text, 'html.parser') # 使用BeautifulSoup解析頁面內(nèi)容for a in soup.find_all('a', class_='docsum-title', href=True): # 查找具有'docsum-title'類的<a>標(biāo)簽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}")# 關(guān)閉瀏覽器
driver.quit()# 打印提取到的郵箱地址
print(email_addresses)
總結(jié)
以上是一個簡單的爬蟲示例,展示了如何使用亮數(shù)據(jù)的IP代理服務(wù)來爬取網(wǎng)頁鏈接以及郵箱地址。通過亮數(shù)據(jù)的IP代理服務(wù),我們可以輕松地突破網(wǎng)站的封鎖,實現(xiàn)數(shù)據(jù)的高效獲取。希望通過以上示例能夠幫助大家更好地理解IP代理服務(wù)的重要性和使用方法。
如果您對IP代理服務(wù)感興趣,可以通過亮數(shù)據(jù)官網(wǎng)了解更多信息。