今天我们使用scrapy给大家爬取一个lsp的网站,真的超级简单scrapy是由Python语言开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。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的强大之处!
首先我们来看看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 这个文件。这个就是我们的爬虫文件。 后面的 / 就是我们要爬取的目标网站
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设置我们要抓取的目标信息,前面已经提到过, 就小姐姐照片和一个时间标题 class XiaojiejieItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field()
# 上传时间 upload_times = scrapy.Field() # 照片链接 pictures = scrapy.Field()
首先我们使用最简单的xpath来获取下载链接如下(可以借助插件很简单): 同理获取到时间标题链接 数据获取 定个小目标,先来获取2000张 然后我们在我们创建的spider_xiaojiejiel.py文件中写我们爬虫函数的具体实现 然后使用yield将数据流向管道文件pipelines中。 class SpiderXiaojiejieSpider(scrapy.Spider): name = 'spider_xiaojiejie' allowed_domains = ['/'] start_urls = ['http:////']
def start_requests(self): for page in range(1, 500+1): url = f'https://www./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
接下来就是欣赏小姐姐美照的时候啦~
各位看官还满意吗?
回顾: 高级爬虫(三):使用Scrapy爬取拉勾网数据并写入数据库
高级爬虫(二):Scrapy爬虫框架初探 高级爬虫(一):Scrapy爬虫框架的安装
|