API例子:用Python驱动采集网页数据

 1

引言

本文讲解怎样用Python驱动浏览器写一个简易的网页数据采集器。开源Python即时网络爬虫项目将与Scrapy(基于twisted的异步网络框架)集成,所以本例将使用Scrapy采集淘宝这种含有大量ajax代码的网页数据,但是要注意本例一个严重缺陷:用Selenium加载网页的过程发生在Spider中,破坏了Scrapy的架构原则。所以,本例只是为了测试驱动和ajax网页数据采集这两个技术点,用于正式运行环境中必须予以修改,后续的文章将专门讲解修正后的实现。

请注意,本例用到的xslt文件是通过MS谋数台保存提取器后,通过API接口获得,一方面让python代码变得简洁,另一方面,节省调试采集规则的时间。详细操作请查看Python即时网络爬虫:API说明

2

具体实现

2.1,环境准备

需要执行以下步骤,准备Python开发和运行环境:

  • 安装Python--官网下载安装并部署好环境变量 (本文使用Python版本为3.5.1)

  • 安装lxml-- 官网库下载对应版本的.whl文件,然后命令行界面执行 "pip install .whl文件路径"

  • 安装Scrapy--命令行界面执行 "pip install Scrapy",详细请参考Scrapy:Python3下的第一次运行测试

  • 安装selenium--命令行界面执行 "pip install selenium"

  • 安装Firefox--官网下载安装

上述步骤展示了两种安装:1,安装下载到本地的wheel包;2,用Python安装管理器执行远程下载和安装。

2.2,开发和测试过程

以下代码默认都是在命令行界面执行

1),创建scrapy爬虫项目simpleSpider

E:\python-3.5.1>scrapy startproject simpleSpider

2),修改settings.py配置

有些网站会在根目录下放置一个名字为robots.txt的文件,里面声明了此网站希望爬虫遵守的规范,Scrapy默认遵守这个文件制定的规范,即ROBOTSTXT_OBEY默认值为True。在这里需要修改ROBOTSTXT_OBEY的值,找到E:\python-3.5.1\simpleSpider\simpleSpider下文件settings.py,更改ROBOTSTXT_OBEY的值为False。

3),导入API模块

在项目目录E:\python-3.5.1\simpleSpider下创建文件gooseeker.py(也可以在开源Python即时网络爬虫GitHub源 的core文件夹中直接下载),代码如下:

 
#!/usr/bin/python# -*- coding: utf-8 -*-# 模块名: gooseeker# 类名: GsExtractor# Version: 2.0# 说明: html内容提取器# 功能: 使用xslt作为模板,快速提取HTML DOM中的内容。# released by 集搜客(http://www.gooseeker.com) on May 18, 2016# github: https://github.com/FullerHua/jisou/core/gooseeker.pyfrom urllib import requestfrom urllib.parse import quotefrom lxml import etreeimport timeclass GsExtractor(object):def _init_(self):self.xslt = ""# 从文件读取xsltdef setXsltFromFile(self , xsltFilePath):file = open(xsltFilePath , 'r' , encoding='UTF-8')try:self.xslt = file.read()finally:file.close()# 从字符串获得xsltdef setXsltFromMem(self , xsltStr):self.xslt = xsltStr# 通过GooSeeker API接口获得xsltdef setXsltFromAPI(self , APIKey , theme, middle=None, bname=None):apiurl = "http://www.gooseeker.com/api/getextractor?key="+ APIKey +"&theme="+quote(theme)if (middle):apiurl = apiurl + "&middle="+quote(middle)if (bname):apiurl = apiurl + "&bname="+quote(bname)apiconn = request.urlopen(apiurl)self.xslt = apiconn.read()# 返回当前xsltdef getXslt(self):return self.xslt# 提取方法,入参是一个HTML DOM对象,返回是提取结果def extract(self , html):xslt_root = etree.XML(self.xslt)transform = etree.XSLT(xslt_root)result_tree = transform(html)return result_tree


       
4),创建SimpleSpider爬虫类


在项目目录E:\python-3.5.1\

