1.scrapy框架的简述
高性能,高层次的web数据提取框架;
2.使用框架
# 框架创建完成的展示
2.1 框架的创建
首先需要导入对应的第三方模块:pip install scrapy
创建爬虫项目文件:
scrapy startproject woyaogexing # 创建项目 woyaogexing 可以自己命名
先 cd woyaogexing 到文件目录下,创建爬虫文件
scrapy genspider gexing www.woyaogexing.com # gexing 爬虫文件名,目标网站
3.框架执行
scrapy crawl gexing # 控制台执行
当然如果想在python文件中执行程序
new main.py
内容如下:
from scrapy.cmdline import execute if __name__ == '__main__': execute('scrapy crawl gexing'.split())
4.settings文件介绍
ROBOTSTXT_OBEY = True # robot协议,无法获取内容需要改成False
LOG_LEVEL = 'ERROR' # 日志太多不好看获取的信息,设置日志级别
5.爬虫文件编写
1.分析页面元素,提取想要的内容[这里想要获取的是图片]
源代码中搜索:lazy
或者在控制台搜索lazy,为什么,因为框架获取的就是源代码:
通过在获取的源代码中搜索无法搜索想要的内容:
原因分析:
1.当前网页发现了我这个爬虫:
前往middlewares.py文件下项目文件名+DownloaderMiddleware
找到process_request的类方法,打印headers
配置文件中打开中间件相关配置,如下:
user-agent使用的是scrapy的,我们将他修改成浏览器的user-agent:
这里有两种修改方式:
1.直接打开浏览器的f12下的网络,点击一个api复制一个user-agent到配置文件中
2.直接在刚刚的middlewares下的process_request类方法中设置headers:
设置完成对应的headers后再进行搜索:
发现还是没有;
2.检查请求的链接和分析的链接是否一致:
通过对比发现请求的不是分析的地址,修改此链接地址或者使用
start_requests方法进行链接构造:
修改完成后,在进行搜索
发现和分析网页的元素一致;
编写爬虫文件,提取指定的图片和图片名称:
存储图片需要:图片的名称加上后缀名,例如:a.jpg
通过分析网页发现图片没有对应的协议,需要再链接前面拼接http/https
6.将对应的内容以scrapy对应的存储方式进行存储
在items按照对应的模板给需要存储的内容使用scrapy对象定义字段
再到spider爬虫文件中导入items下的类
再将对应的内容返回:在编写的爬虫文件中的类方法parse中添加
yield item
7.下载图片
在对应的pipeline的文件下继承image的pipeline
from scrapy.pipelines.images import ImagesPipeline import scrapy
使用对应的:
def get_media_requests(self, item, info): 发送请求,下载图片 yield scrapy.Request(url=item['image_url'], meta={'name': item['image_name']})
def file_path(self, request, response=None, info=None): 修改文件名与保存路径 return request.meta['name']
def item_completed(self, results, item, info): 查看存储结果 print(results) return results
在对应settings文件中打开:
IMAGES_STORE:scrapy框架下图片存储路径的配置参数
8.执行结果
记录scrapy分布式的配置参数
settings配置文件改写如下: # 替换 SHCEDULER,使用scrapy_redis进行任务分发与调度 SCHEDULER = 'scrapy_redis.scheduler.Scheduler' # 使用 scrapy_redis 去重队列: DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter' # 使用 ‘优先级队列’进行爬虫调度,即各个主机获取请求的先后次序: # SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.SpiderPriorityQueue' # 在 redis 中保持 scrapy-redis 用到的各个队列,从而允许暂停和暂停后恢复 SCHEDULER_PERSIST = True # 持久化 REDIS_HOST = '127.0.0.1' # redis主机 REDIS_PORT = 6379 # redis端口 REDIS_ENCODING = "utf-8" ITEM_PIPELINES = { 'scrapy_redis.pipelines.RedisPipeline': 200, 'Gushici_Scrapy.pipelines.GushiciScrapyPipeline': 300, }
spider爬虫文件改写:
from scrapy_redis.spiders import RedisSpider # 继承redis的spider class spider(RedisSpider): # start_urls = ['https://目标域名/'] redis_key = '建立的_key'
redis给程序执行网址: lpush redis_key 定义的名称 url 目标网址
结束语
此次分享与回忆学习结束,但愿能帮助到你