首先要下载相应的库

gevent协程库:pip install gevent

selenium模拟浏览器访问库:pip install selenium

selenium库相应驱动配置  https://www.cnblogs.com/Niuxingyu/p/10490882.html

#导包
import gevent
#猴子补丁
from gevent import monkey
monkey.patch_all()
import requests
import os
import re
from lxml import etree
#模拟浏览器行为
from selenium import webdriver #定义全局变量
global_url_list = [] #定义类
class GeventSpider(object):
#定义类属性
encloseing_url_list = [] #定义抓取方法
def run(self,url):
# 抓取写文件
if url == 'http://military.cctv.com/' :
file_name = 'test_cctv.html'
else:
file_name = 'inner_cctv.html'
html_content = ''
if not os.path.exists(file_name) :
#定义浏览器对象
browser = webdriver.Chrome()
browser.get(url)
#解码赋值
html = browser.page_source.encode('utf-8').decode()
time.sleep(1)
#解码
# html = r.content.decode('utf-8')
#写文件 指定文件编码
with open('./'+file_name,'w',encoding='utf-8') as f:
f.write(html)
#关闭浏览器
browser.quit()
html_content = html
else:
#读取文件返回
with open('./'+file_name,encoding='utf-8') as f:
content = f.read()
html_content = content
self.get_xpath(html_content) #定义数据匹配方法
def get_xpath(self,html):
#转换格式
html = etree.HTML(html)
#匹配url
html_data_url = html.xpath('//span[@class="l"]/a/@href')
#声明修改全局变量
global global_url_list
global_url_list = html_data_url
#修改类属性
self.encloseing_url_list = html_data_url #定义爬取内页逻辑
def get_inner(self,url):
#发送请求
r = requests.get(url)
html = r.content.decode('utf-8')
#正则匹配标题
regex = re.compile('<h1>(.+?)</h1>',re.I)
print(regex.findall(html)) if __name__ == "__main__":
#实例化一个对象
geventspider = GeventSpider()
#定义一个urllist
url_list = ['http://military.cctv.com/'] #请求首页没必要开协程
geventspider.run(url_list[0]) #重新赋值 使用协程同时爬取十四个内页 其实这里我们做了两种方法一个使用类属性赋值,还可以使用我们定义好的全局变量global_url_list来进行赋值
url_list = geventspider.encloseing_url_list
#url_list = global_url_list
#列表推倒式将所有创建好的协程写入列表
job_list = [gevent.spawn(geventspider.get_inner,item) for item in url_list]
#阻塞协程 等待所有协程完成后在进行关闭
gevent.joinall(job_list)

利用selenium并使用gevent爬取动态网页数据的更多相关文章

  1. python爬取动态网页数据,详解

    原理:动态网页,即用js代码实现动态加载数据,就是可以根据用户的行为,自动访问服务器请求数据,重点就是:请求数据,那么怎么用python获取这个数据了? 浏览器请求数据方式:浏览器向服务器的api(例 ...

  2. selenium抓取动态网页数据

    1.selenium抓取动态网页数据基础介绍 1.1 什么是AJAX AJAX(Asynchronouse JavaScript And XML:异步JavaScript和XML)通过在后台与服务器进 ...

  3. R语言爬取动态网页之环境准备

    在R实现pm2.5地图数据展示文章中,使用rvest包实现了静态页面的数据抓取,然而rvest只能抓取静态网页,而诸如ajax异步加载的动态网页结构无能为力.在R语言中,爬取这类网页可以使用RSele ...

  4. Python:将爬取的网页数据写入Excel文件中

    Python:将爬取的网页数据写入Excel文件中 通过网络爬虫爬取信息后,我们一般是将内容存入txt文件或者数据库中,也可以写入Excel文件中,这里介绍关于使用Excel文件保存爬取到的网页数据的 ...

  5. 爬虫(三)通过Selenium + Headless Chrome爬取动态网页

    一.Selenium Selenium是一个用于Web应用程序测试的工具,它可以在各种浏览器中运行,包括Chrome,Safari,Firefox 等主流界面式浏览器. 我们可以直接用pip inst ...

  6. 记录几个爬取动态网页时的问题(下拉框,旧的元素无法获取,获取的源代码和f12看到的不一致,爬取延迟)

    更新.....这个动态网页其实直接抓取ajax请求就可以了,很简单,我之前想复杂了,虽然也实现了,但是效率极低,不过没关系,就当作是对Selenium的一次学习吧 1.最近在爬取一个动态网页,其中为了 ...

  7. 爬取动态网页:Selenium

    参考:http://blog.csdn.net/wgyscsf/article/details/53454910 概述 在爬虫过程中,一般情况下都是直接解析html源码进行分析解析即可.但是,有一种情 ...

  8. selenium+phantomjs爬取动态页面数据

    1.安装selenium pip/pip3 install selenium 注意依赖关系 2.phantomjs for windows 下载地址:http://phantomjs.org/down ...

  9. python爬取动态网页2,从JavaScript文件读取内容

    import requests import json head = {"user-agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) ...

随机推荐

  1. select2 简单解析

    <select name="supplierId" class="customsBrokerSel select2 absOpacity select2-hidde ...

  2. Flask从入门到精通

    1. flask的下载和安装 在windows下安装flask flask依赖于两个库, 即werkzeug 和jinja2 , werkzeug负责服务器的部署, jinja2负责模板引擎,管理安装 ...

  3. Python 第三方库 cp27、cp35 等文件名的含义(转)

    转自 https://blog.csdn.net/lanchunhui/article/details/62417519 转自 https://stackoverflow.com/questions/ ...

  4. word2vec训练&IC分词(待)

    参考http://www.52nlp.cn/%E4%B8%AD%E8%8B%B1%E6%96%87%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91%E8%AF%AD%E6%96 ...

  5. vue-cli: preset预设

    preset:预设 vue create demo01 过程中,会保存预设,自动保存着 .vuerc 文件中 .vuerc 文件的位置:C:\Users\Administrator C:\Users\ ...

  6. Sql Server设置主键和外键

    设置主键 https://jingyan.baidu.com/article/9158e0003349a7a2541228fd.html 设置外键 https://jingyan.baidu.com/ ...

  7. Qt 获取屏幕信息

    void GetScreenInfo() { QDesktopWidget* desktopWidget = QApplication::desktop(); //获取可用桌面大小 QRect des ...

  8. IntelliJ cannot log in to GitHub上传github报错解决

    重装系统,新装的Intellij IDEA上新建的项目上传github失败,报错: invalid authentication token ... 此处多为本地git用户的用户名/邮箱,与之前设置的 ...

  9. JavaEE进阶集锦(持续更新中)

    1.影响Servlet生命周期的注解:@PostConstruct和@PreDestroy @PostConstruct:被修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器调用一次, ...

  10. $.ajax ,ajax请求添加请求头,添加Authorization字段

    beforeSend : function(request) { request.setRequestHeader("Authorization", sessionStorage. ...