互联网中的数据具有非常大的使用价值,同时数据种类也繁多,对于需要做数据分析等应用时,就需要做数据采集和清洗等等,那么目前使用scrapy爬虫框架可以很方便的进行互联网数据爬取,让数据产生价值。

这里只是介绍下简单的使用过程,可以快速的了解和简单的应用,详细的介绍和使用可以参考官方文档:https://docs.scrapy.org/en/latest/intro/tutorial.html

环境

  • Mac os
  • PyCharm

安装

使用PyCharm创建一个Python的工程,后面的操作都是在venv中环境开发

1
2
# 使用pip直接安装
pip install Scrapy

创建项目

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# 在PyCharm的创建的工程根目录中,输入下面的命令
# 创建book的一个项目,名字可以自定义
scrapy startproject book

# 创建完成后的目录结构如下:
book/
    scrapy.cfg            # 部署配置文件

    book/             # project's Python module, you'll import your code from here
        __init__.py

        items.py          # project items definition file

        middlewares.py    # project middlewares file

        pipelines.py      # project pipelines file

        settings.py       # project settings file

        spiders/          # a directory where you'll later put your spiders
            __init__.py

创建任务

1
2
3
4
# 还是在目录中输入以下命令:
scrapy genspider spider名称 '爬取的域名'

# 创建的spider会在 spiders的目录下

基本配置

根据自己的需求修改settings.py 配置文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
FEED_EXPORT_ENCODING = 'utf-8'

DEFAULT_REQUEST_HEADERS = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'en',
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 \
  (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'
}

ITEM_PIPELINES = {
    'suzhou.pipelines.MongoPipeline': 300,
}

高级应用

处理Item,可以在中间件中加入一个存储件:下面看下简单的mongodb的配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html


# useful for handling different item types with a single interface
import pymongo

from suzhou.items import SuzhouItem, SuzhouList


class MongoPipeline:
    collection_name = 'suzhou'

    def __init__(self, mongo_uri, mongo_db):
        self.mongo_uri = mongo_uri
        self.mongo_db = mongo_db

    @classmethod
    def from_crawler(cls, crawler):
        return cls(
            mongo_uri=crawler.settings.get('MONGO_URI'),
            mongo_db=crawler.settings.get('MONGO_DATABASE')
        )

    def open_spider(self, spider):
        self.client = pymongo.MongoClient(self.mongo_uri)
        self.db = self.client[self.mongo_db]

    def close_spider(self, spider):
        self.client.close()

    def process_item(self, item, spider):

      	# 用来过滤不同的item做什么的事情
        if isinstance(item, SuzhouItem):
            self.collection_name = 'suzhou'
        elif isinstance(item, SuzhouList):
            self.collection_name = 'sz'

        self.db[self.collection_name].replace_one({'url': item['url']}, dict(item), upsert=True)
        return item

开始执行

1
2
# 执行爬取任务的命令
scrapy crawl spider的名称

提示

获取配置信息

方式一:

1
2
3
4
5
from scrapy.utils.project import get_project_settings

settings = get_project_settings()

settings.get('')

方式二:

继承scrapy.Spider这个类的可以直接使用内部的字段

1
self.settings.get()

方式三:其他等等

序列化

1
2
3
4
5
# 序列化对象到json字符串
json.dumps(item, default=lambda obj: obj.__dict__)

# 序列化json到python对象
json.loads(str(error))

mongodb

1
2
3
4
5
6
 # 客户端连接
 client = pymongo.MongoClient(settings.get('MONGO_URI'))
 # 获取数据库
 db = client[settings.get('MONGO_DATABASE')]
 # 集合的数据插入和更新操作,upsert=True,如果存在就更新,不存在就插入
 db['error'].replace_one({'url': item.url}, json.loads(str(error)), upsert=True)

结尾

大家还是做友好的公民,用相关技术去爬取允许和公开的数据,做一些有有意义的事情。