Scrapy入门
目录
了解scrapy
Scrapy是Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。
1.安装scrapy
略
2.创建项目
首先scrapy startproject <name>
, <name>项目名称,如:scrapy startproject tutorial。
之后scrapy会自动的构建项目如下结构:
scrapy.cfg tutorial/ __init__.py items.py pipelines.py settings.py spiders/ __init__.py
这些文件分别是:
-
scrapy.cfg
: 项目的配置文件 -
tutorial/
: 该项目的python模块。之后您将在此加入代码。 -
tutorial/items.py
: 项目中的item文件. -
tutorial/pipelines.py
: 项目中的pipelines文件. -
tutorial/settings.py
: 项目的设置文件. -
tutorial/spiders/
: 放置spider代码的目录.
3.编写第一个爬虫
在spiders文件夹下创建一个python程序,可以编写如下:
import scrapy class DmozSpider(scrapy.spiders.Spider): name = "dmoz" allowed_domains = ["dmoz.org"] start_urls = [ "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/", "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/" ] def parse(self, response): filename = response.url.split("/")[-2] with open(filename, 'wb') as f: f.write(response.body)
为了创建一个Spider,您必须继承 scrapy.Spider 类, 且定义以下三个属性:
-
name: 用于区别Spider。 该名字必须是唯一的,您不可以为不同的Spider设定相同的名字。
-
start_urls: 包含了Spider在启动时进行爬取的url列表。 因此,第一个被获取到的页面将是其中之一。 后续的URL则从初始的URL获取到的数据中提取。
-
parse() 是spider的一个方法。 被调用时,每个初始URL完成下载后生成的 Response 对象将会作为唯一的参数传递给该函数。 该方法负责解析返回的数据(response data),提取数据(生成item)以及生成需要进一步处理的URL的 Request 对象。
其中name
是必须定义并且是唯一名称,用于标识这个爬虫。
start_urls
起始爬去的URL,是一个列表,可以编写多个地址。
parse()
函数,scrapy爬虫的入口,自动解析start_urls中的地址,返回一个response对象。默认调用start_urls中的URL,也可以使用函数start_requests(self)规定parse函数的请求。
4.启动爬虫
项目目录执行命令scrapy crawl dmoz
,启动名字为dmoz的爬虫进行抓取。
重要概念
scrapy内置许多对象可供使用,比较重要的就是response和request。
request对象
一般用来回调url,进行深度抓取,可以便捷的进行不同方法之间传递。
参数:
-
url(string) : 请求的网址
-
callback(): 将使用此请求的响应(一旦下载)调用的函数作为其第一个参数。
-
method(string): 此请求的HTTP方法。默认为’GET’。
-
meta(dict) : Request.meta属性的初始值。如果给定,则此参数中传递的dict将被浅拷贝。
-
body(str或unicode): 请求体。不管这个参数的类型,存储的最终值将是一个str(不会是unicode或None)。
-
headers(dict): 请求头。dict值可以是字符串或列表。如果 None作为值传递,则不会发送HTTP头。
-
cookie(dict或list) - 请求cookie
常用的便是,使用yield进行下一个函数的回调操作,示例:
在Scrapy中爬多页面的数据且要保存到一个文件中时,即同一个文件存储不同的数据: 爬虫程序通过Request对象将数据(data)传递给ScrapyEngine(引擎),由引擎传递给pipeline(管道模块) 在这里 meta={} 实现传递数据的功能
def parse_page1(self, response): item = MyItem() item['main_url'] = response.url url = "http://www.example.com/some_page.html" yield scrapy.Request(url,callback=self.parse_page2,meta={'item':item}) def parse_page2(self, response): item = response.meta['item'] item['other_url'] = response.url yield item
response对象
scrapy会在起始函数parse()
,直接得到response对象,通过response对象便可以进行页面的解析,这是scrapy自动的将页面解析后的一个对象。
参数:
-
url(string) - 此响应的URL
-
status(integer) - 响应的HTTP状态。默认为200。
-
headers(dict) - 这个响应的头。dict值可以是字符串或列表。
-
body(str) - 响应体。它必须是str,而不是unicode,除非你使用一个编码感知响应子类,如 TextResponse。
-
flags(list) - 是一个包含属性初始值的 Response.flags列表。如果给定,列表将被浅拷贝。
-
request(Requestobject) - 属性的初始值Response.request。这代表Request生成此响应。