ReZero's Utopia.

Scrapy 初窥笔记

Word count: 524Reading time: 2 min
2017/03/18 Share
  1. scrapy startproject YourProjectName

    建立scrapy项目
  2. 开始爬虫 scrapy crawl SpiderName 开始执行爬虫 以上仿麻烦
    根目录新建执行文件

    from scrapy.cmdline import execute
    execute(['scrapy', 'crawl', 'dingdian'])

    顶点为spider的name

  3. 定义爬取的字段 就比如说爬小说
    字段有 小说作者,小说内容等
    Item文件下定义

    class DingdianItem(scrapy.Item):
        author = scrapy.Field()
        content = scrapy.Field()

    如上,定义一定要继承Item
    然后字段皆为Field(), 没有其他类型
    比Django要方便的多

  4. 开始写核心spider部分 spider以start_requests为初始函数,该函数必须yield一个可迭代对象
    比如Request(url, call_back, meta)
    参数说明url,即需要Request.get 的内容,call_back是一个parse函数,该函数可接受一个由刚才的get获取的response, meta是由上一个Request往这传的时候可以带上的参数 parse 最终要yield 或 return 一个或多个 Item,来进行后续处理

    这里有个巨大的

    response尽量一次处理,不要在多个parse之间执行,因为所有的url,但凡被Request过,不会被二次请求,简单来说,url通常不能为response.url,如果你跟我一样踩到这个坑,注意这个解决方法

Scrapy的官方文档:
http://doc.scrapy.org/en/latest/topics/request-response.html#scrapy.http.Request
Request函数在文档中的定义:
class scrapy.http.Request(url[, callback, method=’GET’, headers, body, cookies, meta, encoding=’utf-8’, priority=0, dont_filter=False, errback])
在这儿, request的 dont_filter 设置为True就可以了

  1. Item被收集完成后,进入pipeline,
    这里就进行最后的处理了,可以将Item的内容提取出来,进行数据库等的存储
    模板:

    class DingdianPipeline(object):

    def process_item(self, item, spider):
        # deferToThread(self._process_item, item, spider
        if isinstance(item, DcontentItem):
            url = item['chapterurl']
            name_id = item['id_name']
            num_id = item['num']
            xs_chaptername = item['chaptername']
            xs_content = item['chaptercontent']
            Sql.insert_novel(name, content, name_id, num_id, url)
            print('小说存储完毕')
            return item

def process_item(self, item, spider):该方法必须重写,且return item此外,此函数通常功能即为去重后存储

以上为此次学习内容,差点一下午完成,踩坑踩两天

CATALOG
  1. 1. 这里有个巨大的
  • 坑: