因为他有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}")
标签:search,keyword,url,爬虫,搜索引擎,print,ecosia,response From: https://www.cnblogs.com/chrales/p/18349287