scrapy框架之创建项目

创建工程

  1. scrapy startproject ProName
    在这里插入图片描述
    scrapy.cfg 基本不用修改

    items.py 存储相关

    pipelines 储存相关

    Scrapy Engine
    Scheduler
    Downloader
    创建完的项目里面没有包含这三项,
    代表项目以及给我们封装好了功能,
    我们要做的事情就是在去写spiders,items piplines就可以了
  2. cd ProName
  3. 创建爬虫文件 scrapy genspider spiderName www.xxx.com
    在这里插入图片描述
    .
  4. 修改文件
# -*- coding: utf-8 -*-
import scrapy
​
class FirstSpider(scrapy.Spider):
   #爬虫源文件的唯一标识,类似于html页面中的id
   name = 'first'
   #被允许访问的域名,和下面的start_urls属性里的内容联合使用
   #start_urls里的域名哪些可以访问,但是一般不怎么用
   # allowed_domains = ['www.xxx.com']
   #列表里的域名都会被scrapy自动去请求
   start_urls = ['https://www.baidu.com/','https://cn.bing.com/']
   #解析数据
   def parse(self, response):
       print(response)
  1. settings:
  • 不遵从robots协议 ROBOTSTXT_OBEY = False
  • UA伪装 去浏览器开发者模式里的network中去复制一个
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
  • LOG_LEVEL = ‘ERROR’ 日志文件的打印级别(不知道的翻出sam老师分享的django日志打印)
  1. 执行 scrapy crawl spiderName

scrapy的数据解析

解析时也支持xpath,但是这个xpath基本一样用,只是一些小细节不一样。

  1. extract():列表是有多个列表元素
  2. extract_first():列表元素只有单个
content = div.xpath('./a/text()')[0].extract()
content = li.xpath('./a/text()').extract_first()

scrapy的持久化存储

  1. 基于终端指令:
    只可以将parse方法的返回值存储到磁盘文件中,用改命令生成的文件的后缀是有限制的,如果写text他会提示如下错误:
    crawl: error: Unrecognized output format ‘text’, set one using the ‘-t’ switch or as a file extension from the supported list (
    ‘json’, ‘jsonlines’, ‘jl’, ‘csv’, ‘xml’, ‘marshal’, ‘pickle’)

    从上面错误可以看出,基于终端指令数据的存储只支持:
    ‘json’, ‘jsonlines’, ‘jl’, ‘csv’, ‘xml’, ‘marshal’, ‘pickle’
    scrapy crawl first -o file.csv
    在这里插入图片描述
# -*- coding: utf-8 -*-
import scrapy
​
class FirstSpider(scrapy.Spider):
   #爬虫源文件的唯一标识,类似于html页面中的id
   name = 'first'
   #被允许访问的域名,和下面的start_urls属性里的内容联合使用
   #start_urls里的域名哪些可以访问,但是一般不怎么用
   # allowed_domains = ['www.xxx.com']
   #列表里的域名都会被scrapy自动去请求
   start_urls = ['https://news.baidu.com/guonei']
   #解析数据
   def parse(self, response):
       result = []
       li_list = response.xpath('//*[@id="instant-news"]/ul/li')
       for li in li_list:
           #注意:xpath返回的列表中的列表元素是Selector对象,我们要解析获取的字符串的数据是存储在该对象中
           #必须经过一个extract()的操作才可以将改对象中存储的字符串的数据获取
           # content = div.xpath('./a/text()')[0].extract()
           content = li.xpath('./a/text()').extract_first()
           #xpath返回的列表中的列表元素有多个(Selector对象),想要将每一个列表元素对应的Selector中的字符串取出改如何操作?response.xpath('/div//text()').extract()
           print(content) #<Selector xxx='qwer' data="拒缴供暖费占理吗?北京法院一年判了千余案">
           dic = {
   
               'title': content
          }
           result.append(dic)
       return result

注意:

parse返回的结果要中要含有字典、Request或者Item,不然会报错,无法写入本地文件中
上面的程序如果 不把content内容让如到dict找那个而是直接 result.append(content),
会报如下错误:
ERROR: Spider must return Request, BaseItem, dict or None, got ‘str’ in <GET https://
news.baidu.com/guonei>

在这里插入图片描述

一. 基于管道:pipelines.py

编码流程:
1. 数据解析
​ 2. 在item的类中定义相关的属性

import scrapy
​
​
class FirsttestItem(scrapy.Item):
   # define the fields for your item here like:
   # name = scrapy.Field()
   # Field用于声明项目的对象不会被分配为类属性。
   content = scrapy.Field
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值