Learning Scrapy笔记(七)- Scrapy根据Excel文件运行多个爬虫
摘要:根据Excel文件配置运行多个爬虫
很多时候,我们都需要为每一个单独的网站编写一个爬虫,但有一些情况是你要爬取的几个网站的唯一不同之处在于Xpath表达式不同,此时要分别为每一个网站编写一个爬虫就显得徒劳了,其实可以只使用一个spider就爬取这些相似的网站。
首先创建一个名为generic的工程和一个名为fromcsv的spider:
scrapy startproject generic
cd generic
scrapy genspider fromcsv example.com
然后创建一个csv文件,在文件中填充以下信息:

使用Python的csv库来验证一下
$ python
>>> import csv
>>> with open("todo.csv", "rU") as f:
reader = csv.DictReader(f)
for line in reader:
print line
输出如下:

注意:todo.csv文件的第一行会自动作为字典的key
现在读取todo.csv文件中的URL和Xpath表达式来运行spider,由于我们并不能提前知道URL,所以要从spider中移除start_urls和allowed_domains部分,使用start_requests()方法,对于csv文件中的每一行都产生一个Request对象,并且将字段名和Xpath表达式放入参数request.mate中,传递到parse函数,然后永Item和ItemLoader来填充item的字段
import csv
import scrapy
from scrapy.http import Request
from scrapy.loader import ItemLoader
from scrapy.item import Item, Field
class FromcsvSpider(scrapy.Spider):
name = "fromcsv"
def start_requests(self):
with open("todo.csv", "rU") as f:
reader = csv.DictReader(f)
for line in reader:
request = Request(line.pop('url')) #从字典中弹出了key为url的元素
request.meta['fields'] = line
yield request
def parse(self, response):
item = Item() # 在本工程中并没有定义items.py文件
l = ItemLoader(item=item, response=response)
for name, xpath in response.meta['fields'].iteritems():
if xpath:
item.fields[name] = Field() # 动态创建一个item
l.add_xpath(name, xpath)
return l.load_item()
fromcsv.py源文件代码地址:
https://github.com/Kylinlin/scrapybook/blob/master/ch05%2Fgeneric%2Fgeneric%2Fspiders%2Ffromcsv.py
运行spider:scrapy crawl fromcsv

由于上面的源码中硬编码了todo.csv文件名,一旦文件名发生了变动就需要修改源代码,这并不是一个好的设计,其实Scrapy使用了一个简便的方式(使用 -a)可以从命令行向spider传送参数,例如:-a variable=value,那么spider就可以在源代码中的self.variable来获取value。为了检查变量名并提供默认值,就使用Python的方法getarrt(self, ‘variable’, ‘default’),所以上面的with语句可以修改为:
with open(getarrt(self, “file”, “todo.csv”), “rU”) as f:
然后在运行spider时通过-a参数来指定csv文件(如果没有使用-a参数,就默认使用todo.csv文件):
scrapy crawl fromcsv –a file=todo.csv
Learning Scrapy笔记(七)- Scrapy根据Excel文件运行多个爬虫的更多相关文章
- Scrapy笔记09- 部署
Scrapy笔记09- 部署 本篇主要介绍两种部署爬虫的方案.如果仅仅在开发调试的时候在本地部署跑起来是很容易的,不过要是生产环境,爬虫任务量大,并且持续时间长,那么还是建议使用专业的部署方法.主要是 ...
- 记录python接口自动化测试--把测试结果写进excel文件(第九目)
python中一般使用xlrd(excel read)来读取Excel文件,使用xlwt(excel write)来生成Excel文件(可以控制Excel中单元格的格式),需要注意的是,用xlrd读取 ...
- Python:将爬取的网页数据写入Excel文件中
Python:将爬取的网页数据写入Excel文件中 通过网络爬虫爬取信息后,我们一般是将内容存入txt文件或者数据库中,也可以写入Excel文件中,这里介绍关于使用Excel文件保存爬取到的网页数据的 ...
- Learning Scrapy笔记(六)- Scrapy处理JSON API和AJAX页面
摘要:介绍了使用Scrapy处理JSON API和AJAX页面的方法 有时候,你会发现你要爬取的页面并不存在HTML源码,譬如,在浏览器打开http://localhost:9312/static/, ...
- Learning Scrapy笔记(零) - 前言
我已经使用了scrapy有半年之多,但是却一直都感觉没有入门,网上关于scrapy的文章简直少得可怜,而官网上的文档(http://doc.scrapy.org/en/1.0/index.html)对 ...
- Learning Scrapy笔记(三)- Scrapy基础
摘要:本文介绍了Scrapy的基础爬取流程,也是最重要的部分 Scrapy的爬取流程 Scrapy的爬取流程可以概括为一个方程式:UR2IM,其含义如下图所示 URL:Scrapy的运行就从那个你想要 ...
- Scrapy:学习笔记(2)——Scrapy项目
Scrapy:学习笔记(2)——Scrapy项目 1.创建项目 创建一个Scrapy项目,并将其命名为“demo” scrapy startproject demo cd demo 稍等片刻后,Scr ...
- scrapy笔记集合
细读http://scrapy-chs.readthedocs.io/zh_CN/latest/index.html 目录 Scrapy介绍 安装 基本命令 项目结构以及爬虫应用介绍 简单使用示例 选 ...
- Scrapy 笔记(二)
一个scrapy爬虫知乎项目的笔记 1.通过命令创建项目 scrapy startproject zhihucd zhihuscrapy genspider zhihu www.zhihu.com(临 ...
随机推荐
- SQL Server 2012 Enterprise Core Edition和SQL Server 2012 Enterprise Edition的区别
core没有图形界面,只有power shell界面,给没有图形界面的windows用的.
- css列表
列表是有三种形式: 1.无序列表,用来表示一个列表语义,并且每个项目与项目之间是不分先后顺序的 ul 的英文unordered list "无序列表" li 的英文 list ...
- android View 自动 GONE 问题
首先说一下 view visibility VISIBLE.INVISIBLE.GONE的区别: 可见(visible) XML文件:android:visibility="visible& ...
- Django中级篇(上)
Form验证 django中的Form一般有两种功能: 输入html-----------不能你自己写一些标签,而帮你自动生成 验证用户输入-------将用户验证信息保存起来,可以传到前段 #!/u ...
- 洛谷P2731 骑马修栅栏 Riding the Fences
P2731 骑马修栅栏 Riding the Fences• o 119通过o 468提交• 题目提供者该用户不存在• 标签USACO• 难度普及+/提高 提交 讨论 题解 最新讨论 • 数据有问题题 ...
- noip2009提高组题解
NOIP2009题解 T1:潜伏者 题目大意:给出一段密文和破译后的明文,一个字母对应一个密文字母,要求破译一段密文,如果有矛盾或有未出现密文无法破译输出failed,否则输出明文. 思路:纯模拟题 ...
- C/C++中几种操作位的方法
参考How do you set, clear and toggle a single bit in C? c/c++中对二进制位的操作包括设置某位为1.清除某位(置为0).开关某位(toggling ...
- C# 图片旋转360度程序
这几天开发一个程序,需要将一个图片旋转360度然后每一个角度保存下来.刚开始本来想着是让美工弄的,但是让一个美工手动转360度,她会喷你一脸. using System; using System.C ...
- php 几种函数类型
<?php header("Content-type:text/html;charset=utf-8"); $a=; $b=; function demo(){ global ...
- 使用扩展方法(this 扩展类型)
namespace ConsoleApp_UseExtendWays{ class Program { static void Main(string[] args) { Student s = ne ...