scrapy学习(完全版)

scrapy1.6中文文档

  1. 指定初始URL
  2. 解析响应内容
    1. 给调度器
    2. 给item;pipeline用于做格式化;持久化

      创建一个初始scrapy初始项目初始工作

      ① 、在windows终端(cmd)输入,进行前期工作
  3. scrapy startproject 工程名 >(注意你此时的路径就是你工程所在的路径)
  4. cd 工程名 (转到你工程所在的文件夹)
  5. scrapy genspider 爬虫名 要爬的网址 (创建一个爬虫)
  6. 打开工程文件中的 settings.py文件 ,进行基本设置
  • 令 ROBOTSTXT_OBEY = False (不遵守robot协议,因为如果遵守基本上爬取不到东西)
  • 在Override the default request headers: 中 启动headers 加'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36 QIHU 360SE'

    ②、spiders文件里的编辑
  1. 打开 爬虫名.py 进行编辑 (编写你的爬虫文件)
  2. scrapy crawl 爬虫名 (运行爬虫,此时应处于你的工程路径下,如果后面加 "--nolog会只输出结果)
  3. ==在spider文件的初始处理函数中写入:form scrapy.http import Request , yield Request(url = url,callback = self.parse)== 可以将新要访问的url添加到调度器中,然后调度器进行访问与下载,得到的response交给parse函数处理 (如果要执行深度的话,必须使callback =self.parse 这样才能迭代
  4. response的方法与属性:
  • response.text 返回服务器返回的response(一般为网页源代码)的字符串形式
  • response.body 返回服务器返回的response(一般为网页源代码)的字节形式
  • response.xpath('str') 以xpath语法定位元素,返回为selector或者selector_lsit对象
  • response.meta 返回的是一个字典,其中包含了很多信息,例如 depth
  • selector或者seletor_list对象可以使用xpath继续定位元素
  • selector_list对象可以迭代
  • 通过对selector或者selector_list对象使用extract()等价于getall() 或者 extract_first()等价于get()方法,可以将selector或seletor_list对象中的文本信息提取出来,那个getall()和extract()是生成字符串组成的列表
  1. 可以通过重写该方法,让访问start_urls中的url的访问返回的response对象调用新的方法(即指定最开始处理请求的方法),即可以将self.parse改成别的
    def start_requests(self):
        for url in self.start_urls:
            yield Request(url,callback=self.parse)
③、items文件中的编辑
  1. 通过在items.py文件的XXXXItem类中写入:例如:author =scrapy.Field() ,content =scrapy.Field() 可以将要传给pipelines的数据进行格式化,即用一个XXXItem对象进行封装。然后通过在spider文件初始函数中中写入:from 工程名.items import XXXItem ,item = XXXXItem(author = author,content =content)就可以将数据进行格式化,将author,content封装到item对象中,再通过写yield item 自动将item对象递交给引擎,然后引擎再传给pipelines

    ④ 、pipelines文件中的编辑
  2. settings文件中 开启Configure item pipelines 中的那个字典,其中的数字代表了pipelines执行的优先级,你可以在 pipelines文件中定义多个类,通过优先级决定了他们执行的顺序,小的优先。
  3. 在pipelines中传递的item就是从spider中那边传过来的数据,可以通过dict(item)将其变成字典进行储存,也可以用scrapy中内置的类进行存储,见后面;spider指的是spider对象,他有name属性 ,因而可以通过 if spider.name = "XXX"判断是那个蜘蛛爬取的信息,进而有区别的进行处理。
  4. pipeline对象中process_item()方法是当spiders有yield语句 或reurn 数据语句中会执行该方法,open_spider()方法是当爬虫打开后会调用这个函数,close_spider()方法是爬虫完成后会调用该方法。
    因而在打开文件的操作可以放在,open_spider()方法中,关闭文件的操作可以放在close_spider()方法中,这样可以防止重复的打开与关闭文件。from_crawler()方法用于创建对象,并获取配置文件中的相关数据。

import json
#from scrapy.exporters import  JsonItemExporter
from scrapy.exceptions import DropItem
class QsbkPipeline(object):
    # def __init__(self):
    #     self.fp = open('duanzi.json','w',encoding = 'utf-8')
    #
    def __init__(self):
        '''
        进行数据初始化
        '''
        # self.fp = open('duanzi.json','wb',encoding = 'utf-8')  # 这里要用二进制方式打开,因为JsonItemExporter写入文件的形式是二进制形式
        # self.exporter = JsonItemExporter(self.fp,ensure_ascii = False,encoding = 'utf-8')
        # self.exporter.start_exporting()
        pass

    @classmethod
    def from_crawler(cls,crawler):
        '''
        创建对象,并获取配置文件(settings)中的相关数据
        :param crawler:
        :return:
        '''
        # conn_str = crawler.settings.get("DB") # 获取配置文件(settings文件)中的DB值,
        # return cls(conn_str)# 创建对象,并向对对象中传入配置文件中的DB值,可以在__inint__方法中,获取到



    def process_item(self, item, spider):
        '''
        当spiders有yield语句 或reurn 数据语句中会执行该方法
        :param item:
        :param spider:
        :return:
        '''
        # item_json = json.dumps(dict(item),ensure_ascii = False)
        # self.fp.write(item_json+'\n')
        # return item
        print(item['author']+":"*5+item['content'])
        # return item  # 当有多个pipeline对象时,这里返回一个item,即可以将item传递给下一个pipeline对象
        # raise DropItem() # 若不想将item交给下一个pipeline对象,应该使用这种方式,因为后面有某种方式可以监听


    def open_spider(self,spider):
        '''
        爬虫打开后会调用这个函数
        :param spider:
        :return:
        '''
        pass

    def close_spider(self,spider):
        '''
        爬虫完成后会调用这个函数
        :param spider:
        :return:
        '''
        pass
scrapy中的自带的去重方法:

输入这个语句即可看到,scrapy中自带类的语句,模范这个类,自定义写一个新的文件,自定义相关方法,即可自定义去重

from scrapy.dupefilters import RFPDupeFilter
自定义去重方法(scrapy中默认是可以在传入调度器中的url去重的)
  1. 也可以自定义对象,来进行自定义去重 例子:新创建一个含有类RepeatFilter文件,在settings文件中加入以下下配置信息,进行自定义去重类的注册(激活)
 DUPEFILTER_CLASS = '工程名.类所在的文件名.RepeatFilter'

类RepeatFilter文件中的代码如下:

# 这个类的名称可以随意定义
class RepeatFilter(object):
    def __init__(self):
        '''
        2、进行对象初始化
        '''
        self.visited_set = set() #定义一个集合,用来存储非重复地url

    @classmethod  # 这是一个类方法
    def from_settings(cls, settings):
        '''
        1、创建对象
        '''
        return cls() #在这里创建了一个实例,因而会去执行__init__()方法

    def request_seen(self, request):
        '''
        4、对象被访问即调用该方法
        '''
        if request.url in self.visited_set:
            return True
        self.visited_set.add(request.url)
        return False

    def open(self):  # can return deferred
        '''
        3、打开蜘蛛,开始爬取
        '''
        pass

    def close(self, reason):  # can return a deferred
        '''
        停止爬取
        '''
        pass

    def log(self, request, spider):  # log that a request has been filtered
        pass
  • 9
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值