simpleSpider\simpleSpider\spiders下创建文件simplespider.py,代码如下:

 
# -*- coding: utf-8 -*-import timeimport scrapyfrom lxml import etreefrom selenium import webdriverfrom gooseeker import GsExtractorclass SimpleSpider(scrapy.Spider):name = "simplespider"allowed_domains = ["taobao.com"]start_urls = ["https://item.taobao.com/item.htm?spm=a230r.1.14.197.e2vSMY&id=44543058134&ns=1&abbucket=10"]def __init__(self):# use any browser you wishself.browser = webdriver.Firefox()def getTime(self):# 获得当前时间戳current_time = str(time.time())m = current_time.find('.')current_time = current_time[0:m]return current_timedef parse(self, response):print("start...")#start browserself.browser.get(response.url)#loading time intervaltime.sleep(3)#get xsltextra = GsExtractor()extra.setXsltFromAPI("API KEY" , "淘宝天猫_商品详情30474")# get dochtml = self.browser.execute_script("return document.documentElement.outerHTML");doc = etree.HTML(html)result = extra.extract(doc)# out filefile_name = 'F:/temp/淘宝天猫_商品详情30474_' + self.getTime() + '.xml'open(file_name,"wb").write(result)self.browser.close()print("end")      

5),启动爬虫

在E:\python-3.5.1\simpleSpider项目目录下执行命令

 

E:\python-3.5.1\simpleSpider>scrapy crawl simplespider

6),输出文件

采集到的网页数据结果文件是:淘宝天猫_商品详情30474_1466064544.xml

3

展望

调用Firefox,IE等全特性浏览器显得有点太重量级,很多场合可以考虑轻量级的浏览器内核,比如,casperjs和phantomjs等。同时运行在没有界面的浏览器(headless browser,无头浏览器)模式下,也许可以对网页数据采集性能有所提升。

然后,最重要的一点是要写一个 Scrapy 的下载器,专门驱动这些浏览器采集网页数据,也就是把这个功能从Spider中迁移出来,这样才符合Scrapy的整体框架原则,实现事件驱动的工作模式。

3

相关文档

1, Python即时网络爬虫:API说明


2, API例子:用Java/JavaScript下载内容提取器

5

集搜客GooSeeker开源代码下载源

1, GooSeeker开源Python网络爬虫GitHub源

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/3297.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab重名函数调用踩坑记录

我新安装了matlab的robotics toolbox,然而调用的rotx不是我想要的函数。 我上网查了一下资料,知乎和csdn有相关的回答,但是我试了一下还是不行。它们的方法是移除路径再添加路径避免函数的冲突。相关方法放在文末的相关参考1 2。这里建议先用…

VScode跑gtest

可能得前置步骤 VScode安装cpp: 安装 C/C 扩展:打开 VSCode 扩展市场,搜索「C/C」并安装扩展。 安装编译gtest 安装 Google Test: 如果你使用的是 Windows,可以下载并安装 pre-built 版本;如果你使用的是 Linux 或…

ETHERNET/IP转TCP/IP网关tcp/ip协议包含哪几层

大家好,今天我们将带大家了解一款自主研发的通讯网关,远创智控YC-EIP-TCP/IP。这是一个强大的工具,能帮助我们将ETHERNET/IP网络和TCP/IP网络连接在一起,让我们更好地管理和监控网络。 1, 首先,让我们来看看这款网关…

orbslam3 生成标定板rosrun kalibr kalibr_create_target_pdf --type

