代码:
Spider
import scrapy
from urllib.parse import urljoin
from scrapy import Requestclass 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结尾。就过滤掉continueelse:# 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 itemclass 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 executeif __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结尾。就过滤掉continueelse:# 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 urljoin3。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:#请求对象传值的最佳方案:metayield 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