首先要下载相应的库

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. Centso7 简单优化(阿里云服务器)

    ##.下载常用包 # yum -y install wget net-tools screen lsof tcpdump nc mtr openssl-devel vim bash-completio ...

  2. Python:matplotlib绘制直方图

    使用hist方法来绘制直方图:     绘制直方图,最主要的是一个数据集data和需要划分的区间数量bins,另外你也可以设置一些颜色.类型参数: plt.hist(np.random.randn(1 ...

  3. Yii2后台管理系统常规单据模块最佳实践

    后台管理系统的常规单据通常包括数据,页面,功能:其中数据,页面,功能又可以细分如下: 分类  二级分类  主要内容  注意事项  例如 数据 数据库迁移脚本  用于数据表生成及转态回滚 1.是否需要增 ...

  4. How to SHA1 on macOS

    openssl sha1 /volumes/test/install/osx-test.dmg

  5. react用class关键字来创建组件

    创建组件之前,首先学习一个ES6的写法,叫做展开运算符. 比如我这里有两个数组.如何将第二个数组o2中的所有属性导入到数组o1中呢?一个个输太麻烦,所以就用到了展开运算符. var o2={ age: ...

  6. Jquery根据滚动条显示返回按钮

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...

  7. pip 解决下载包速度慢的问题

    对于Python开发用户来讲,PIP安装软件包是家常便饭.但国外的源下载速度实在太慢,浪费时间.而且经常出现下载后安装出错问题.所以把PIP安装源替换成国内镜像,可以大幅提升下载速度,还可以提高安装成 ...

  8. kubernetes 编排详解 挂载

    ##kube挂载本地磁盘apiVersion: v1 kind: Pod metadata: name: redis spec: containers: - name: redis image: re ...

  9. 大学实验3指导:利用单链表实现A-B

    实验目的:深入理解单链表的建立及操作 实验内容: 1.建立单链表A与B 2.实现主要的函数,查找.插入.删除等 3.实现操作A-B 步骤1:包含必要的函数库,对结构体LNode中的抽象数据类型Elem ...

  10. 【比赛】NOIP2018 填数游戏

    打表找规律.... #include<bits/stdc++.h> #define ui unsigned int #define ll long long #define db doub ...