内容简介:此文首发于公众号「brucepk」,欢迎直接去公众号看。上次用两篇文章讲了 Scrapy 爬虫框架和储存数据工具 MongoDB,今天我们用这两个工具完成一个项目。今天要完成的项目的是用 Scrapy 框架爬取煎蛋网妹子图片,这个项目之前用常规方法已经做过一次,为什么这次还要做这个项目呢?
此文首发于公众号「brucepk」,欢迎直接去公众号看。
上次用两篇文章讲了 Scrapy 爬虫框架和储存数据工具 MongoDB,今天我们用这两个 工具 完成一个项目。
今天要完成的项目的是用 Scrapy 框架爬取煎蛋网妹子图片,这个项目之前用常规方法已经做过一次,为什么这次还要做这个项目呢?
1.用不同的方法做同一个项目,学习不同方法的特点。
2.上次用常规方法的写的项目有点小瑕疵,文章中有一处代码的配图用错了。关键字获取的源码中有一个方法因粗心多写了一个参数导致下载图片失败(已修正)。之前上传到 Github 上的代码是正确的。
所以这次还是用这个项目来学习下,咳咳,我们真的是用来学习的。
先放两张爬取的图片来给大家一点学习的动力。
项目环境
语言:Python3
编辑器:Pycharm
首先确保电脑已配置好 Scrapy 框架环境和 MongoDB 环境,不清楚的可参考上两篇文章:
初识爬虫框架 Scrapy
你的爬虫数据储存在哪?MongoDB入门篇
创建 Scrapy 项目
cmd 中通过命令创建 Scrapy 项目。
C:\Windows\System32>F: F:\>cd scrapy F:\scrapy>scrapy startproject meizi New Scrapy project 'meizi', using template directory 'e:\\py3\\lib\\site-packages\\scrapy\\templates\\project', created in: F:\scrapy\meizi You can start your first spider with: cd meizi scrapy genspider example example.com 复制代码
然后基于basic模板创建一个名为的「jiandan」爬虫文件。
F:\scrapy>cd meizi F:\scrapy\meizi>scrapy genspider -t basic jiandan jiandan.net --nolog Created spider 'jiandan' using template 'basic' in module: meizi.spiders.jiandan 复制代码
Scrapy 框架目录结构
items.py 文件
items.py 文件中定义提取的 Item,这里只定义了图片地址 img_url。
import scrapy class MeiziItem(scrapy.Item): img_url = scrapy.Field() 复制代码
jiandan.py 文件
在上面创建的爬虫文件 jiandan.py 中编写爬虫代码提取 Item。煎蛋网是通过 js 加载图片信息的,Scrapy 爬虫框架没有提供页面 js 渲染服务,直接用 requests 我们获取不到信息。两种方法解决此问题。
1.继续用自动化测试库 selenium 提取图片信息,selenium 库的优点是可见即可爬。
2.用 scrapy-splash 库获取。scrapy-splash 安装启动比较繁琐,下次再讲解,我们今天用 selenium 库获取图片信息。
在 jiandan.py 文件中编辑代码,用 selenium 库抓取页面信息并提取图片链接,部分代码如下:
class JiandanSpider(scrapy.Spider): name = 'jiandan' allowed_domains = ['jiandan.net'] url = "http://i.jandan.net/ooxx/page-" page = 1 start_urls = [url + str(page) + "#comments"] def parse(self, response): browser.get(response.url) browser.implicitly_wait(15) a_list = browser.find_elements_by_link_text("[查看原图]") for a in a_list: item = MeiziItem() print(a.get_attribute('href')) item['img_url'] = a.get_attribute('href') # 提取图片链接 yield item if self.page < 38: # 最大页面数,每天可能有变动,可优化 self.page += 1 yield scrapy.Request(self.url + str(self.page) + "#comments", self.parse)复制代码
settings.py 文件
激活 Item Pipeline 组件,需要在 settin.py 文件中配置指定 pipelines 文件,在 settings 中找到 ITEM_PIPELINES,把这部分注释去除。
ITEM_PIPELINES = { 'meizi.pipelines.MeiziPipeline': 300, } 复制代码
pipelines.py 文件
编写 Pipeline 来存储提取到的数据,保存到本地或者保存到 MongoDB 中。
保存到本地
在本地新建好保存图片的路径。
import requests class MeiziPipeline(object): # 保存到本地 count = 1 def process_item(self, item, spider): result = requests.get(item['img_url']) with open("E:\\img\\jiandan\\" + str(self.count) + ".jpg", 'wb') as f: f.write(result.content) f.close() self.count += 1 return item 复制代码
保存到 MongoDB
MongoDB 和 pymongo 参考前面的文章安装好。新建一个 db 文件夹,用来存放 MongoDB 数据库。然后启动 cmd,cd 进入你下载的 MongoDB 解压的路径的 bin 文件,例如我的为 C:\Program Files\MongoDB\Server\3.2\bin,然后输入 mongod --dbpath=E:\db 来启动 MongoDB,打开 MongoDB 可视化工具 Robo 3T。
在 pipelines.py 文件中修改代码如下:
class SaveToMongoPipeline(object): # 将数据保存到mongodb中 def __init__(self, mongo_url, mongo_db): self.mongo_url = mongo_url self.mongo_db = mongo_db def process_item(self, item, spider): data = [{ 'img_url': item['img_url'] }] self.db.image.insert(data) return item def open_spider(self, spider): self.client = pymongo.MongoClient(self.mongo_url) self.db = self.client[self.mongo_db] def close_spider(self): self.client.close() @classmethod def from_crawler(cls, crawler): return cls( mongo_url=crawler.settings.get('MONGO_URL'), mongo_db=crawler.settings.get('MONGO_DB') ) 复制代码
在 settings.py 文件中修改配置 ITEM_PIPELINES 内容,定义 MongoDB 配置信息。
ITEM_PIPELINES = { 'meizi.pipelines.SaveToMongoPipeline': 301 } MONGO_URL = 'mongodb://localhost:27017' MONGO_DB = 'jiandan' 复制代码
但是储存在 MongoDB 中用 Robo 3T 打开只显示图片的链接信息,如何显示图片有待研究。MongoDB 这方面知识点较薄弱,望大佬们赐教!
运行爬虫框架
有两种方法可运行,我用的是第二种。
1. cmd 中输入命令运行
scrapy crawl jiandan 复制代码
2. 在编辑器(我用的是 Pycharm)爬虫项目目录下新建 run_spider.py 文件,输入命令,运行此 py 文件即可启动爬虫框架。
from scrapy.cmdline import execute execute(['scrapy', 'crawl', 'jiandan']) 复制代码
下面是储存在本地的图片。
公众号回复「学习」获取源码和海量图片,源码默认保存图片到本地,保存到 MongoDB 代码已注释掉,可按需求切换。
ps:本来放了照片的,结果某盘不让分享,只好去掉照片,只分享源码了,大家自己动手,丰衣足食哈!
此文章如果对你有点帮忙的话希望大家能多给点支持,关注、点赞、转发对我都是一种鼓励,有什么问题欢迎在后台联系我,也可以在后台加入技术交流群,群里有大神,可以一起交流学习。
(公众号)推荐阅读
python 爬虫爬取煎蛋网妹子图
Python让你的数据生成可视化图形
Python优雅写法,让你工作效率翻2倍
brucepk
欢迎关注我们,一起成长!
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 由一个萌妹子引发的CTF Writeup
- Java 妹子与数据库老头的交流
- Python爬知乎妹子都爱取啥名
- 数据工程师妹子养成手记——数据库篇
- 用 Python 给自己找个合适的妹子
- 推荐一个相当强的 Node.js 全栈妹子
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Just My Type
Simon Garfield / Profile Books / 2010-10-21 / GBP 14.99
What's your type? Suddenly everyone's obsessed with fonts. Whether you're enraged by Ikea's Verdanagate, want to know what the Beach Boys have in common with easy Jet or why it's okay to like Comic Sa......一起来看看 《Just My Type》 这本书的介绍吧!
RGB转16进制工具
RGB HEX 互转工具
HEX HSV 转换工具
HEX HSV 互换工具