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
时间: 2024-08-03 06:17:11

Learning Scrapy笔记(七)- Scrapy根据Excel文件运行多个爬虫的相关文章

Learning Scrapy笔记(六)- Scrapy处理JSON API和AJAX页面

摘要:介绍了使用Scrapy处理JSON API和AJAX页面的方法 有时候,你会发现你要爬取的页面并不存在HTML源码,譬如,在浏览器打开http://localhost:9312/static/,然后右击空白处,选择"查看网页源代码",如下所示: 就会发现一片空白 留意到红线处指定了一个名为api.json的文件,于是打开浏览器的调试器中的Network面板,找到名为api.json的标签 在上图的红色框里就找到了原网页中的内容,这是一个简单的JSON API,有些复杂的API会要

Scrapy 笔记

1.入门教程:官方文档 新建项目:scrapy startproject tutorial 运行程序 :quotes 文件名 scrapy crawl quotes pycharm中Terminal使用shell进行与scrapy交互 1 scrapy shell quotes.toscrape.com 保存为json文件or csv , 还支持xml文件 scrapy crawl quotes -o quotes.json scrapy crawl quotes -o quotes.csv 原

R语言学习笔记之: 论如何正确把EXCEL文件喂给R处理

前言: 应用背景兼吐槽 继续延续之前每个月至少一次更新博客,归纳总结学习心得好习惯. 这次的主题是论R与excel的结合,又称 论如何正确把EXCEL文件喂给R处理 分为: 1. xlsx包安装及注意事项 2.用vba实现xlsx批量转化csv 以及,这个的对象,针对跟我一样那些从R开始接触编程的,一直以来都是用excel做数据分析的人……编程大牛请轻拍 之所以要研究这个,是因为最近工作上接了个活,要把原来在excel端的报表迁移到R端,自动输出可视化图形,并制作PDF或PPT. 这个活可以分为

Python笔记:使用pywin32处理excel文件

由于前端同事需要批量的对excel文件做特殊处理,删除指定行,故写了此脚本,同时配合config.ini方便不熟悉py的同事使用 #!/usr/bin/env python #-*- coding:utf-8 -*- ####################################################### # 用于批量删除excel的指定行 # # 适用于所有office,前提需要安装pywin32和office软件 # ##########################

SpringMVC框架简单实现上传Excel文件,并将Excel中的数据导入mySQL数据库

第一步 配置DispathcherServlet文件 第二步 配置applicationContext文件 第三步 在index.jsp中 第四步 在HelloSpringmvc.java中写入方法 第五步:与数据库进行连接 第六步 mySQL实体类 第七步 操作excel表 第八步 Dao文件 第九步 测试

[Scrapy][转]关于scrapy命令

Scrapy 提供了两种类型的命令.一种必须在 Scrapy 项目中运行(针对项目(Project-specific)的命令),另外一种则不需要(全局命令).全局命令在项目中运行时的表现可能会与在非项目中运行有些许差别(因为可能会使用项目的设定). 全局命令: startproject settings runspider shell fetch view version 项目(Project-only)命令: crawl check list edit parse genspider depl

马哥学习笔记七——LAMP编译安装之MYSQL

1.准备数据存放的文件系统 新建一个逻辑卷,并将其挂载至特定目录即可.这里不再给出过程. 这里假设其逻辑卷的挂载目录为/mydata,而后需要创建/mydata/data目录做为mysql数据的存放目录. 2.新建用户以安全方式运行进程: # groupadd -r mysql # useradd -g mysql -r -s /sbin/nologin -M -d /mydata/data mysql # chown -R mysql:mysql /mydata/data 3.安装并初始化my

Lua学习笔记(七):迭代器与泛型for

1.迭代器与闭包 迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素.在Lua中我们常常使用函数来描述迭代器,每次调用该函数就返回集合的下一个元素. 迭代器需要保留上一次成功调用的状态和下一次成功调用的状态,也就是他知道来自于哪里和将要前往哪里.闭包提供的机制可以很容易实现这个任务.记住:闭包是一个内部函数,它可以访问一个或者多个外部函数的外部局部变量.每次闭包的成功调用后这些外部局部变量都保存他们的值(状态).当然如果要创建一个闭包必须要创建其外部局部变量.所以一个典型的闭包的结构包含

?统计学习精要(The Elements of Statistical Learning)?课堂笔记(一)

前两天微博上转出来的,复旦计算机学院的吴立德吴老师在开?统计学习精要(The Elements of Statistical Learning)?这门课,还在张江...大牛的课怎能错过,果断请假去蹭课...为了减轻心理压力,还拉了一帮同事一起去听,eBay浩浩荡荡的十几人杀过去好不壮观!总感觉我们的人有超过复旦本身学生的阵势,五六十人的教室坐的满满当当,壮观啊. 这本书正好前阵子一直在看,所以才会屁颠屁颠的跑过去听.确实是一本深入浅出讲data mining models的好书.作者网站上提供免