python爬虫之Scrapy框架,基本介绍使用以及用框架下载图片案例( 三 )

还可以设置日志的等级与日志存放的路径:
【python爬虫之Scrapy框架,基本介绍使用以及用框架下载图片案例】相关变量
LOG_LEVEL= ""LOG_FILE="日志名.log"日志等级分为,默认等级是1

  1. DEBUG 调试信息
  2. INFO 一般信息
  3. WARNING 警告
  4. ERROR 普通错误
  5. CRITICAL 严重错误
如果设置
LOG_LEVEL="WARNING",就只会WARNING等级之下的ERROR和CRITICAL
一般主要需要配置的几个参数,其他按需配置即可 。
USER_AGENT:默认是注释的,这个东西非常重要,如果不写很容易被判断为电脑爬虫 。
ROBOTSTXT_OBEY:是否遵循机器人协议,默认是true,需要改为false,否则很多东西爬不了
DEFAULT_REQUEST_HEADERS:和USER_AGENT类似,只是参数更完整 。
五、完整案例(下载图片)用scrapy框架下载以前的示例:python爬虫之批量下载图片
1、修改settings.py 主要参数
#关闭robot.txt协议ROBOTSTXT_OBEY = False#页面延迟下载,我这里测试,可以先不设置DOWNLOAD_DELAY = 1# 是否启用CookieCOOKIES_ENABLED = True#请求头 DEFAULT_REQUEST_HEADERS = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Language': 'en','User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36'}#打开下载器DOWNLOADER_MIDDLEWARES = {'ScrapyDemmo.middlewares.ScrapydemmoDownloaderMiddleware': 543,}#打开优先级,并添加自己编写的图片下载管道ITEM_PIPELINES = {'ScrapyDemmo.pipelines.ScrapydemmoPipeline': 300,'ScrapyDemmo.pipelines.ImageDownloadPipeline': 300,}#添加下载储存目录IMAGES_STORE = 'D:Pythonpic'# 文件保存时间#IMAGES_EXPIRES = 902、定义Item字段(Items.py)
本项目用于下载图片,因此可以仅构建图片名和图片地址字段 。
import scrapyclass ScrapydemmoItem(scrapy.Item): #图片下载链接image_url = scrapy.Field()#图片名称image_name = scrapy.Field()3、编写爬虫文件(spiders目录下)
这里文件名为:image_download.py
以前用requests库和BeautifulSoup库下载图片,这里就不需要了,scrapy自带相关函数和方法 。
scrapy元素定位,提供三种方式,正则、Xpath表达式、css 。
我这里有xpath定位方式 。
import scrapyimport refrom ..items import ScrapydemmoItemclass ImageSpider(scrapy.Spider):name = 'image_download'allowed_domains = ['desk.3gbizhi.com']start_urls = ['https://desk.3gbizhi.com/deskMV/index.html']def parse(self, response):#导入Items.py字段items = ScrapydemmoItem()#获取所有链接列表lists = response.xpath('//div[5]/ul/li')#点位元素循环获取图片链接和图片名称for i in lists:#图片名称image_name = i.xpath('./a/img/@alt').get()#图片链接items['image_url'] = i.xpath('./a/img/@*[1]').get().replace('.278.154.jpg', '')#图片格式类型image_type = re.sub(r'h.*d+.', '', items['image_url'])#拼接文件名,图片名称+图片格式items['image_name'] = '{}.{}'.format(image_name, image_type)yielditems#循环跳转下一页,并重复返回数据,这里测试先下载1页的图片,总共23页 。for i in range(2,3):next_url = 'https://desk.3gbizhi.com/deskMV/index_{}.html'.format(i)yield scrapy.Request(next_url,callback=self.parse)关于 yield 的理解,?先,如果你还没有对yield有个初步分认识,那么你先把yield看做“return”,这个是直观的,它?先是个return 。
最主要的不同在于yield在返回值后还可以继续运行接下来的代码,使用的函数会返回一个生成器,而return在返回后就不在执行代码 。
以上两个yield:
  • yield items:这里我们通过 yield 返回的不是 Request 对象,而是一个 ScrapydemmoItem 对象 。scrap有框架获得这个对象之后,会将这个对象传递给 pipelines.py来做进一步处理 。我们将在 pipelines.py里将传递过来的 scrapy.Item 对象保存到数据库里去 。
  • yield scrapy.Request:这里是在爬取完一页的信息后,我们在当前页面获取到了下一页的链接,然后通过 yield 发起请求,并且将 parse 自己作为回调函数来处理下一页的响应 。
4、修改管道文件pipelines.py用于下载图片
除了爬取文本,我们可能还需要下载文件、视频、图片、压缩包等,这也是一些常见的需求 。scrapy提供了FilesPipeline和ImagesPipeline,专门用于下载普通文件及图片 。
继承 Scrapy 内置的 ImagesPipeline,只需要重写get_media_requests 和item_completed函数即可 。


推荐阅读