栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Day538.scrapy爬虫框架 -python

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Day538.scrapy爬虫框架 -python

scrapy爬虫框架 一、scrapy

scrapy是什么?
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。

安装scrapy

pip install scrapy

1、scrapy项目的创建以及运行 ①创建scrapy项目

终端输入 scrapy startproject 项目名称

②项目组成

③创建爬虫文件

跳转到spiders文件夹

cd 目录名字/目录名字/spiders 

创建爬虫文件.py

scrapy genspider 爬虫名字 网页的域名

# 比如
scrapy genspider achang http://achang.cc

爬虫文件的基本组成:
继承scrapy.Spider类

class BaiduSpider(scrapy.Spider):
    # 爬虫的名字
    name = 'baidu'
    # 运行访问的域名
    allowed_domains = ['www.baidu.com']
    # 起始的url地址,指的是第一次访问的域名
    # start_urls 是在allowed_domains前面添加了'http://'
    #              在allowed_domains后面添加了'/'
    start_urls = ['http://www.baidu.com/']

    # 执行了start_urls之后 执行的方法 方法中的response就是返回的那个对象(相当于response = urllib.request.urlopen)
    def parse(self, response):
        print('阿昌来也')
④运行爬虫文件
scrapy crawl 爬虫名称

# 例如
scrapy crawl achang

注意:应在spiders文件夹内执行


2、scrapy架构组成

3、scrapy工作原理

案例:汽车之家

scrapy genspider carhome car.autohome.com.cn/price/brand-12.html


注掉君子协议

carhome.py:

class CarhomeSpider(scrapy.Spider):
    name = 'carhome'
    allowed_domains = ['https://car.autohome.com.cn/price/brand-12.html']
    start_urls = ['https://car.autohome.com.cn/price/brand-12.html']

    def parse(self, response):
        name_list = response.xpath('//div[@]/a/text()')
        for item in name_list:
            print(item.extract())

二、yield


简要理解:

yield就是 return 返回一个值,并且记住这个返回的位置,下次迭代就从这个位置后(下一行)开始

1、案例: ① 当当网

(1)yield(2).管道封装(3).多条管道下载 (4)多页数据下载

settings.py: 设置项,设置多管道爬取

ITEM_PIPELINES = {
    # 管道可以有很多,那么管道是有优先级的,优先级为0-1000,值小 优先级越高
   'scrapy_dangdang.pipelines.ScrapyDangdangPipeline': 300,
   'scrapy_dangdang.pipelines.DangDangDownloadPipeline': 301,#多条管道
}

pipelines.py :管道,多管道爬取,一个下载对应的json,一个爬取下载对应的图片

import urllib.request

class ScrapyDangdangPipeline:

    # 爬虫开始执行
    def open_spider(self,spider):
        self.fp = open('book.json','a',encoding='utf-8')

    # item就是yield返回的book对象
    def process_item(self, item, spider):
        # 操作文件过于频繁,不推荐
        # with open('book.json','a',encoding='utf-8') as fp:
        #     fp.write(str(item))

        self.fp.write(str(item))

        return item

    # 爬虫结束执行
    def close_spider(self,spider):
        self.fp.close()

# 开启多管道
# 1、定义管道类
# 2、在settings.py开启管道
# 'scrapy_dangdang.pipelines.DangDangDownloadPipeline': 301,#多条管道
class DangDangDownloadPipeline:
    def process_item(self, item, spider):
        filename = './book/'+item.get('name')+'.jpg'
        urllib.request.urlretrieve(url=item.get('src'),filename=filename)
        return item

items.py 用于操作传递的模型(这里是爬取对应的数据)

class ScrapyDangdangItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    # 你要下载的数据都有什么?
    # 图片
    src = scrapy.Field()
    # 书名
    name = scrapy.Field()
    # 价格
    price = scrapy.Field()

dang.py :爬虫主要业务逻辑

import scrapy
from scrapy_dangdang.items import ScrapyDangdangItem


class DangSpider(scrapy.Spider):
    name = 'dang'
    # 如果是多页下载的话,就必须跳转 allowed_domains 的范围,一般情况就写域名
    allowed_domains = ['ategory.dangdang.com']
    start_urls = ['http://category.dangdang.com/cp01.28.02.93.00.00.html']

    base_url = 'http://category.dangdang.com/cp'
    page = 1

    def parse(self, response):
        # 【书写爬虫逻辑】
        print('阿昌-----------来也')
        # pipelines.py 下载数据
        # items.py 定义数据结构
        # src = '//ul[@id="component_59"]/li//img/@src'
        # name = '//ul[@id="component_59"]/li//img/@alt'
        # price = '//ul[@id="component_59"]/li//p[@]/span[@]/text()'
        li_list = response.xpath('//ul[@id="component_59"]/li')
        for item in li_list:
            src = 'http:' + str(item.xpath('.//img/@data-original').extract_first())
            if src:
                src = src
            else:
                src = item.xpath('.//img/@src').extract_first()

            name = item.xpath('.//img/@alt').extract_first()
            price = item.xpath('.//p[@]/span[@]/text()').extract_first()
            # print(src, name, price)

            if src == 'http:None':
                src = 'http://img3m6.ddimg.cn/33/9/20531346-1_b_7.jpg'

            book = ScrapyDangdangItem(src=src, name=name, price=price)

            # yield是迭代器,将封装的book交给pipelines
            yield book

        # 【页码爬取的回调】
        # 每一页爬取的业务逻辑都是一样的,所有只需要修改页码并再次调用即可
        if self.page < 100:
            # 根据对应规律整理出下次回调的url地址
            self.page = self.page + 1
            url = self.base_url + str(self.page) + '-cp01.28.02.93.00.00.html'

            # scrapy.Request 就是get请求
            # url就是请求地址
            # callback就是回调,也就是要执行的函数
            print(url, '我是url回调地址')
            yield scrapy.Request(url=url, callback=self.parse,dont_filter=True)

明天继续!!!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/738979.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号