python并发下载
多线程爬虫
多线程爬虫请求内容速度过快,可能会造成服务器过载,或者是IP地址被封禁。为了避免出现这种情况,我们需要给爬虫设置一个delay延迟标识,设定请求同一个域名的时候的最小时间间隔。
同一时刻每个CPU只会执行一个进程,然后会在不同的进程之间快速切换,这样会给多个程序同时运行的错觉。同样地,在一个进程之中,程序的执行也是在不同线程之间进行切换的,每个线程执行程序的不同部分。当一个线程等待网页下载时,进程可以切换到其他线程继续执行,避免CPU时间的浪费。
在Python中可以使用内置的threading库实现多线程并发的效果。当有URL可以爬取数据的时候,循环创建线程,直到达到线程池的最大值。当第一个线程完成下载时,待爬取队列为空,线程就会退出。把爬虫队列转移到MongoDB当中,不同服务器上的爬虫也能够协同处理同一个爬虫任务。
动态内容
对动态网页进行逆向工程,使用webkit与网站交互,使用webkit库pyqt我们可以自定义浏览器渲染引擎,这样就可以完全控制想要执行的行为。如果不需要这么高的灵活性,那么还可以使用Selenium可以选择,提供了使浏览器自动化的API接口。使用pip install selenium
安装。
# 创建一个浏览器的连接
from selenium import webdriver
driver = webdriver.Chrome()
# 执行每条命令时,都可以通过浏览器接口来检查selenium是否按照预期执行,只能使用系统中已安装浏览器
# 在选定的浏览器中加载网页,使用get方法
driver.get('http://www.baidu.com')
# 设置需要选取的元素
driver.find_element_by_id('xxx').send_keys('xx')
# 可以使用js语句直接设置选项框的内容
js = "document.getElementById('page_size').options[1].text='1000'"
driver.execute_script(js)
# 单击搜索按钮执行搜索
driver.find_element_by_id('search').click()
# 通过implicitly_wait()方法设置超时30秒,如果查找的元素没有出现,selenium最多等待30秒
driver.implicitly_wait(30)
# 调用close方法关闭浏览器
driver.close()