Python爬虫之初窥Scrapy

初窥Scrapy

Scrapy is anapplication framework for crawling web sites and extracting structured datawhich can be used for a wide range of useful applications, like data mining,information processing or historical archival.

Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。

 

Even though Scrapy was originally designed for web scraping, it canalso be used to extract data using APIs (such as Amazon Associates Web Services) or asa general purpose web crawler

其最初是为了 页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。

Selectors选择器

从网页中提取数据有很多方法。Scrapy使用了一种基于 XPath 和 CSS 表达式机制: Scrapy Selectors 。

以Xpath为例:

/html/head/title: 选择HTML文档中 <head> 标签内的 <title> 元素

/html/head/title/text(): 选择上面提到的 <title> 元素的文字

扫描二维码关注公众号,回复: 3049507 查看本文章

//td: 选择所有的 <td> 元素

//div[@class="mine"]: 选择所有具有 class="mine"属性的 div 元素

Selector四个基本方法:

xpath(): 传入xpath表达式,返回该表达式所对应的所有节点的selector list列表。

css(): 传入CSS表达式,返回该表达式所对应的所有节点的selector list列表.

extract(): 序列化该节点为unicode字符串并返回list。

Windows下Scrapy的安装:

1.  scrapy需要安装第三方库文件,lxml和Twisted

2. 下载地址: https://www.lfd.uci.edu/~gohlke/pythonlibs/

3. 下载好文件之后,在DOS命令下pip install 文件的位置(lxlm)安装。

4. 安装完成就可以安装:pip  install scrapy

5. 安装 win32:pip install pypiwin32

Scrapy运行流程

1 引擎访问spider,询问需要处理的URL链接,spider收到请求,将需要处理的URL告诉引擎,然后将URL给引擎处理。

2 引擎通知调度器,调度器得到通知将URL排序入队,并加以处理。

3 引擎通知调度器,调度器将处理好的request返回给引擎

4 引擎接收到request后告诉下载器,按照setting中配置的顺序下载这个request的请求

5 下载器收到请求,将下载好后的东西返回给引擎。如果下载失败,下载器会通知引擎,引擎再通知调度器,调度器收到消息后会记录这个下载失败的request。

6 引擎得到下载好的东西后,通知spider(这里responses默认是交给defparse()函数处理)

7 Spider收到通知后,处理接收的数据

8 Spider处理完数据后返回给引擎两个结果:一个是需要跟进的URL,另一个是获取到的item数据。

9 引擎将接收到的item数据交给管道处理,将需要跟进的URL交给调度器处理。重复循环直到获取完需要的全部信息。

下面我们来浏览一个蜘蛛案例:

import scrapy
class QuotesSpider(scrapy.Spider):
   
name = "quotes"
   
start_urls = [
       
'http://quotes.toscrape.com/tag/humor/',
   
]

   
def parse(self, response):
       
for quotein response.css('div.quote'):
           
yield {
               
'text':quote.css('span.text::text').extract_first(),
               
'author':quote.xpath('span/small/text()').extract_first(),
           
}

   
    next_page = response.css('li.next a::attr("href")').extract_first()
       
if next_pageis not None:
           
yield response.follow(next_page, self.parse)

 

将这段代码放在一个text文件中,并给其命名为quotes_spider.py(可自己命名,此处为我命名的文件名),然后运行蜘蛛

运行命令:scrapy runspider quotes_spider.py -o quotes.json

之后会产生一个json文件,在当前路径下,如下:

[{

    "author": "JaneAusten",

    "text": "\u201cTheperson, be it gentleman or lady, who has not pleasure in a good novel, must beintolerably stupid.\u201d"

},

{

    "author": "GrouchoMarx",

    "text":"\u201cOutside of a dog, a book is man's best friend. Inside of a dog it'stoo dark to read.\u201d"

},

{

    "author": "SteveMartin",

    "text": "\u201cAday without sunshine is like, you know, night.\u201d"

},

...]

创建项目

1、创建一个新的Scrapy项目,cd到存储代码目录,运行命令:scrapy startproject tutorial

该命令将会创建tutorial 目录:包含的文件如下:

scrapy.cfg: 项目的配置文件

tutorial/: 该项目的python模块。之后您将在此加入代码。

tutorial/items.py: 项目中的item文件.

tutorial/pipelines.py: 项目中的pipelines文件.

tutorial/settings.py: 项目的设置文件.

tutorial/spiders/: 放置spider代码的目录.

定义Item

Item 是保存爬取到的数据的容器;其使用方法和python字典类似, 并且提供了额外保护机制来避免拼写错误导致的未定义字段错误。

1对item进行建模→从需要爬取的网站中获取名字,url,以及网站的描述

2在item中定义相应的字段,编辑项目中的items.py文件

import scrapy

class DmozItem(scrapy.Item):

    title = scrapy.Field()

    link = scrapy.Field()

    desc = scrapy.Field()

编写第一个爬虫(Spider)

Spider是用户编写用于从单个网站(或者一些网站)爬取数据的类。

其包含了一个用于下载的初始URL,如何跟进网页中的链接以及如何分析页面中的内容, 提取生成 item 的方法。

创建Spider,必须继承 scrapy.Spider 类, 且定义以下三个属性:

name: 用于区别Spider。 该名字必须是唯一的,不可以为不同的Spider设定相同的名字。

start_urls: 包含了Spider在启动时进行爬取的url列表。 因此,第一个被获取到的页面将是其中之一。后续的URL则从初始的URL获取到的数据中提取。

parse() :是spider的一个方法。 被调用时,每个初始URL完成下载后生成的 Response 对象将会作为唯一的参数传递给该函数。 该方法负责解析返回的数据(responsedata),提取数据(生成item)以及生成需要进一步处理的URL的 Request 对象。

Eg

import scrapy

class Sipder4399(scrapy.Spider):
   
name = "s43999"
   
start_urls= [
       
"http://www.4399.com",
   
]
   
def parse(self,response):
       
lis = response.css("ul.tm_list li")
       
for txt in lis:
           
print(txt.css("a::text").extract_first())

爬取:进入项目根目录,执行命令:scrapy crawl s43999

注:s43999为所编写的name

crawl s43999 启动用于爬取 www.4399.com的spider

Scrapy为Spider的start_urls 属性中的每个URL创建了scrapy.Request 对象,并将 parse 方法作为回调函数(callback)赋值给了Request。

Request对象经过调度,执行生成scrapy.http.Response 对象并送回给spider parse() 方法。

parse() :是spider的一个方法。 被调用时,每个初始URL完成下载后生成的 Response 对象将会作为唯一的参数传递给该函数。该方法负责解析返回的数据(response data),提取数据(生成item)以及生成需要进一步处理的URL的 Request 对象。

猜你喜欢

转载自blog.csdn.net/Candriy/article/details/80740786