# -*- coding: utf-8 -*-标签:问题,drivers,selenium,速度慢,add,print,import,options From: https://www.cnblogs.com/xuchunlin/p/16613078.html
'''
createTime : 2022-08-04 10:22
@software: : spiderSystem
author :
@File : spider_0_douyin_user_list.py
Copyright: shannanai
在使用selenium的过程中,速度比较忙,主要原因有
1. 加载图片或者css文件等
2. driver.get(url) 是阻塞的,加载速度慢,修改 加载策略 可以优化速度
3. 一次只打开一个网页
如何实现并发的数据下载呢?
1. 使用多进程的方式,比如进程开20个
2. 一个进程打开一个浏览器,然后一个浏览器同时打开50个url,同时的并发数量是20*50=1000个,考虑到加载不成功等因素,速度也是非常的快
3. 该方法主要是针对一些js破解难度较大的网站,实现数据快速下载
关于拦截网络请求的问题
拦截网络请求的目的是:
1. 避免一些不必要的请求,节约时间。比如图片,css,js等
2. 拦截一些反爬虫的请求,或者修改请求的数据或者返回的数据结果,通过干扰请求数据和返回的数据,避免被反爬虫检测出来。
1. host 设置域名 拦截请求
windows系统 C:\Windows\System32\drivers\etc\hosts 文件设置域名拦截,把IP地址转移到并的地方
2. fiddler 拦截 请求或者修改数据
fiddler 使用 bpu 拦截请求
解决问题重要是思路,下面代码仅仅是思路,没有实际用处
'''
import random
import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from common.contest import *
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import win32api
import win32con
r2 = redis.Redis(host='127.0.0.1', port='6379', db=2)
):
options = Options()
# options.add_argument("headless") # 无头模式
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
# 禁用GPU加速
options.add_argument("disable-gpu")
# 解决加载速度慢的问题
options.page_load_strategy = 'none'
# 禁止图片加载
# options.add_argument('blink-settings=imagesEnabled=false')
# 禁止图片加载
# No_Image_loading = {"profile.managed_default_content_settings.images": 2}
# options.add_experimental_option("prefs", No_Image_loading)
# prefs = {
# 'profile.default_content_setting_values': {
# 'images': 2,
# # 'permissions.default.stylesheet': 2,
# # 'javascript': 2
# }
# }
# options.add_experimental_option('prefs', prefs)
# 据说是执行后不会出现抖音滑块
# options.add_argument('--disable-blink-features=AutomationControlled')
drivers = webdriver.Chrome(options=options)
# 浏览器最大化
drivers.maximize_window()
# 驱动检测
drivers.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => false
})
"""
})
# for循环每次打开10个网页,根据自己的需求指定打开网页个数。可以打开 50个或者100个
for page in range(20):
data_dict = eval(r2.lpop("douyin_user_data_queue"))
# 调用打开浏览器的方法
crawl_data(data_dict, drivers)
time_sleep(0.5)
time_sleep(60)
#检测网页,加载成功的网页可以直接关闭,节省资源
for pages in range(4):
print("pages",pages)
all_handles = drivers.window_handles
print("all_handles",all_handles)
if len(all_handles) > 0:
print(len(all_handles))
open_url_list = []
for handle in all_handles[0:]: # 遍历全部页面句柄
drivers.switch_to.window(handle) # 切换到新页面
html = drivers.page_source
if 'RENDER_DATA' in str(html):
print(666666)
# 存入redis中去
else:
print(555555)
try:
if 'dy-account-close' in html:
drivers.find_element_by_class_name("dy-account-close").click()
except Exception as e:
print(e)
print(22222222222)
# 验证码中间页
if 'ECMy_Zdt' in html or 'Eie04v01' in html:
print("数据下载成功", html.count('ECMy_Zdt'))
drivers.close()
elif '验证码中间页' in html:
print("遇到狗屎的验证码了,程序正在重新打开......")
current_url = drivers.current_url
print(current_url)
# 注意事项 先打开网页,然后再去关闭有验证码的页面
control_string = "window.open('" + current_url + "')"
drivers.execute_script(control_string)
drivers.close()
print("999999999999999999")
time_sleep(30)
drivers.quit()
print("浏览器关闭,马上会重新打开浏览器下载数据")
if __name__ == "__main__":
starttime1 = time.time()
result_list = [page for page in range(10000)]
download_choice = 2
if download_choice == 1:
pool = multiprocessing.Pool(processes=50)
results = []
for item in result_list[0:]:
results.append(pool.apply_async(spider, args=(item,)))
pool.close()
pool.join()
else:
for item in result_list[0:]:
print("正在下载的位置是:", result_list.index(item))
spider(item)
print("============",time.time()-starttime1)