利用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) ...
随机推荐
- ajax设置默认值ajaxSetup()方法
$(function(){ //设置全局 jQuery Ajax全局参数 $.ajaxSetup({ type:"POST", async:false, cache:false, ...
- springmvc中model可以封装的数据类型
查看源码可以知道,model中可以存放的数据类型 Model addAttribute(String var1, @Nullable Object var2); Model addAttribute( ...
- DAY02、正式介绍python
一.编程语言介绍(***) 1.1.机器语言:直接用计算机能理解的二进制指令编写程序,直接控制硬件 1.2.汇编语言:用英文标签取代二进制指令编写程序,本质也是直接控制硬件 1.3.高级语言:用人类能 ...
- CSS 常见的8种选择器 和 文本溢出问题
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>c ...
- HTML5-SVG-基础篇
什么是SVG? SVG 指可伸缩矢量图形 (Scalable Vector Graphics) SVG 用于定义用于网络的基于矢量的图形 SVG 使用 XML 格式定义图形 SVG 图像在放大或改变尺 ...
- linux系统命令大全
文件管理 cat chattr chgrp chmod chown cksum cmp cp cut diff diffstat file find git gitview in indent les ...
- 洛谷P2084 进制转换
题目背景 无 题目描述 今天小明学会了进制转换,比如(10101)2 ,那么它的十进制表示的式子就是 : 1*2^4+0*2^3+1*2^2+0*2^1+1*2^0, 那么请你编程实现,将一个M进制的 ...
- P1035 调和级数
两种解法如下: 1.模拟 这种做法的思路是枚举n从1开始,直到Sn>k结束,只需要一个循环即可实现. 代码: #include<cstdio> int main() { ; scan ...
- C# 两个类是否继承关系
IsAssignableFrom:确定指定类型的实例是否可以分配给当前类型的实例 B继承自A static void Main(string[] args) { Type a = typeof(A); ...
- 安卓Android基础—第二天
测试的相关概念 好的软件不是开发出来的,是不断测试出回来的 根据是否知道源代码 黑盒测试 白盒测试 根据测试的粒度 方法测试 单元测试 集成测试 系统测试 根据测试的暴力程度 压力测试(谷歌工程师提供 ...