ecosia 搜索引擎爬虫

因为他有cloudflare五秒盾 所以需要先破五秒盾 网上找的资料已验证可用  然后替换代码里的url_base

Docker运行一个容器就可以了。启动命令为:

docker run -d \
  --name=flaresolverr \
  -p 8191:8191 \
  -e LOG_LEVEL=info \
  --restart unless-stopped \
  ghcr.io/flaresolverr/flaresolverr:latest

 

这个容器启动以后,会开启8191端口。我们通过往这个端口发送http请求,让他转发请求给目标网站,就可以绕过五秒盾。  

import requests
import json
import re

url_base = "http://12.34.56.78:8191/v1"
keyword_file = "keyword.txt"
result_file = "ecosia-result.txt"

headers = {
'Content-Type': 'application/json'
}

# 需要剔除的域名列表
excluded_domains = [
r'\b(?:\w+\.)?microsoft\.com\b',
r'\b(?:\w+\.)?youtube\.\w+\b',
r'\b(?:\w+\.)?google\.\w+\b',
r'\b(?:\w+\.)?apple\.\w+\b',
r'\b(?:\w+\.)?cnn\.com\b',
r'\b(?:\w+\.)?wikipedia\.\w+\b',
r'\b(?:\w+\.)?fifa\.com\b',
r'\b(?:\w+\.)?linkedin\.com\b',
r'\b(?:\w+\.)?amazon\.\w+\b', # amazon with any TLD
r'\b(?:\w+\.)?facebook\.\w+\b'
]

# 创建一个正则表达式以匹配需要剔除的域名
excluded_pattern = re.compile('|'.join(excluded_domains))

# 读取关键词文件
with open(keyword_file, 'r') as f:
keywords = f.readlines()

# 用于存储唯一且未被剔除的域名(保留协议)
unique_domains = set()

# 循环请求关键词和页数
for keyword in keywords:
keyword = keyword.strip() # 移除换行符
for page in range(10): # 从0到9循环页数
# 构建搜索引擎的 URL
search_url = f"https://www.ecosia.org/search?method=index&q={keyword}&p={page}"

payload = json.dumps({
"cmd": "request.get",
"url": search_url,
"maxTimeout": 60000
})

try:
response = requests.post(url_base, headers=headers, data=payload, timeout=10)

# 打印当前请求的 URL、状态码和返回的 HTML 源码
print(f"当前请求的 URL: {search_url}")
#print(f"状态码: {response.status_code}")
#print("HTML 源码:")
#print(response.text)

# 检查响应状态码
if response.status_code == 200:
# 解析 JSON 响应获取网页源代码
html_content = response.json()['solution']['response']

# 使用正则表达式匹配指定的数据
pattern = re.compile(r'<a data-test-id="result-link" tabindex="-1" href="(.*?)" target="_self" rel="noopener"')
matches = pattern.findall(html_content)
print(matches)
# 处理匹配到的数据
for match in matches:
# 提取协议和域名,去除路径和查询参数
domain = re.match(r'(https?://[^/]+)', match).group(1)
# 检查域名是否在剔除列表中
if not excluded_pattern.search(domain):
unique_domains.add(domain)

else:
print(f"请求失败,状态码:{response.status_code}")

except requests.Timeout:
print(f"请求超时: {search_url}")
except Exception as e:
print(f"请求发生异常:{e}")

# 将去重且剔除后的域名(保留协议)写入文件
with open(result_file, 'w') as f:
for domain in unique_domains:
f.write(f"{domain}\n")

print(f"结果已写入到 {result_file}")

 

posted @ 2024-08-08 16:50  射满东城湖  阅读(83)  评论(0)    收藏  举报