今天我们使用scrapy给大家一个lsp的网站,真的超级简单
保证看完之后你也可以~~
scrapy框架介绍
scrapy是由Python语言开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。
scrapy框架的传送门:
https://scrapy.org
scrapy框架运行原理
Scrapy Engine(引擎):负者Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据转递等。
Scheduler(调度器) :它负责接受引擊发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。
Downloader (下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的
Responses交还给Scrapy Engine(引擎) ,由引擎交给Spider来处理。
Spider :它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器)。
Item Pipeline(管道) :它负责处理Spider 中获取到的Item ,并进行进行后期处理(详细分析、过滤、存储等)的地方。
Downloader Middlewares (下载中间件) : 你可以当作是一个可以自定义扩 展下载功能的组件。
Spider Middlewares (Spider中间件) : 你可以理解为是一个可以自定扩展和操作引擎和Spider中间通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests )
Scrapy步骤
新建项目 (scrapy startproject xxx):新建一个新的项目
明确目标 (编写items.py):明确你想要抓取的目标
制作(spiders/xxspider.py):制作开始网页
存储内容 (pipelines.py):设计管道存储内容
今天我们就以小姐姐为例,带大家亲自体验一下scrapy的强大之处!
创建spider项目
首先我们来看看scrapy的常用命令:
scrapy startproject 项目名称 # 创建一个爬虫项目或工程 scrapy genspider 爬虫名 域名 # 在项目下创建一个爬虫spider类 scrapy runspider 爬虫文件 #运行一个爬虫spider类 scrapy list # 查看当前项目有多少个爬虫 scrapy crawl 爬虫名称 # 通过名称指定运行爬取信息 scrapy shell url/文件名 # 使用shell进入scrapy交互环境
第一步我们创建一个scrapy工程, 进入到你指定的目录下,使用命令:
scrapy startproject 项目名称 # 创建一个爬虫项目或工程
当我们创建完项目之后,它会有提示,那么我们就按照它的提示继续操作。
You can start your first spider with: cd xiaojiejei scrapy genspider example example.com
当你按照上面的操作,之后你就会发现,在spiders文件夹下就会出现spider_xiaojiejie.py
这个文件。这个就是我们的文件。
后面的 kanxiaojiejie.com/ 就是我们要的目标网站
BliBli |—— BliBli | |—— __init__.py | |—— __pycache__. | |—— items.py # Item定义,定义抓取的数据结构 | |—— middlewares.py # 定义Spider和Dowmloader和Middlewares中间件实现 | |—— pipelines.py # 它定义Item Pipeline的实现,即定义数据管道 | |—— settings.py # 它定义项目的全局配置 | |__ spiders # 其中包含一个个Spider的实现,每个Spider都有一个文件 |—— __init__.py |—— spider_bl.py # 爬虫实现 |—— __pycache__ |—— scrapy.cfg # scrapy部署时的配置文件,定义了配置文件的路径、部署相关的信息内容。
接下来我们来看看我是如何得到这些小姐姐美照的?
确定目标
打开美女网站。我们要获取的目标就两个,美女的照片和标题。
网站分析
我们F12打开浏览器开发者模式,这种静态网站分析起来还是很简单的,因为所有的目标资源都可以在源码中找得到。
可以看见所有的小姐姐信息都存储在一个div标签中,
每一个小姐姐的照片都存储在div标签下的article标签中,
分析至此,接下来就可以上代码了
请求发送
接下来我们在item.py设置我们要抓取的目标信息,前面已经提到过,
就小姐姐照片和一个时间标题
接下来我们在item.py设置我们要抓取的目标信息,前面已经提到过, 就小姐姐照片和一个时间标题 cl
首先我们使用最简单的xpath来获取下载链接如下(可以借助插件很简单):
同理获取到时间标题链接
数据获取
定个小目标,先来获取2000张
然后我们在我们创建的spider_xiaojiejiel.py文件中写我们爬虫函数的具体实现
然后使用yield将数据流向管道文件pipelines中。
class SpiderXiaojiejieSpider(scrapy.Spider): name = 'spider_xiaojiejie' allowed_domains = ['kanxiaojiejie.com/'] start_urls = ['http://kanxiaojiejie.com//'] def start_requests(self): for page in range(1, 500+1): url = f'https://www.kanxiaojiejie.com/page/{page}' yield scrapy.Request(url=url, callback=self.parse) def parse(self, response): item = XiaojiejieItem() # 获取当前页面所有小姐姐信息 divs = response.xpath('//*[@id="masonry"]/article') # 提取小姐姐照片和标题 for div in divs: item['upload_times'] = div.xpath("./div[@class='masonry-inner']/h2[@class='entry-title']/a/text()").get() item['pictures'] = div.xpath("./div[@class='masonry-inner']/div[@class='entry-top']/a[@class='entry-thumbnail']/img[@class='attachment-gridzone-medium-h size-gridzone-medium-h wp-post-image']/@src").get() yield item # 将获取到的数据抛给pipeline下载
成功获取到我们所需数据部分截图下如下:
图片下载
在上一步我们将获取到的数据抛给了pipeline,
所以这一步我们就在pipeline中将数据下载下来,如下:
class XiaojiejiePipeline: def process_item(self, item, spider): print(item) # 创建文件夹 if not os.path.exists('images'): os.mkdir('images') # 保存图片到本地 with open('images/{}.jpg'.format(item['upload_times']), 'wb') as f: req = requests.get(item['pictures']) f.write(req.content) time.sleep(random.random() * 2) # 防止网站反爬加上延时处理 return item
各位看官还满意吗?