利用selenium并使用gevent爬取动态网页数据
首先要下载相应的库
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爬取动态网页数据的更多相关文章
- python爬取动态网页数据,详解
原理:动态网页,即用js代码实现动态加载数据,就是可以根据用户的行为,自动访问服务器请求数据,重点就是:请求数据,那么怎么用python获取这个数据了? 浏览器请求数据方式:浏览器向服务器的api(例 ...
- selenium抓取动态网页数据
1.selenium抓取动态网页数据基础介绍 1.1 什么是AJAX AJAX(Asynchronouse JavaScript And XML:异步JavaScript和XML)通过在后台与服务器进 ...
- R语言爬取动态网页之环境准备
在R实现pm2.5地图数据展示文章中,使用rvest包实现了静态页面的数据抓取,然而rvest只能抓取静态网页,而诸如ajax异步加载的动态网页结构无能为力.在R语言中,爬取这类网页可以使用RSele ...
- Python:将爬取的网页数据写入Excel文件中
Python:将爬取的网页数据写入Excel文件中 通过网络爬虫爬取信息后,我们一般是将内容存入txt文件或者数据库中,也可以写入Excel文件中,这里介绍关于使用Excel文件保存爬取到的网页数据的 ...
- 爬虫(三)通过Selenium + Headless Chrome爬取动态网页
一.Selenium Selenium是一个用于Web应用程序测试的工具,它可以在各种浏览器中运行,包括Chrome,Safari,Firefox 等主流界面式浏览器. 我们可以直接用pip inst ...
- 记录几个爬取动态网页时的问题(下拉框,旧的元素无法获取,获取的源代码和f12看到的不一致,爬取延迟)
更新.....这个动态网页其实直接抓取ajax请求就可以了,很简单,我之前想复杂了,虽然也实现了,但是效率极低,不过没关系,就当作是对Selenium的一次学习吧 1.最近在爬取一个动态网页,其中为了 ...
- 爬取动态网页:Selenium
参考:http://blog.csdn.net/wgyscsf/article/details/53454910 概述 在爬虫过程中,一般情况下都是直接解析html源码进行分析解析即可.但是,有一种情 ...
- selenium+phantomjs爬取动态页面数据
1.安装selenium pip/pip3 install selenium 注意依赖关系 2.phantomjs for windows 下载地址:http://phantomjs.org/down ...
- python爬取动态网页2,从JavaScript文件读取内容
import requests import json head = {"user-agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) ...
随机推荐
- .Net在操作mysql查询的时候出现“: Unknown column 'UserName' in 'where clause'”错误
今天使用.Net操作mysql查询的时候,如果加上条件查询的时候就会出现 Unknown column 'UserName' in 'where clause'这个错,不加条件直接select * f ...
- 剑指offer(13)
题目: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 思路: 判断当前两个根结点是否相等,如果相等,判断左右子树是否相等,如果不依次判断左右子树是否满足上 ...
- 安装 Tesserocr (填坑)
参考: https://www.imooc.com/article/45278?block_id=tuijian_wz
- git ignore 忽略 idea文件
下载了项目组的代码之后发现,一个问题,一编译就生成了很多的 .idea文件夹 还有 target文件夹,这些是不需要提交到git上的, 需要提交的时候屏蔽一下,所以需要建立一个ignore文件列表把他 ...
- dede:field name=’position’标签调用 主页改成英文Home和改变符号
在用dede:field name=’position’ 这个标签的时候我们调用的这个就是中文的,出现的是主页>+相应的栏目 ,那么这个问题怎么改成英文的呢?有好多大虾都说找到dede安装目录 ...
- JavaScript控制阻止表单提交
1.在表单上使用onSubmit方法 <?php $form = ActiveForm::begin([ 'options'=>[ 'class' => 'form-horizont ...
- JSP从入门到精通
1. jsp开发环境配置 在windows下配置jsp的开发环境: 假设已经安装好了jdk,下面来配置tomcat 去http://tomcat.apache.org 下载tomcat windows ...
- loadrunner -vuser
在每个负载生成器上,安装 remote agent dispatcher(process) 和 loadrunner agent 控制器指示remote agent dispatcher 在load ...
- org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.mybatis.spring.mapper.MapperScannerConfigurer#0'
七月 05, 2018 10:26:54 上午 org.apache.tomcat.util.digester.SetPropertiesRule begin警告: [SetPropertiesRul ...
- JQuery invoke remote webservice
Sending the Access-Control-Allow-Origin header allows basic cross-origin access, but calling ASP.NET ...