11scrapy

释放双眼,带上耳机,听听看~!

 

一. Scrapy基础概念

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

二. 操作

1. 基本操作

1)创建一个scrapy项目

scrapy startproject mySpider

2)生成一个爬虫

scrapy genspider itcast \"itcast.cn”

3)提取数据

完善spider,使用xpath等方法

4)保存数据

pipeline中保存数据

2. 完善spdier

11scrapy

11scrapy

3. spdier数据传到pipeline

11scrapy

 

11scrapy

 

4. 使用·pipeline

 11scrapy

11scrapy

 

5. 设置log

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

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

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

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

三. 实行翻页操作

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

 11scrapy

 

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

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

dont_filter:让scrapy不会过滤当前url

四. 定义Item

1.    方法

 11scrapy

 

2.    实例

11scrapy

11scrapy

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

11scrapy

 

五. 深入pipeline

11scrapy

 

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

而close_spider可以做一些收尾工作

六. CrawlSpider

1.    功能

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

2)生成CrawlSpider的命令

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

2.    实例

 11scrapy

rules内的几个参数:

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

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

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

3.    注意点

 11scrapy

 

七. Scrapy模拟登录

1. 携带cookie登录

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

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

 11scrapy

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

不能把cookies放在headers中

2.    使用FormRequest

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

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

 11scrapy

3)示例

 11scrapy

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

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

2) 示例

 11scrapy

 

八. 案例分析

1.    贴吧爬虫

1.1   补充不完整的链接

 11scrapy

 

注意:需要导入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())

 11scrapy

 

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

 

给TA打赏
共{{data.count}}人
人已打赏
站长资讯

linux平台,对线程等待和唤醒操作的封装(涉及pthread_cond_timedwait)

2020-11-9 3:47:04

站长资讯

补习系列(18)-springboot H2 迷你数据库

2020-11-9 3:47:15

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索