Scrapy实战

代码:

Spider

import scrapy
from urllib.parse import urljoin
from scrapy import Request

class JiaSpider(scrapy.Spider):
    name = "jia"
    allowed_domains = ["desk.zol.com.cn"]
    start_urls = ["https://desk.zol.com.cn/dongman/"]

    def parse(self, resp,**kwargs):
        #hrefs 为Selector形式,获取内容,用extract()
        hrefs = resp.xpath("//ul[@class='pic-list2  clearfix']/li/a/@href").extract()
        for href in hrefs:
            #屏蔽掉,exe结尾的
            if href.endswith('.exe'):#如果href以.exe结尾。就过滤掉
                continue
            else:

                # href = "https://desk.zol.com.cn/"+href
                # print(href)
                # clild_url = resp.urljoin(href)
                # print(clild_url)
                clild_url = urljoin(resp.url,href)
                #print(clild_url)
                #再次发送新的请求   所有的请求,必须经过引擎,交给调度器。然后反馈给引擎然后走下载器
                #再次发送请求,回来如果没有其他参数就会调用parse方法,回来就去执行,callback的函数·················
                yield Request(clild_url,callback=self.parse2)#回调函数。
    def parse2(self, resp, **kwargs):
        #详情页
        img = resp.xpath("//img[@id='bigImg']/@src").extract_first()
        print(img)
        yield {
            "src":img
        }

Pipelines:

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html


# useful for handling different item types with a single interface
from itemadapter import ItemAdapter
from scrapy.pipelines.images import ImagesPipeline#处理图片
from scrapy.pipelines.files import FilesPipeline#直接下载
from scrapy import Request
# class TupianPipeline:
#     def process_item(self, item, spider):
#         return item

class TupianPipeline(ImagesPipeline):

    def get_media_requests(self,item,info):
        src = item['src']
        yield Request(src,meta={"dizhi":src})
        # for s in src:
        #     #请求对象传值的最佳方案:meta
        #   yield Request(s,meta={"dizhi":src})#发送请求

    #scrapy 帮我们完成路径的处理  ,返回文件的路径(src)
    def file_path(self,request,response=None,info=None,*,item=None):
        dizhi = request.meta['dizhi']
        file_name = dizhi.split("/")[-1]
        return f"olie/guang/fengjun/guant/liejun/{file_name}.jpg"

    #数据的结束,收尾工作
    def item_completed(self,results,item,info):
        return item

Settings:

 

 Runner:

from scrapy.cmdline import execute

if __name__=="__main__":
    execute("scrapy crawl jia".split())

 将会加载图片

Spider中的思路

    def parse(self, resp,**kwargs):
        #hrefs 为Selector形式,获取内容,用extract()
        hrefs = resp.xpath("//ul[@class='pic-list2  clearfix']/li/a/@href").extract()
        for href in hrefs:
            #屏蔽掉,exe结尾的
            if href.endswith('.exe'):#如果href以.exe结尾。就过滤掉
                continue
            else:

                # href = "https://desk.zol.com.cn/"+href
                # print(href)
                # clild_url = resp.urljoin(href)
                # print(clild_url)
                clild_url = urljoin(resp.url,href)
                #print(clild_url)
                #再次发送新的请求   所有的请求,必须经过引擎,交给调度器。然后反馈给引擎然后走下载器
                #再次发送请求,回来如果没有其他参数就会调用parse方法,回来就去执行,callback的函数·················
                yield Request(clild_url,callback=self.parse2)#回调函数。

1.获得的内容,xpath将他解开,找到,东西后,extract()解析,因为直接获取的是Selector形式的

2.然后,得到的里面有.exe结尾的广告。将他屏蔽掉。

这里有三种,网址拼接方式。
传统的
1. # href = "https://desk.zol.com.cn/"+href
                # print(href)
这个是scrapy自带的
2.# clild_url = resp.urljoin(href)
       # print(clild_url)
这个是导入包
from urllib.parse import urljoin

3。clild_url = urljoin(resp.url,href)
 print(clild_url)

3.然后需要再次发送请求,第二个网址。这里会用到回调函数。

yield Request(clild_url,callback=self.parse2)#回调函数。

4.然后进入下一个爬虫:

    def parse2(self, resp, **kwargs):
        #详情页
        img = resp.xpath("//img[@id='bigImg']/@src").extract_first()
        print(img)
        yield {
            "src":img
        }

 然后字典返回数据到,管道。

这个得到的数据就是,图片的url

5.在Pipelines中会请求,图片的url然后,保存它

  for s in src:
             #请求对象传值的最佳方案:meta
           yield Request(s,meta={"dizhi":src})#发送请求
#scrapy 帮我们完成路径的处理  ,返回文件的路径(src)

6.

请求url得到图片

然后用 Split分割,得到最后一个,作为名字。

 #scrapy 帮我们完成路径的处理  ,返回文件的路径(src)
    def file_path(self,request,response=None,info=None,*,item=None):
        dizhi = request.meta['dizhi']
        file_name = dizhi.split("/")[-1]
        return f"olie/guang/fengjun/guant/liejun/{file_name}.jpg"

    #数据的结束,收尾工作
    def item_completed(self,results,item,info):
        return item

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值