分析下面代码并优化优化建议如下:1 在写入文件时可以使用批量写入而不是每次写入一个 url可以减少 IO 操作的次数提高效率。2 可以考虑使用多进程或异步IO的方式以进一步提高程序效率。3 可以在搜索时加入问号过滤避免获取无用的 url。import requestsimport timeimport osimport urllib3import sysimport randomfrom bs4
优化建议如下:
- 在写入文件时,可以使用批量写入,而不是每次写入一个 url,可以减少 I/O 操作的次数,提高效率。
- 可以考虑使用多进程或异步IO的方式,以进一步提高程序效率。
- 可以在搜索时加入?问号过滤,避免获取无用的 url。
代码实现:
- 批量写入文件
将写入文件的函数 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 = []
- 异步IO优化
使用 asyncio 和 aiohttp 库实现异步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)
- 添加?问号过滤
在 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
``
原文地址: http://www.cveoy.top/t/topic/gigF 著作权归作者所有。请勿转载和采集!