利用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)  

原文地址:https://www.cnblogs.com/Niuxingyu/p/10509697.html

时间: 2024-11-09 09:09:41

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

爬取动态网页中关于构造浏览器头的注意事项

在原来爬取动态网页图片中,获取到了图片的实际地址,但是下载下来的图片是损坏的,究其原因,是服务器端阻止了访问,但是观察发现 headers = {'User-Agent': random.choice(UserAgent_List), 'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", 'Accept-Encoding': 'gzip', } 浏览器头已经构造好了

python爬取动态网页

静态网页:根据url即可方便的爬取 动态网页:分为两种:一种是通过F12查看控制台的xhr等文件,找到包含所要爬取的内容的文件,发现这个文件的url路径跟页码有联系,那么就可以根据构造的url来进行访问爬取了.还有一种情况是查看了包含所要爬取内容的文件,发现文件url是固定不变的或者跟页码没有关系,这个时候可以通过简单的模拟浏览器点击行为来请求网页再爬取,这种方案执行效率较慢,不适于多页爬取的情况.代码如下: 1 def parse(self, response): 2 print 'parse

[python]利用selenium模拟用户操作抓取天猫评论数据

准备: python3.5 安装selenium包 第一种方法: cmd里输pip install selenium,但是经常报错 第二种方法: 下载安装包-cmd进入解压路径-python setup.py install-报错permission denied-右键安全更改报错文件夹权限为完全控制-再次安装成功unknown error: unable to discover open pages-下载chromedriver放在环境变量目录下测试自动打开百度时提示"您使用的是不受支持的命令

爬虫毕设(三):爬取动态网页

动态网页分析 按照上一篇的分析,直接使用XPath找到该标签,然后通过parse提取出数据,在写入到item中就完事了.但是,当信心满满的写完代码后却发现,控制台输入了一个简简单单的[]. 小问号你是否有很多朋友. 一顿操作猛如虎,一看输出数据无.那么这到底是怎么回事呢?我们从头开始分析. 打开NetWork,找到tv/,点开Preview,结果发现只有一个框架,内容却是空白的. 这是由于网页执行js代码,通过Ajax请求数据来重新渲染页面的.所以我们需要找到有数据的那一个请求,然后再对该请求的

nodeJS(request+cheerio+pump)稳定爬取SSR网页数据

记录自己的爬虫经验 本次是爬取某SSR网站列表页及详情页数据,包括文本及图片,将数据存入MongoDB数据库,将图片下载至本地: 首先呢,用到的nodeJS模块有: request: 用于请求网址内容或请求图片内容 cheerio: 通俗的讲,可以当做jQuery使用 pump: 一种管道,操纵数据流,比原生的pipe好用,可操控性强,具体用法可去npm查询 path: 读取操作文件路径 fs: 操作文档读写等 第一步:引入需要用到的相关模块,建议用yarn安装以下模块 const reques

定向爬取指定网页数据,并且过滤

需要爬取http://toutiao.com/i6192092485658378754/ 数据 问题1: 获得 页面的所有数据,并且过滤掉不需要的部分,或者指定需要的

爬取动态网页:Selenium

参考:http://blog.csdn.net/wgyscsf/article/details/53454910 概述 在爬虫过程中,一般情况下都是直接解析html源码进行分析解析即可.但是,有一种情况是比较特殊的:网页的数据采用异步加载的,比如ajax加载的数据,在我们“查看网页源代码”是查看不到的.采用常规的爬虫这一块是解析不到的. 第一种解决方案是采用一些第三方的工具,模拟浏览器的行为,去加载数据.比如:Selenium.PhantomJs. 优点:不必考虑动态页面的各种变化多端(无论动态

selenium+phantomjs爬取动态页面数据

1.安装selenium pip/pip3 install selenium 注意依赖关系 2.phantomjs for windows 下载地址:http://phantomjs.org/download.html phantomjs-2.1.1-windows 仅支持64位系统 phantomjs-1.9.7-windows 支持32位系统,更早的版本没测试过 把下载好的安装包bin目录下的phantomjs.exe文件拷贝到python安装目录下的Scripts目录下 3.模拟浏览器操作

python scrapy爬取动态页面

preface:最近学习工作之外,有个异性朋友需要爬取动态网页的要求,输入关键词爬取某个专利网站在该关键词下的一些专利说明.以往直接python urllib2可破,但是那只是对于静态网页可破,但是对于用js等其他的生成的动态网页的话,则貌似不行(没试过).然后在网上找了些资料,发现scrapy结合selenium包好像可以.(之所以这么说,暂时卤主也还没实现,先记录下来.) #=====================根据官网中简单的介绍作个人理解=======================