rosrun kalibr kalibr_create_target_pdf --type apriltag --nx 6 --ny 6 --tsize 0.08 --tspace 0.3小师妹要做相机视觉标定,需要制作棋盘格,无奈其电脑有些卡,对此毫无经验的博主从头开始安装(此前博主已经安装了ROS环境&#x…

leetcode 965.单值二叉树

⭐️ 题目描述 🌟 leetcode链接:单值二叉树 思路: 让当前的根节点与左孩子节点与右孩子节点判断,若相等则继续向下分治,让左孩子与右孩子当作新的根节点继续判断,直到某个节点不相等。 1️⃣ 代码&#x…

用thinkphp6写一个博客系统,输出完整项目代码

很抱歉,我无法提供完整项目代码。但是,我可以为您提供一个简单的示例,以帮助您开始使用 ThinkPHP 6 构建博客系统。 环境准备:安装 PHP 和 Composer安装并配置一个适当的 Web 服务器(如 Apache 或 Nginx)创…

Gateway网关组件(在Spring Cloud整合Gateway(idea19版本))

Spring Cloud Gateway官网:Spring Cloud Gateway 局域网中就有网关这个概念,局域网接收数据或发送数据都要通过网关,比如使用VMware虚拟机软件搭建虚拟机集群的时候,往往我们需要选择IP段中的⼀个IP作为网关地址,网关可以对请求进行控制,提升…

【Linux系统】结合有趣的小故事让你学懂生产者消费者模型

目录 由故事引入模型故事背景供货商们的矛盾市民们和供货商之间的矛盾一市民们和供货商之间的矛盾二市民们的矛盾模型总结 生产者消费者模型为什么要使用生产者消费者模型?生产者消费者模型的特点生产者消费者模型优点 基于BlockingQueue的生产者消费者模型C queue模…

力扣 452. 用最少数量的箭引爆气球

题目来源:https://leetcode.cn/problems/minimum-number-of-arrows-to-burst-balloons/description/ C题解1: 根据x_end排序,x_start小的在前,这样可以保证如果第 i 个球的x_end大于等于第 j 个球的x_start时,第 j 个球…

ElasticSearch文档(document)在index上的增删改查

文章目录 一、document定义:二、单条增删改查1、创建索引:2、添加文档:3、获取文档:4、更新文档:5、删除文档: 三、批量增删改查:1、批量添加文档:2、批量更新文档:3、批…

自建DNSlog服务器

DNSlog简介 在某些情况下,无法利用漏洞获得回显。但是,如果目标可以发送DNS请求,则可以通过DNS log方式将想获得的数据外带出来。 DNS log常用于以下情况: SQL盲注无回显的命令执行无回显的SSRF 网上公开提供dnslog服务有很多…

FactoryBean源码解析

文章目录 一、简介二、FactoryBean 接口的方法三、FactoryBean 与 BeanFactory 的区别四、源码解析五、实际应用 一、简介 FactoryBean 是 Spring 框架中的一个接口,用来创建特定类型的 Bean 对象。实现FactoryBean 接口就可以自定义 Bean 对象的创建过程。Factory…

利用ArcGIS Pro制作三维效果图

1、新建工程 打开Arcgispro,新建工程,这里我们要用到的模板为全局场景。 2、添加数据 这里添加的数据需要有一个字段内容是数值的,这个字段也是接下来要进行拉伸的字段。 3、高度拉伸 数据添加进来后,如下图所示,这时图层处于2D图层里。 这时我们点中该图层,回到菜单栏…

开放式蓝牙耳机推荐哪款?开放式蓝牙耳机排行榜推荐

​说到开放式耳机,想必很多人听着还是陌生,普通耳机久戴,会出现耳朵疼痛问题,而开放式蓝牙耳机没有,不入耳的设计更加的干净,不会对耳道造成的伤害,下面我给大家推荐几款很不错的开放式耳机&…

Jenkins的安装部署以及基本使用

前言: 今天有空大概记录的一个作为一个测试人员日常中Jenkins的使用。 一、环境准备 在安装使用Jenkins前我们要先安装jdk,这里博主选择的是jdk11。我们先删除旧的jdk然后安装全新的jdk。 1、先看下当前我们的jdk版本。 2、查看jdk安装路径&#xff1…

【Rust 基础篇】Rust 解引用多态

导言 在 Rust 中,解引用多态(Deref Coercion)是一种特性,它允许自动进行类型转换,将实现了 Deref trait 的类型转换为目标类型的引用。通过解引用多态,我们可以更方便地使用不同类型的智能指针和引用。 本…

rabbitmq延时队列自动解锁库存

一、库存服务自动解锁库存 使用了最终一致性来解决分布式事务 当order服务出现异常回滚,此时ware服务无法回滚,怎么办? 使用seata全局事务虽然能在order服务出现异常导致回滚时使其他服务的也能同时回滚,但在流量大的情况下是使用…

kafka生产端TCP连接管理

目录 前言: Kafka生产者程序 Kafka生产者客户端如何创建TCP连接 Kafka生产者客户端如何关闭TCP连接 总结: 参考资料 前言: 在网络层协议中,TCP作用在第四层传输层、Http协议作用在第七层最上层应用层,一个完整的…

k8s服务发现之第二弹Service详解

创建 Service Kubernetes Servies 是一个 RESTFul 接口对象,可通过 yaml 文件创建。 例如,假设您有一组 Pod: 每个 Pod 都监听 9376 TCP 端口每个 Pod 都有标签 appMyApp apiVersion: v1 kind: Service metadata:name: my-service spec:s…

vue3笔记-脚手架篇

第一章 基础篇 第二章 脚手架篇 vue2与vue3的一些区别 响应式系统: Vue 2 使用 Object.defineProperty 进行响应式数据的劫持和监听,它对数据监听是一项项的进行监听,因此,当新增属性发生变化时,它无法监测到&…