代码:
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