一. Scrapy基础概念

Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,我们只需要实现少量的代码,就能够快速的抓取。Scrapy 使用了 Twisted异步网络框架,可以加快我们的下载速度。

二. 操作

1. 基本操作

1)创建一个scrapy项目

scrapy startproject mySpider

2)生成一个爬虫

scrapy genspider itcast "itcast.cn”

3)提取数据

完善spider,使用xpath等方法

4)保存数据

pipeline中保存数据

2. 完善spdier

3. spdier数据传到pipeline

4. 使用·pipeline

5. 设置log

为了让我们自己希望输出到终端的内容能容易看一些:

我们可以在setting中设置log级别

在setting中添加一行(全部大写):LOG_LEVEL = "WARNING”

默认终端显示的是debug级别的log信息

三. 实行翻页操作

1.    获取地址,使用scrapy.Request方法

需要传递数据时,可以在方法中传递meta:

yield scrapy.Request(next_page_url,callback=self.parse,meta=…)

dont_filter:让scrapy不会过滤当前url

四. 定义Item

1.    方法

2.    实例

3.    在不同的解析函数中传递参数

五. 深入pipeline

可以将一些需要初始化的数值添加在open_spider方法中

而close_spider可以做一些收尾工作

六. CrawlSpider

1.    功能

1)我们把满足某个条件的url地址传给rules,同时能够指定callback函数。不需要手动去找下一页的url地址,达到简化代码的目的

2)生成CrawlSpider的命令

scrapy genspider –t crawl 项目名 “域名”

2.    实例

rules内的几个参数:

1) LinkExtractor 连接提取器,提取url地址

2) callback 提取出来的url地址的response会交给callback来处理

3) follow 当前url地址的响应是否重新进rules来提取url地址

3.    注意点

七. Scrapy模拟登录

1. 携带cookie登录

1)直接携带cookie,在浏览器登录之后获取检查里边cookies的值

2)找到发送post请求的url地址,带上信息,发送请求

可以在settings里边添加参数【COOKIES_DEBUG=True】观察cookies的传递过程。

不能把cookies放在headers中

2.    使用FormRequest

1) scrapy.FormRequest(url,formdata={},callback)  formdata请求体

2) formdata里边的数据,可以试着在浏览器输入用户名和密码之后,在session的Headers里边找到formdata,接着在Elements中查找对应的组件

3)示例

3.    自动寻找Form表单中action的url

1) scrapy.FormRequest.from_response(response,formdata={},callback)

2) 示例

八. 案例分析

1.    贴吧爬虫

1.1   补充不完整的链接

注意:需要导入import urllib

通过urljoin方法自动把链接补全

1.2   对图片解码以及翻页时处理内容覆盖的问题

1) 图片解码:需要import requests

item["img_list"] = [requests.utils.unquote(i).split("src=")[-1] for i in item["img_list"]]

2) 翻页使用extend()来处理

item["img_list"].extend(response.xpath("//img[@class='BDE_Image']/@src").extract())

1.3   spider下的tb.py完整代码
import scrapy

import urllib

import requests

class TbSpider(scrapy.Spider):

    name = 'tb'

    allowed_domains = ['tieba.baidu.com']

    start_urls = ['http://tieba.baidu.com/mo/q----,sz@320_240-1-3---2/m?kw=%E6%9D%8E%E6%AF%85&lp=9001']

    def parse(self, response):

        #根据帖子进行分组

        div_list = response.xpath("//div[contains(@class,'i')]")

        for div in div_list:

            item = {}

            item["href"] = div.xpath("./a/@href").extract_first()

            item["title"] = div.xpath("./a/text()").extract_first()

            item["img_list"] = []

            if item["href"] is not None:

                item["href"] = urllib.parse.urljoin(response.url,item["href"])

                yield scrapy.Request(

                    item["href"],

                    callback=self.parse_detail,

                    meta = {"item":item}

                )

        #列表页的翻页

        next_url = response.xpath("//a[text()='下一页']/@href").extract_first()

        if next_url is not None:

            next_url = urllib.parse.urljoin(response.url,next_url)

            yield scrapy.Request(

                next_url,

                callback=self.parse,

            )

    def parse_detail(self,response):

        item = response.meta["item"]

        # if "img_list" not in item:

        #item["img_list"] = response.xpath("//img[@class='BDE_Image']/@src").extract()

        # else:

       item["img_list"].extend(response.xpath("//img[@class='BDE_Image']/@src").extract())

        next_url = response.xpath("//a[text()='下一页']/@href").extract_first()

        if next_url is not None:  #表示由下一页

            next_url = urllib.parse.urljoin(response.url,next_url)

            yield  scrapy.Request(

                next_url,

                callback=self.parse_detail,

                meta={"item":item}

            )

        else:

            item["img_list"] = [requests.utils.unquote(i).split("src=")[-1] for i in item["img_list"]]

            print(item)

            # yield item

