您的位置:首页 > 编程语言 > Python开发

scrapy 入门

2017-11-07 14:24 302 查看
github链接:https://github.com/GeraltLin/douban_book

一个Scrapy项目主要分为如下几个步骤:

1. 创建一个Scrapy项目

2. 定义提取的Item

3. 编写爬取网站的 spider 并提取 Item

4. 编写 Item Pipeline 来存储以及处理提取到的Item(即数据)

创建Scrapy项目:

在存储目录中,在cmd命令行中敲入scrapy startproject doubanbook

就创建了名为tutorial的项目,其结构如下:

doubanbook/

    scrapy.cfg

    doubanbook/

        __init__.py

        items.py

        pipelines.py

        settings.py

        spiders/

            __init__.py

            ...

pycharm下使用注意事项:
需要在doubanbook/doubanbook,将外层doubanbook目录右键mark dirctory as sources root

Item :

是保存爬取到的数据的容器,任何定义的item都需要继承scrapy.item,

在item中定义相应的字段,如name,ratings等需要爬取的信息

class DoubanBookItem(scrapy.Item):
    name = scrapy.Field()            # 书名
    price = scrapy.Field()           # 价格
    edition_year = scrapy.Field()    # 出版年份
    publisher = scrapy.Field()       # 出版社
    ratings = scrapy.Field()         # 评分
    author = scrapy.Field()          # 作者
    content = scrapy.Field()


pipelines:

当Item在Spider中被收集之后,它将会被传递到Item Pipeline,一些组件会按照一定的顺序执行对Item的处理。
每个item pipeline组件(有时称之为“Item Pipeline”)是实现了简单方法的Python类。他们接收到Item并通过它执行一些行为,同时也决定此Item是否继续通过pipeline,或是被丢弃而不再进行处理。

以下是item pipeline的一些典型应用:

1.清理HTML数据

2.验证爬取的数据(检查item包含某些字段)

3.查重(并丢弃)

4.将爬取结果保存到数据库中

#对content内容进行处理
class DoubanBookPipeline(object):
def process_item(self, item, spider):
info = item['content'].split(' / ')  # [法] 圣埃克苏佩里 / 马振聘 / 人民文学出版社 / 2003-8 / 22.00元
item['name'] = item['name']
item['price'] = info[-1]
item['edition_year'] = info[-2]
item['publisher'] = info[-3]
return item
Spider:
Spider是用户编写用于从单个网站(或者一些网站)爬取数据的类。在spider文件夹中创建
其包含了一个用于下载的初始URL,如何跟进网页中的链接以及如何分析页面中的内容, 提取生成 item 的方法。

需要定义name(爬虫名字),allowed_domains(允许爬取的范围),start_urls(第一个爬取的页面)

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

from douban.items import DoubanBookItem

class BookSpider(scrapy.Spider):
name = 'douban-book'
allowed_domains = ['douban.com']
start_urls = [
'https://book.douban.com/top250'
]

def parse(self, response):
# 请求第一页
yield scrapy.Request(response.url, callback=self.parse_next)#对第一个初始页面爬取内容,使用回调函数执行parse_next

# 请求其它页
for page in response.xpath('//div[@class="paginator"]/a'):
link = page.xpath('@href').extract()[0]#获取链接
yield scrapy.Request(link, callback=self.parse_next)#去其他页面执行同样的操作

def parse_next(self, response):
for item in response.xpath('//tr[@class="item"]'):
book = DoubanBookItem()
book['name'] = item.xpath('td[2]/div[1]/a/@title').extract()[0]
book['content'] = item.xpath('td[2]/p/text()').extract()[0]
book['ratings'] = item.xpath('td[2]/div[2]/span[2]/text()').extract()[0]
yield book
Settings:

Scrapy设定(settings)提供了定制Scrapy组件的方法。您可以控制包括核心(core),插件(extension),pipeline及spider组件。

对于这个例子,由于豆瓣存在反爬虫机制,所以需要在settings 生成一个user_agent添加如下信息:

from faker import Factory
f = Factory.create()
USER_AGENT = f.user_agent()


执行爬虫项目:
在doubanbook/doubanbook目录下,cmd敲入 scrapy  crawl  douban-book  -o book.csv

以csv保存结果
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 爬虫 scrapy