Python快速开发分布式搜索引擎Scrapy精讲—编写spiders爬虫文件循环抓取内容

编写spiders爬虫文件循环抓取内容

Request()方法,将指定的url地址添加到下载器下载页面,两个必须参数,
  参数:
  url=‘url‘
  callback=页面处理函数
  使用时需要yield Request()

parse.urljoin()方法,是urllib库下的方法,是自动url拼接,如果第二个参数的url地址是相对路径会自动与第一个参数拼接

# -*- coding: utf-8 -*-
import scrapy
from scrapy.http import Request                             #导入url返回给下载器的方法
from urllib import parse                                    #导入urllib库里的parse模块

class PachSpider(scrapy.Spider):
    name = ‘pach‘
    allowed_domains = [‘blog.jobbole.com‘]                  #起始域名
    start_urls = [‘http://blog.jobbole.com/all-posts/‘]     #起始url

    def parse(self, response):
        """
        获取列表页的文章url地址,交给下载器
        """
        #获取当前页文章url
        lb_url = response.xpath(‘//a[@class="archive-title"]/@href‘).extract()  #获取文章列表url
        for i in lb_url:
            # print(parse.urljoin(response.url,i))                                             #urllib库里的parse模块的urljoin()方法,是自动url拼接,如果第二个参数的url地址是相对路径会自动与第一个参数拼接
            yield Request(url=parse.urljoin(response.url, i), callback=self.parse_wzhang)      #将循环到的文章url添加给下载器,下载后交给parse_wzhang回调函数

        #获取下一页列表url,交给下载器,返回给parse函数循环
        x_lb_url = response.xpath(‘//a[@class="next page-numbers"]/@href‘).extract()         #获取下一页文章列表url
        if x_lb_url:
            yield Request(url=parse.urljoin(response.url, x_lb_url[0]), callback=self.parse)     #获取到下一页url返回给下载器,回调给parse函数循环进行

    def parse_wzhang(self,response):
        title = response.xpath(‘//div[@class="entry-header"]/h1/text()‘).extract()           #获取文章标题
        print(title)

如果你依然在编程的世界里迷茫,可以加入我们的Python学习扣qun:784758214,看看前辈们是如何学习的。交流经验。从基础的python脚本到web开发、爬虫、django、数据挖掘等,零基础到项目实战的资料都有整理。送给每一位python的小伙伴!分享一些学习的方法和需要注意的小细节,点击加入我们的 python学习者聚集地

Request()函数在返回url时,同时可以通过meta属性返回一个自定义字典给回调函数

# -*- coding: utf-8 -*-
import scrapy
from scrapy.http import Request                             #导入url返回给下载器的方法
from urllib import parse                                    #导入urllib库里的parse模块
from adc.items import AdcItem                               #导入items数据接收模块的接收类

class PachSpider(scrapy.Spider):
    name = ‘pach‘
    allowed_domains = [‘blog.jobbole.com‘]                  #起始域名
    start_urls = [‘http://blog.jobbole.com/all-posts/‘]     #起始url

    def parse(self, response):
        """
        获取列表页的文章url地址,交给下载器
        """
        #获取当前页文章url
        lb = response.css(‘div .post.floated-thumb‘)  #获取文章列表区块,css选择器
        # print(lb)
        for i in lb:
            lb_url = i.css(‘.archive-title ::attr(href)‘).extract_first(‘‘)     #获取区块里文章url
            # print(lb_url)

            lb_img = i.css(‘.post-thumb img ::attr(src)‘).extract_first(‘‘)     #获取区块里文章缩略图
            # print(lb_img)

            yield Request(url=parse.urljoin(response.url, lb_url), meta={‘lb_img‘:parse.urljoin(response.url, lb_img)}, callback=self.parse_wzhang)      #将循环到的文章url添加给下载器,下载后交给parse_wzhang回调函数

        #获取下一页列表url,交给下载器,返回给parse函数循环
        x_lb_url = response.css(‘.next.page-numbers ::attr(href)‘).extract_first(‘‘)         #获取下一页文章列表url
        if x_lb_url:
            yield Request(url=parse.urljoin(response.url, x_lb_url), callback=self.parse)     #获取到下一页url返回给下载器,回调给parse函数循环进行

    def parse_wzhang(self,response):
        title = response.css(‘.entry-header h1 ::text‘).extract()           #获取文章标题
        # print(title)

        tp_img = response.meta.get(‘lb_img‘, ‘‘)                            #接收meta传过来的值,用get获取防止出错
        # print(tp_img)

        shjjsh = AdcItem()                                                                   #实例化数据接收类
        shjjsh[‘title‘] = title                                                              #将数据传输给items接收模块的指定类
        shjjsh[‘img‘] = tp_img

        yield shjjsh                                #将接收对象返回给pipelines.py处理模块


Scrapy内置图片下载器使用

Scrapy给我们内置了一个图片下载器在crapy.pipelines.images.ImagesPipeline,专门用于将爬虫抓取到图片url后将图片下载到本地

第一步、爬虫抓取图片URL地址后,填充到 items.py文件的容器函数

  爬虫文件

# -*- coding: utf-8 -*-
import scrapy
from scrapy.http import Request                             #导入url返回给下载器的方法
from urllib import parse                                    #导入urllib库里的parse模块
from adc.items import AdcItem                               #导入items数据接收模块的接收类

class PachSpider(scrapy.Spider):
    name = ‘pach‘
    allowed_domains = [‘blog.jobbole.com‘]                  #起始域名
    start_urls = [‘http://blog.jobbole.com/all-posts/‘]     #起始url

    def parse(self, response):
        """
        获取列表页的文章url地址,交给下载器
        """
        #获取当前页文章url
        lb = response.css(‘div .post.floated-thumb‘)  #获取文章列表区块,css选择器
        # print(lb)
        for i in lb:
            lb_url = i.css(‘.archive-title ::attr(href)‘).extract_first(‘‘)     #获取区块里文章url
            # print(lb_url)

            lb_img = i.css(‘.post-thumb img ::attr(src)‘).extract_first(‘‘)     #获取区块里文章缩略图
            # print(lb_img)

            yield Request(url=parse.urljoin(response.url, lb_url), meta={‘lb_img‘:parse.urljoin(response.url, lb_img)}, callback=self.parse_wzhang)      #将循环到的文章url添加给下载器,下载后交给parse_wzhang回调函数

        #获取下一页列表url,交给下载器,返回给parse函数循环
        x_lb_url = response.css(‘.next.page-numbers ::attr(href)‘).extract_first(‘‘)         #获取下一页文章列表url
        if x_lb_url:
            yield Request(url=parse.urljoin(response.url, x_lb_url), callback=self.parse)     #获取到下一页url返回给下载器,回调给parse函数循环进行

    def parse_wzhang(self,response):
        title = response.css(‘.entry-header h1 ::text‘).extract()           #获取文章标题
        # print(title)

        tp_img = response.meta.get(‘lb_img‘, ‘‘)                            #接收meta传过来的值,用get获取防止出错
        # print(tp_img)

        shjjsh = AdcItem()                                                                   #实例化数据接收类
        shjjsh[‘title‘] = title                                                              #将数据传输给items接收模块的指定类
        shjjsh[‘img‘] = [tp_img]

        yield shjjsh                                #将接收对象返回给pipelines.py处理模块

第二步、设置 items.py 文件的容器函数,接收爬虫获取到的数据填充

# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# http://doc.scrapy.org/en/latest/topics/items.html

import scrapy

#items.py,文件是专门用于,接收爬虫获取到的数据信息的,就相当于是容器文件

class AdcItem(scrapy.Item):    #设置爬虫获取到的信息容器类
    title = scrapy.Field()     #接收爬虫获取到的title信息
    img = scrapy.Field()       #接收缩略图
    img_tplj = scrapy.Field()  #图片保存路径

第三步、在pipelines.py使用crapy内置的图片下载器

1、首先引入内置图片下载器

2、自定义一个图片下载内,继承crapy内置的ImagesPipeline图片下载器类

3、使用ImagesPipeline类里的item_completed()方法获取到图片下载后的保存路径

4、在settings.py设置文件里,注册自定义图片下载器类,和设置图片保存路径

# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don‘t forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html
from scrapy.pipelines.images import ImagesPipeline  #导入图片下载器模块

class AdcPipeline(object):                      #定义数据处理类,必须继承object
    def process_item(self, item, spider):       #process_item(item)为数据处理函数,接收一个item,item里就是爬虫最后yield item 来的数据对象
        print(‘文章标题是:‘ + item[‘title‘][0])
        print(‘文章缩略图url是:‘ + item[‘img‘][0])
        print(‘文章缩略图保存路径是:‘ + item[‘img_tplj‘])  #接收图片下载器填充的,图片下载后的路径

        return item

class imgPipeline(ImagesPipeline):                      #自定义一个图片下载内,继承crapy内置的ImagesPipeline图片下载器类
    def item_completed(self, results, item, info):      #使用ImagesPipeline类里的item_completed()方法获取到图片下载后的保存路径
        for ok, value in results:
            img_lj = value[‘path‘]     #接收图片保存路径
            # print(ok)
            item[‘img_tplj‘] = img_lj  #将图片保存路径填充到items.py里的字段里
        return item                    #将item给items.py 文件的容器函数

    #注意:自定义图片下载器设置好后,需要在

在settings.py设置文件里,注册自定义图片下载器类,和设置图片保存路径

IMAGES_URLS_FIELD 设置要下载图片的url地址,一般设置的items.py里接收的字段
IMAGES_STORE 设置图片保存路径

在学习过程中有什么不懂得可以加我的
python学习交流扣扣qun,784758214
群里有不错的学习视频教程、开发工具与电子书籍。
与你分享python企业当下人才需求及怎么从零基础学习好python,和学习什么内容
# Configure item pipelines
# See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
   ‘adc.pipelines.AdcPipeline‘: 300,  #注册adc.pipelines.AdcPipeline类,后面一个数字参数表示执行等级,
   ‘adc.pipelines.imgPipeline‘: 1,    #注册自定义图片下载器,数值越小,越优先执行
}

IMAGES_URLS_FIELD = ‘img‘                             #设置要下载图片的url字段,就是图片在items.py里的字段里
lujin = os.path.abspath(os.path.dirname(__file__))
IMAGES_STORE = os.path.join(lujin, ‘img‘)             #设置图片保存路径

原文地址:https://blog.51cto.com/14510224/2435509

时间: 2024-08-16 10:05:29

Python快速开发分布式搜索引擎Scrapy精讲—编写spiders爬虫文件循环抓取内容的相关文章

第三百四十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—编写spiders爬虫文件循环抓取内容—

第三百四十一节,Python分布式爬虫打造搜索引擎Scrapy精讲-编写spiders爬虫文件循环抓取内容- 编写spiders爬虫文件循环抓取内容 Request()方法,将指定的url地址添加到下载器下载页面,两个必须参数, 参数: url='url' callback=页面处理函数 使用时需要yield Request() parse.urljoin()方法,是urllib库下的方法,是自动url拼接,如果第二个参数的url地址是相对路径会自动与第一个参数拼接 # -*- coding:

Python快速开发分布式搜索引擎Scrapy精讲—scrapy模拟登陆和知乎倒立文字验证码识别

第一步.首先下载,大神者也的倒立文字验证码识别程序 下载地址:https://github.com/muchrooms/... 注意:此程序依赖以下模块包 Keras==2.0.1 Pillow==3.4.2 jupyter==1.0.0 matplotlib==1.5.3 numpy==1.12.1 scikit-learn==0.18.1 tensorflow==1.0.1 h5py==2.6.0 numpy-1.13.1+mkl 我们用豆瓣园来加速安以上依赖装如: pip install

Python快速开发分布式搜索引擎Scrapy精讲—css选择器

css选择器 1. 2. 3. ::attr()获取元素属性,css选择器 ::text获取标签文本 如果你依然在编程的世界里迷茫,可以加入我们的Python学习扣qun:784758214,看看前辈们是如何学习的.交流经验.从基础的python脚本到web开发.爬虫.django.数据挖掘等,零基础到项目实战的资料都有整理.送给每一位python的小伙伴!分享一些学习的方法和需要注意的小细节,点击加入我们的 python学习者聚集地 举例: extract_first('')获取过滤后的数据,

Python快速开发分布式搜索引擎Scrapy精讲—爬虫数据保存

注意:数据保存的操作都是在pipelines.py文件里操作的 将数据保存为json文件 spider是一个信号检测 # -*- coding: utf-8 -*- # Define your item pipelines here # # Don't forget to add your pipeline to the ITEM_PIPELINES setting # See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html

第三百六十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的查询

第三百六十五节,Python分布式爬虫打造搜索引擎Scrapy精讲-elasticsearch(搜索引擎)的查询 elasticsearch(搜索引擎)的查询 elasticsearch是功能非常强大的搜索引擎,使用它的目的就是为了快速的查询到需要的数据 查询分类: 基本查询:使用elasticsearch内置的查询条件进行查询 组合查询:把多个查询条件组合在一起进行复合查询 过滤:查询同时,通过filter条件在不影响打分的情况下筛选数据

第三百六十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的mapping映射管理

第三百六十四节,Python分布式爬虫打造搜索引擎Scrapy精讲-elasticsearch(搜索引擎)的mapping映射管理 1.映射(mapping)介绍 映射:创建索引的时候,可以预先定义字段的类型以及相关属性elasticsearch会根据json源数据的基础类型猜测你想要的字段映射,将输入的数据转换成可搜索的索引项,mapping就是我们自己定义的字段数据类型,同时告诉elasticsearch如何索引数据以及是否可以被搜索 作用:会让索引建立的更加细致和完善 类型:静态映射和动态

第三百七十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现我的搜索以及热门搜索

第三百七十一节,Python分布式爬虫打造搜索引擎Scrapy精讲-elasticsearch(搜索引擎)用Django实现我的搜索以及热门 我的搜素简单实现原理我们可以用js来实现,首先用js获取到输入的搜索词设置一个数组里存放搜素词,判断搜索词在数组里是否存在如果存在删除原来的词,重新将新词放在数组最前面如果不存在直接将新词放在数组最前面即可,然后循环数组显示结果即可 热门搜索实现原理,当用户搜索一个词时,可以保存到数据库,然后记录搜索次数,利用redis缓存搜索次数最到的词,过一段时间更新

第三百七十节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索结果分页

第三百七十节,Python分布式爬虫打造搜索引擎Scrapy精讲-elasticsearch(搜索引擎)用Django实现搜索结果分页 逻辑处理函数 计算搜索耗时 在开始搜索前:start_time = datetime.now()获取当前时间 在搜索结束后:end_time = datetime.now()获取当前时间 last_time = (end_time-start_time).total_seconds()结束时间减去开始时间等于用时,转换成秒 from django.shortcu

第三百六十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索的自动补全功能

第三百六十八节,Python分布式爬虫打造搜索引擎Scrapy精讲-用Django实现搜索的自动补全功能 elasticsearch(搜索引擎)提供了自动补全接口 官方说明:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-suggesters-completion.html 创建自动补全字段 自动补全需要用到一个字段名称为suggest类型为Completion类型的一个字段 所以我们需要用