Python Google Dork 爬虫代码优化:解决卡住问题

这段代码使用 Python 的多线程技术,通过循环遍历 Dork 列表,利用 Google 搜索 API 获取目标网站的 URL。但是,这段代码可能会遇到卡住的问题,导致程序无法正常结束。下面列出一些可能导致卡住的原因以及解决方案。

可能导致卡住的原因:

  1. 多线程中锁被关了,导致 print 输出混乱,程序无法正常结束。

    • 确保锁在 google_serach 函数中正确使用,并确保在使用锁之前正确获取锁,在使用完之后正确释放锁。
  2. 多线程中的全局变量没有加锁,导致程序无法正常运行。

    • url_numdork_finish_num 变量使用锁,确保在多线程环境下变量的正确性。
  3. 程序中使用了 while True,没有循环结束条件,可能导致程序无法正常结束。

    • 添加循环结束条件,例如,当所有 Dork 都被处理完时,结束循环。

建议解决方法:

  1. 检查多线程中锁的使用是否正确,保证 print 输出的正确性。

    • 使用 logging 模块代替 print 函数,可以更好地控制程序的输出信息,避免出现输出混乱的情况。
  2. 对多线程中的全局变量加上锁,保证在多线程环境下变量的正确性。

    • 使用 threading.Lockthreading.RLock 类型的锁来保护共享变量。
  3. 给 while 循环加上结束条件,防止程序无法正常结束。

    • 可以使用 break 语句或其他条件语句来退出循环。

代码示例:

#coding:utf-8
import requests
import time
import os
import urllib3
import sys
from bs4 import BeautifulSoup
from concurrent.futures import ThreadPoolExecutor
from threading import Lock
from colorama import Fore, init
import logging

now_time = time.strftime('%Y-%m-%d %H-%M')

# 谷歌在其他国家的域名
GOOGLE_DOMAINS = ['google.com', 'google.co.uk', 'google.ca', 'google.fr', 'google.de', 'google.it', 'google.es', 'google.com.br', 'google.co.jp', 'google.co.kr', 'google.com.au', 'google.com.mx', 'google.ru', 'google.com.sg', 'google.co.th', 'google.com.sa', 'google.co.za', 'google.com.tr', 'google.com.ar', 'google.co.id', 'google.com.vn', 'google.com.ph', 'google.com.ua', 'google.co.il', 'google.com.pk', 'google.co.ke', 'google.com.ng', 'google.co.ve', 'google.co.nz']

# 设置日志记录
logging.basicConfig(filename='google_dork.log', level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

# 读取Dorks
def work(dorks):
    with open(dorks, mode='r', encoding='utf-8') as file:
        read_content = file.readlines()
        # 将内容加入列表
        content = [result.strip() for result in read_content]
        # 返回数量丢给任务池
        return len(read_content), content


# Google搜索
def google_serach(query, locks):
    global url_num, dork_finish_num
    try:
        # 关闭HTTPS报错信息
        urllib3.disable_warnings()
        filename = os.path.join(os.getcwd(), 'google.txt')
        url = f'https://{GOOGLE_DOMAINS[url_num % len(GOOGLE_DOMAINS)]}/search?q={query}&num=100'
        # 请求头
        headers = {
                   'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36',
                   'accept-language': 'zh-CN,zh;q=0.9',
                   'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
                   'referer': f'https://{GOOGLE_DOMAINS[url_num % len(GOOGLE_DOMAINS)]}/',
                   'origin': f'https://{GOOGLE_DOMAINS[url_num % len(GOOGLE_DOMAINS)]}',
                   'Sec-Fetch-Site': 'same-origin',
                   'Sec-Fetch-Mode': 'navigate',
                   'Sec-Fetch-User': '?1',
                   'Sec-Fetch-Dest': 'document'
        }
        # 代理
        proxies = {'http': 'http://127.0.0.1:7890', 'https': 'http://127.0.0.1:7890'}
        response = requests.get(url=url, headers=headers, proxies=proxies, verify=False, timeout=5)
        soup = BeautifulSoup(response.content, 'html.parser')
        # 查找全部div标签
        find_div = soup.find_all('div', {'class': 'yuRUbf'})
        # 开启线程锁
        locks.acquire()
        # 加入列表
        get_url = [url.findNext('a')['href'] + '
' for url in find_div]
        # 更新全局变量,注意加锁
        global url_num, dork_finish_num
        with locks:
            url_num += 1
            dork_finish_num += 1
        logging.info(f'{now_time}[INFO]{ '-' * 10}>已获取Url数量:{url_num}  Dorsk数量:{dork_finish_num} / {dork_total_num}')
        # 写入文件
        write_info(filename, get_url)
        # 释放线程锁
        locks.release()

    except TimeoutError:
        pass


# 写入文件函数
def write_info(filename, get_url):

    with open(filename, mode='a+', encoding='utf-8') as file:

        file.writelines(get_url)


if __name__ == '__main__':
    while True:
        try:
            init()  # 初始化颜色模块
            dorks_file = input(Fore.YELLOW + f'
{now_time}[INFO]{ '-' * 10}>输入文件位置:' + Fore.RESET)
            print('')
            # 接受work函数返回的元组
            dork_total_num, query_list = work(dorks_file)
            # 定义全局变量完成数量/URL数量
            dork_finish_num = url_num = 0

            # 定义线程池数量
            threads = ThreadPoolExecutor(max_workers=5)

            # 定义全局锁
            threads_lock = Lock()

            # 分配进程池任务
            for dokr_list in query_list:
                threads.submit(google_serach, dokr_list, threads_lock)
                # 每读取10条语法换一个谷歌在其他国家的域名采集url
                if url_num % 10 == 0:
                    time.sleep(1)

            threads.shutdown()
            if len(sys.argv) == 1:
                pass
            input(Fore.YELLOW + f'

{now_time}[INFO]{'-' * 10}>程序运行完毕,按回车退出' + Fore.RESET)
            break
        # 文件为空
        except FileNotFoundError:
            logging.error(f'{now_time}[Error]{'-' * 10}>文件不存在')
        # 中断异常
        except KeyboardInterrupt:
            sys.exit(1)

优化建议:

  1. 使用 logging 模块记录程序运行信息,方便调试和排查问题。
  2. 对全局变量 url_numdork_finish_num 使用锁,确保在多线程环境下变量的正确性。
  3. 使用 break 语句退出循环,避免程序无限循环。

注意事项:

  1. 请谨慎使用 Google 搜索 API,避免过度频繁的请求,以免被封号。
  2. 请确保您的代码符合 Google 的使用条款和服务协议。

希望以上优化建议可以帮助您解决程序卡住的问题。

Python Google Dork 爬虫代码优化:解决卡住问题

原文地址: https://www.cveoy.top/t/topic/obSK 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录