11scrapy的更多相关文章

  1. 11-scrapy(递归解析,post请求,日志等级,请求传参)

    一.递归解析: 需求:将投诉_阳光热线问政平台中的投诉标题和状态网友以及时间爬取下来永久储存在数据库中 url:http://wz.sun0769.com/index.php/question/que ...

随机推荐

  1. vector中插入pair

    我们知道map和multimap的作用,这两种数据类型在存储数据时,会根据pair<>的first成员进行排序,不同的时前者将不会插入对first成员重复的结构,后者可以.那如果我们只想存 ...

  2. csacademy Round #36(模拟+最坏情况)

    传送门 题意 给出n种袜子,每种袜子个数a[i],两只相同种类袜子配成一对,询问至少拿出多少只袜子能确保配出k对袜子 分析 In order to find out the minimum numbe ...

  3. 二分优化的lis

    /*此题为一个女大佬教我的,%%%%%%%%%%%%*/ 题目描述 给出1-n的两个排列P1和P2,求它们的最长公共子序列. 输入输出格式 输入格式: 第一行是一个数n, 接下来两行,每行为n个数,为 ...

  4. tyvj 1391 走廊泼水节【最小生成树】By cellur925

    题目传送门 题意简化:给你一棵树,要求你加边使它成为完全图(任意两点间均有一边相连) ,满足原来的树是这个图的最小生成树.求加边的价值最小是多少. 考虑Kruskal的过程,我们每次找一条最短的,两边 ...

  5. jQuery笔记之遍历索引(补充)

    遍历索引的相关方法: .each() .补充.children() .index() --------------------------------------------------------- ...

  6. [洛谷p2858] 奶牛零食

    题目链接: 点我 题目分析: 这是什么,区间dp吗?怎么大佬都在说区间dp的样子 完蛋区间dp都不知道是啥quq 于是使用了玄学的姿势A过了这道题 设dp[i][j][0]表示第i天,左边选了j个,当 ...

  7. 1-17finally关键字

    finally的特点 被finally控制的语句体一定会执行,除非在执行finally语句体之前JVM退出(比如System.exit(0)),一般用于关闭资源 finally如何使用? finall ...

  8. Win7系统出现提示: “Windows已遇到关键问题,将在一分钟后自动重新启动。”

    1. 若用户在使用Win7系统时,遇到上述系统故障,建议重启电脑.等电脑开机自检一过,马上按键盘上的F8键,选择进入安全模式.在安全模式下,进行系统还原.其他的解决方法见下. 1.或者,在安全模式下, ...

  9. Android小玩意儿-- 从头开发一个正经的MusicPlayer(三)

    MusicService已经能够接收广播,通过广播接收的内容来做出相应的MediaPlayer对象的处理,包括播放,暂停,停止等,并当MediaPlayer对象的生命周期发生变化的时候,同样通过发送广 ...

  10. linux系统中文件的几种类型

    Linux系统是以文件的形式来进行管理的.Linux文件类型常见的有:普通文件.目录.字符设备文件.块设备文件.符号链接文件等,如果想了解这方面知识的弟兄,就进来了解了解. Linux系统不同于win ...