Ipidea丨Scrapy爬虫框架快速上手

作者:IPIDEA

2020-03-24 16:42:00

## Scrapy爬虫框架快速上手

---

Scarpy是一个比较强大的爬虫框架,可以轻松地帮我们使用代理IP采集多个站点的数据。

#### 安装
  - anaconda
  - lxml
  - openSSL
  - Twisted
  - pyWin32
  - Scrapy:
```bash
pip install Scrapy
``` 
验证安装: 在命令行下输入scrapy并回车,若输出scrapy版本及命令菜单则说明安装正确。

#### 创建scrapy项目
安装好Scrapy框架后,在终端中输入以下命令创建一个Scrapy项目:
```bash
scrapy startproject mySpider
```
输入命令后会自动生成文件夹以及部分项目文件,接下来进入项目文件夹,利用项目模板创建一个spider:
```bash
cd mySpider
scrapy genspider myspider www.example.com 
```
此时会在项目文件夹下的spiders文件夹下生成一个myspider.py文件。

#### Scrapy项目结构
完成项目创建后的Scrapy项目文件结构如下:
```shell
scrapy.cfg
mySpider/
   __init__.py
   items.py
   middlewares.py
   pipelines.py
   settings.py
   spiders/
      __init__.py
      myspider
```
Items
  Items用于创建最终需要保存的数据的容器,初始项目后items.py会创建一个继承scrapy.Item的类,我们只需要在里面添加抓起后最终保存的字段即可。
```python
import scrapy

class MyspiderItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field()
    time = scrapy.Field()
    content = scrapy.field()
```

Middlewares
  Middlewares是Scrapy请求过程的处理机制,里面初始时已经生成了一些基本的处理方法,我们还可以根据需求改写或添加部分内容,如添加一些默认请求头、引入代理等等。
```python
class MyspiderSpiderMiddleware(object):
    def process_spider_input(self,response,spider)
    def process_spider_output(self,response,result,spider)
    def process_spider_exception(self,response,exception,spider)
    def process_spider_requests(self,start_requests,spider)
class MyspiderDownloaderMiddleware(object):
    def process_request(self, request, spider)
    def process_response(self, request, response, spider)
    def process_exception(self, request, exception, spider)
    def spider_opened(self, spider)
``` 

Pipeline
  Pipeline是Scrapy中的管道方法,是用来进行获得Item之后的处理流程,如数据的处理和存储等。通常会将数据库的连接写入方法定义在此文件夹下,例如此处我们将数据存入MongoDB中。
```python
from pymongo import MongoClient, UpdateOne

class MyspiderPipeline(object):
    def __init__(self):
        DB = MongoClient('mongodb://127.0.0.1:27017')['Spider']
        self.database = DB['mydata']

    def process_item(self, item, spider):
        update_requests = []
        doc = dict(item)
        update_requests.append(UpdateOne(
            {'title': doc['url']},
            {'$set': doc},upsert=True))

        if len(update_requests) > 0:
            update_result = self.database.bulk_write(update_requests, ordered=False)
            print('Crawl success : %s, inserted: %4d' % (doc['title'], update_result.upserted_count), flush=True)

        return item
```

Settings 
  Settings中是Scrapy项目的全局配置,前面涉及的所有方法是否使用都要在此设置选取,默认情况下大部分功能都被注释未启用,我们需要开启用到的功能。
```python
···
# Obey robots.txt rules #Robot协议
ROBOTSTXT_OBEY = False

DOWNLOADER_MIDDLEWARES = {
    'mySpider.middlewares.MyspiderDownloaderMiddleware': 543,
}

ITEM_PIPELINES = {
   'mySpider.pipelines.MyspiderPipeline': 300,
}
```
  
spider
  spider文件夹下是针对具体需要爬取网站的执行规则,我们之前已经创建了一个模板文件myspider:
```python
import scrapy
from mySpider import items

class MyspiderSpider(scrapy.Spider):
    name = 'myspider'
    allowed_domains = ['www.example.com']
    start_urls = ['http://www.example.com/']

    def parse(self, response):
        item = items.ComcontactsItem()
        result = response.xpath('//div[@name="keywords"]//text()').extract()
        for info in result:
            info = info[0].split(',')
            item['title'] = info[0].strip()
            item['time'] = info[1]
            item['content'] = info[-1].strip()
            yield item
```
其中,name是此爬虫的名称,allowed_domains是限定爬取的域名范围,start_urls是初始爬取链接列表,parse方法则是具体的爬取方法,根据不同的网站编写处理规则。

开始执行
爬取规则编写完成之后,在终端进入项目文件夹,输入以下命令,就开始爬取了:
```bash
scrapy crawl myspider
```

*ipidea提供的服务必须在境外网络环境下使用

热门资讯