优化建议如下:

  1. 在写入文件时,可以使用批量写入,而不是每次写入一个 url,可以减少 I/O 操作的次数,提高效率。
  2. 可以考虑使用多进程或异步IO的方式,以进一步提高程序效率。
  3. 可以在搜索时加入?问号过滤,避免获取无用的 url。

代码实现:

  1. 批量写入文件

将写入文件的函数 write_info 修改为批量写入:

# 写入文件函数
def write_info(filename, get_url_list):
    with open(filename, mode='a+', encoding='utf-8') as file:
        file.writelines(get_url_list)

同时,在 google_serach 函数中,每获取一次 url 就加入列表 get_url,当列表长度达到一定数量后,就批量写入文件,并清空列表:

# 加入列表
get_url.append(url.findNext('a')['href'] + '\n')
if len(get_url) == 20:
    write_info(filename, get_url)
    get_url = []
  1. 异步IO优化

使用 asyncioaiohttp 库实现异步IO优化,将 google_serach 函数改为异步函数,同时使用 async with 异步请求 url,代码如下:

import asyncio
import aiohttp

# Google搜索
async def google_serach(query, filename):
    try:
        filename = os.path.join(os.getcwd(), f'{filename}.txt')
        domains = ['fr','it','ca','co.uk','ru','co,jp','co.kr','com.au','co.in','com.br','com.ar','co.za','co.nz','es','se','nl','ch','at','dk','be','pl','fi','ie','pt','gr', 'tw', 'com', 'uk', 'de', 'br', 'ca', 'kr', 'mx', 'au', 'za']
        random_domain = random.choice(domains)
        url = f'https://www.google.{random_domain}/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': 'https://www.google.com/',
                   'origin': 'https://www.google.com',
                   'Sec-Fetch-Site': 'same-origin',
                   'Sec-Fetch-Mode': 'navigate',
                   'Sec-Fetch-User': '?1',
                   'Sec-Fetch-Dest': 'document'
        }
        async with aiohttp.ClientSession(headers=headers) as session:
            async with session.get(url, verify_ssl=False, timeout=5) as response:
                soup = BeautifulSoup(await response.text(), 'html.parser')
        # 查找全部div标签
        find_div = soup.find_all('div', {'class': 'yuRUbf'})
        # 加入列表
        get_url = [url.findNext('a')['href'] + '\n' for url in find_div]
        global url_num, dork_finish_num
        url_num += len(get_url)
        dork_finish_num += 1
        print(Fore.GREEN + f'\r{now_time}[INFO]{ "-" * 10}>已获取Url数量:{url_num}  Dorsk数量:{dork_finish_num} / {dork_total_num}', end='' + Fore.RESET)
        # 批量写入文件
        write_info(filename, get_url)
    except TimeoutError:
        pass

使用 asyncio 执行任务,代码如下:

# 分配进程池任务
async def main(query_list, filename):
    tasks = []
    for dokr_list in query_list:
        tasks.append(asyncio.create_task(google_serach(dokr_list, filename)))
    await asyncio.wait(tasks)

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

            # 异步IO优化
            asyncio.run(main(query_list, filename))

            if len(sys.argv) == 1:
                pass
            input(Fore.YELLOW + f'\n\n{now_time}[INFO]{"-" * 10}>程序运行完毕,按回车退出' + Fore.RESET)
            break
        # 文件为空
        except FileNotFoundError:
            print(Fore.RED + f'{now_time}[Error]{"-" * 10}>文件不存在' + Fore.RESET)
        # 中断异常
        except KeyboardInterrupt:
            sys.exit(1)
  1. 添加?问号过滤

google_serach 函数中,将查询字符串中的空格替换为 +,并添加 ? 过滤,代码如下:

# Google搜索
async def google_serach(query, filename):
    try:
        filename = os.path.join(os.getcwd(), f'{filename}.txt')
        domains = ['fr','it','ca','co.uk','ru','co,jp','co.kr','com.au','co.in','com.br','com.ar','co.za','co.nz','es','se','nl','ch','at','dk','be','pl','fi','ie','pt','gr', 'tw', 'com', 'uk', 'de', 'br', 'ca', 'kr', 'mx', 'au', 'za']
        random_domain = random.choice(domains)
        query = query.replace(' ', '+')  # 将空格替换为 +
        url = f'https://www.google.{random_domain}/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': 'https://www.google.com/',
                   'origin': 'https://www.google.com',
                   'Sec-Fetch-Site': 'same-origin',
                   'Sec-Fetch-Mode': 'navigate',
                   'Sec-Fetch-User': '?1',
                   'Sec-Fetch-Dest': 'document'
        }
        async with aiohttp.ClientSession(headers=headers) as session:
            async with session.get(url, verify_ssl=False, timeout=5) as response:
                soup = BeautifulSoup(await response.text(), 'html.parser')
        # 查找全部div标签
        find_div = soup.find_all('div', {'class': 'yuRUbf'})
        # 加入列表
        get_url = [url.findNext('a')['href'] + '\n' for url in find_div if '?' in url.findNext('a')['href']]
        global url_num, dork_finish_num
        url_num += len(get_url)
        dork_finish_num += 1
        print(Fore.GREEN + f'\r{now_time}[INFO]{ "-" * 10}>已获取Url数量:{url_num}  Dorsk数量:{dork_finish_num} / {dork_total_num}', end='' + Fore.RESET)
        # 批量写入文件
        write_info(filename, get_url)
    except TimeoutError:
        pass
``
分析下面代码并优化优化建议如下:1 在写入文件时可以使用批量写入而不是每次写入一个 url可以减少 IO 操作的次数提高效率。2 可以考虑使用多进程或异步IO的方式以进一步提高程序效率。3 可以在搜索时加入问号过滤避免获取无用的 url。import requestsimport timeimport osimport urllib3import sysimport randomfrom bs4

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

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