创建scrapy项目:

scrapy startproject 项目名

cd到项目名下

scrapy genspider 爬虫名 www.baidu.com(网站网址)

之后按照提示创建爬虫文件(官方测试网站为http://quotes.toscrape.com/)

创建启动文件

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

quotes是爬虫名,该文件创建在scrapy项目根目录下

css选择器:

response.css('.text::text').extract()

这里为提取所有带有class=’text’ 这个属性的元素里面的text返回的是一个列表

response.css('.text::text').extract_first()

这是取第一条,返回的是str

print(response.css("div span::attr(class)").extract())

这是取元素

Xpath选择器:

url = response.url+response.xpath('/html/body/div/div[2]/div[1]/div[1]/div/a[1]/@href').extract_first()

和原来用法基本一样,这里是获取一个url 然后跟网站的主url拼接了

print(response.xpath("//a[@class='tag']/text()").extract())

取带有class=’tag’属性的超链接中间的文本内容

print(response.url)
print(response.status)

打印该请求的url,打印请求的状态码

保存为json形式的东西

scrapy crawl quotes -o quotes.json

json lines存储

scrapy crawl quotes -o quotes.jl

scrapy crawl quotes -o quotes.csv

scrapy crawl quotes -o quotes.xml

scrapy crawl quotes -o quotes.pickle

scrapy crawl quotes -o quotes.marshal

scrapy crawl quotes -o ftp://user:pass@ftp.example.com/path/to/quotes.csv

piplines.py中的操作

from scrapy.exceptions import DropItem
class HelloPipeline(object):
    def __init__(self):
        self.limit = 50
    def process_item(self,item,spider):
        if item['name']:
            if len(item['name']) > self.limit:
                item['name'] = item['name'][:self.limit].rstrip()+'。。。'
            return item
        else:
            return DropItem import pymongo
class MongoPipline(object):
    def __init__(self,mongo_url,mongo_db):
        self.mongo_url = mongo_url
        self.mongo_db = mongo_db
    @classmethod
    def from_crawler(cls,crawler):
        return cls(mongo_url=crawler.settings.get('MONGO_URI'),mongo_db=crawler.settings.get('MONGO_DB'))     def open_spider(self,spider):
        print(self.mongo_url,self.mongo_db)
        self.client = pymongo.MongoClient(self.mongo_url)
        self.db = self.client[self.mongo_db]     def process_item(self,item,spider):
        self.db['name'].insert(dict(item))
        print(item)
        return item     def close_spider(self,spider):
        self.client.close()

记得开setting.py:

ITEM_PIPELINES = {
   'hello.pipelines.HelloPipeline': 300,
   'hello.pipelines.MongoPipline': 400,
}
MONGO_URI = '127.0.0.1'
MONGO_DB = 'hello'

DownloadMiddleware

核心方法:

Process_request(self,request,spider)

Return None:继续处理这个request,直到返回response,通常用来修改request

Return Response 直接返回该response

Return Request 将返回的request 重新放归调度队列,当成一个新的request用

Return IgnoreRequest 抛出异常,process_exception被一次调用,

Process_response(self,request,response,spider)

Return request将返回的request 重新放归调度队列,当成一个新的request用

Return response 继续处理该response直到结束

Process_exception(request,excetion,spider)

Return IgnoreRequest 抛出异常,process_exception被一次调用,

通过重写中间件给request加useragent,将返回的状态码都改成201

在setting里:

DOWNLOADER_MIDDLEWARES = {
   'dingdian.middlewares.AgantMiddleware': 543,
}

在middleware里:

import random
class AgantMiddleware(object):
    def __init__(self):
        self.user_agent
= ['Mozilla/5.0 (Windows NT 10.0; WOW64;
rv:58.0) Gecko/20100101 Firefox/58.0']
    def process_request(self,request,spider):
        request.headers['User-Agent'] = random.choice(self.user_agent)
        print(request.headers)

def process_response(self,request,response,spider):
        response.status=201
        return response

scrapy两种请求方式

一种

import scrapy

yield scrapy.Request(begin_url,self.first)

第二种

from scrapy.http import Request

yield Request(url,self.first,meta={'thename':pic_name[0]})

使用post请求的方法:

from scrapy import FormRequest
##Scrapy中用作登录使用的一个包

formdata = {
    'username': 'wangshang',
    'password': 'a706486'
}
yield scrapy.FormRequest(
    url='http://172.16.10.119:8080/bwie/login.do',
    formdata=formdata,
    callback=self.after_login,
)

中间键添加代理IP以及header头

class UserAgentMiddleware(object):
    def __init__(self):
        self.user_agent
= ['Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36','Mozilla/5.0
(Windows NT 10.0; WOW64; rv:58.0) Gecko/20100101 Firefox/58.0']
    def process_request(self,request,spider):
        request.meta['proxy'] = 'http://'+'175.42.123.111:33995'

scrapy使用指南的更多相关文章

  1. Scrapy开发指南

    一.Scrapy简介 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. Scrapy基于事件驱动网络框架 Twis ...

  2. Python资源大全

    The Python Tutorial (Python 2.7.11) 的中文翻译版本.Python Tutorial 为初学 Python 必备官方教程,本教程适用于 Python 2.7.X 系列 ...

  3. Github上的python开源项目

    Python开源项目,期待大家和我们一起共同维护 github排名榜单 https://github.com/trending github搜索榜单:https://github.com/search ...

  4. 0.Python 爬虫之Scrapy入门实践指南(Scrapy基础知识)

    目录 0.0.Scrapy基础 0.1.Scrapy 框架图 0.2.Scrapy主要包括了以下组件: 0.3.Scrapy简单示例如下: 0.4.Scrapy运行流程如下: 0.5.还有什么? 0. ...

  5. Scrapy 爬虫 使用指南 完全教程

    scrapy note command 全局命令: startproject :在 project_name 文件夹下创建一个名为 project_name 的Scrapy项目. scrapy sta ...

  6. Python Scrapy爬虫速成指南

    序 本文主要内容:以最短的时间写一个最简单的爬虫,可以抓取论坛的帖子标题和帖子内容. 本文受众:没写过爬虫的萌新. 入门 0.准备工作 需要准备的东西: Python.scrapy.一个IDE或者随便 ...

  7. Scrapy 爬虫

    Scrapy 爬虫 使用指南 完全教程   scrapy note command 全局命令: startproject :在 project_name 文件夹下创建一个名为 project_name ...

  8. DotNet 资源大全中文版,内容包括:编译器、压缩、应用框架、应用模板、加密、数据库、反编译、IDE、日志、风格指南等

    DotNet 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资源整理.awesome-dotnet 是由 quozd 发起和维护.内容包括:编译器. ...

  9. Python爬虫Scrapy(二)_入门案例

    本章将从案例开始介绍python scrapy框架,更多内容请参考:python学习指南 入门案例 学习目标 创建一个Scrapy项目 定义提取的结构化数据(Item) 编写爬取网站的Spider并提 ...

随机推荐

  1. 田螺便利店—filezilla实现Linux和windows通信

    新站点改为sftp,端口为22 2,虚拟机通过桥接模式连网,ip地址为:192.168.119.147 已通过新建站点方式(SFTP)连接服务器(使用user账户),但是在使用系统root账号登录时失 ...

  2. Vue基础之计算属性

    适用场景 设想一个场景,你需要得到一个复杂运算/逻辑的返回值,利用模板内的表达又过长且难以阅读和维护,这时计算属性就可以很好的解决你的问题.看下面的例子: <!DOCTYPE html> ...

  3. mysql _触发器

    MySQL 触发器 MySQL包含对触发器的支持.触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行. 1.创建触发器在MySQL ...

  4. 剑指offer前6题

    二维数组中的查找 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 时间限制:1秒 ...

  5. 你想知道吗?come

    从大二接触Java开始,到现在也差不多三个年头了.从最基础的HTML.CSS到最后的SSH自己都是一步一个脚印走出来的,其中开心过.失落过.寂寞过.虽然是半道出家但是经过自己的努力也算是完成了“学业” ...

  6. libpointmatcher安装和使用

    libpointmatcher介绍: libpointmatcher is a modular library implementing the Iterative Closest Point (IC ...

  7. python基础教程002_列表与元组

    1.列表 定义: edward = ['Edward Gumdy',42] 描述edward姓名与年龄的列表 edward = [] 空列表 操作: 索引: greeting = 'hello' pr ...

  8. Java(原码、反码、补码和计算机存储格式)

    原码:将一个整数,转换成二进制,就是其原码.如单字节的5的原码为:0000 0101:-5的原码为1000 0101. 反码:正数的反码就是其原码:负数的反码是将原码中,除符号位以外,每一位取反.如单 ...

  9. frost_vex_01

    int inc = 0; //整数inc等于0 while(inc < 6){ //inc在小于6的范围内递增 if(rand(@ptnum + inc + ch("seed" ...

  10. 【druid 】数据库连接池

    一.数据库连接池架构 二.数据库连接池的过滤器 spi的思想,加载配置文件的Filter druid.filters.default=com.alibaba.druid.filter.stat.Sta ...