本文来源吾爱破解论坛
Python--scrapy框架爬虫实战
准备工作
python3开发环境相应的python包:
[Python] 纯文本查看 复制代码
import scrapy from PhotoSpider.items import PhotospiderItem import re from urllib.request import *
貌似都是自带的包,不需要另外安装开发环境: 这里使用的是pycharm谷歌浏览器:用于抓包分析(其他浏览器也可以)
分析网页结构
网站:https://www.mn52.com/ mn52图库网 (正规!正规!)
这个网站是一个图片网站,内容基本都是图片,分类有很多,因为网页结构都是一样的,所以我这里选取了头像集这个分类进行分析(办公室环境,美女图什么就算了)
头像集:https://www.mn52.com/txj/
首先嘛,是分析图片的url组成,想获取最终的的图片url需要先从头像集页面那 4 * 7 组图片点击一个进去就到图片详情页了,这时候就可以用检查代码看到具体图片的url了
那么,思路就是进入初始url : https://www.mn52.com/txj/ → 爬取到 4 * 7 个详情页面的url → 进入到对应图片详情页 → 爬取到详情页内那一排的原图url → 下载
咳咳,那么,下面就是开始框架的安装了。。。
scrapy 框架安装
首先打开 cmd,然后 cd 到python的工作目录,输入项目名为 PhotoSpider 的命令(名字什么的当然可以自己定了)
[Python] 纯文本查看 复制代码
scrapy startproject PhotoSpider
然后这时候在目录下会出现一个 PhotoSpider 文件夹,这时候我们还要继续在 cmd 上操作,输入以下代码创建 Spider类
[Asm] 纯文本查看 复制代码
cd PhotoSpider scrapy genspider getPhotoSpider mn52.com
getPhotoSpider 将是我们运行框架的关键,这里所有的文件已经创建完成,现在就是做填空啦~
完整代码
首先填的是 items.py 用来定义想获得的属性
[Python] 纯文本查看 复制代码
import scrapy class PhotospiderItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() # 跟着上面填就是了 # 图片名 photo_id = scrapy.Field() # 图片下载地址 photo_url = scrapy.Field()
接着就是最最重要的 getPhotoSpider.py 获取页面信息并过滤出想要的
[Python] 纯文本查看 复制代码
# -*- coding: utf-8 -*- import scrapy from PhotoSpider.items import PhotospiderItem import re class GetphotospiderSpider(scrapy.Spider): name = 'getPhotoSpider' allowed_domains = ['mn52.com'] start_urls = ['https://www.mn52.com/txj/'] # 这里填写头像集的url,当然,可以将txj改成你想要的分类 # 添加__init__函数用于存放页数 def __init__(self): self.page_index = 1 def parse(self, response): # 填空题开始了!!从这里xpath在start_urls上获取的消息,过滤出url for photo in response.xpath('//div[@class="content"]/div[2]/div'): url = photo.xpath('./div/a/@href').extract_first() # 这里要给url加上https,否则会。。无法访问 url_new = 'https:' + url # 将新的url甩给下面的函数,也就是爬取下级页面信息~ yield scrapy.Request(url_new, callback=self.parse_detail, dont_filter=True) def parse_detail(self, response): # 过滤从上面丢下来的信息,得到photo_url,也就是真实的图片下载链接 for photos in response.xpath('//div[@id="originalpic"]/img'): # 这个是正则表达式,用来筛选出//image.mn52.com/img/allimg/190906/8-1ZZ6094322-53.jpg中的8-1ZZ6094322-53 pattern = '\w*?\-\w+' # 这个 PhotospiderItem 是用来存放的,在items.py里面 item = PhotospiderItem() item['photo_url'] = photos.xpath('./@src').extract_first() item['photo_id'] = re.search(pattern, item['photo_url']).group() yield item # 这是用来执行下一页的 self.page_index += 1 # 下面的12代表第十二个分类(头像集),修改分类的时候需要同时将这个12一起修改(比如爬取美食图片要将12改成10) next_link = 'https://www.mn52.com/mstp/list_12_' + str(self.page_index) + '.html' yield scrapy.Request(next_link, callback=self.parse)
emmmm,然后就是处理页 pipelines.py 这里是用来将下载图片
[Python] 纯文本查看 复制代码
# -*- coding: utf-8 -*- # Define your item pipelines here # # Don't forget to add your pipeline to the ITEM_PIPELINES setting # See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html from urllib.request import * class PhotospiderPipeline(object): def process_item(self, item, spider): print('--------------' + item['photo_id']) # 对下载地址加https,不然又无法访问 real_url ='https:' + item['photo_url'] # 这里是加信息头(反反爬),本来是在中间件中加的,但是可能是二级跳转的原因,没效果,所以就直接在这里加了 opener = build_opener() opener.addheaders = [('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1941.0 Safari/537.36')] install_opener(opener) print('开始下载' + real_url) # 下载到项目环境目录下的文件夹images中 with urlopen(real_url) as result: data = result.read() # 这是文件命名方式,嫌麻烦,统一用jpg格式命名了。。 with open("images/" + item['photo_id'] + '.jpg', 'wb+') as f: f.write(data) print('下载完成')
这边填空题基本已经做完啦~~,下面修改一下分配器 settings.py 分配下任务哦~(可能被# 备注了,去掉#就好了,后面300多少随意,只是个执行顺序)
[Python] 纯文本查看 复制代码
ITEM_PIPELINES = { 'PhotoSpider.pipelines.PhotospiderPipeline': 300, }
代码写完了。。。。。
别忘了在PhotoSpider项目目录下创建images文件夹,也就是E:\PycharmProjects\xxxxx\PhotoSpider下
最最最后,也就是最最最关键的当然是运行啦,打开 cmd 运行,cd 到项目目录下,跟上面的目录一样,运行代码
[Python] 纯文本查看 复制代码
scrapy crawl getPhotoSpider
效果如下
大功告成~
待改进的地方
每次爬取新的分类都需要对getPhotoSpider.py 里面的 start_urls 和 next_link 进行修改
当然,也可以对项目打包成 .exe ,具体流程百度比我牛逼多了,这里就不打包了
后记
详细思路可以去 美女图片爬虫实战--轻松爬取几万张美女图片 他写的比我细节多了
下载图片文件夹示例.png (36.46 KB, 下载次数: 0)
下载附件 保存到相册
2019-11-11 17:50 上传
python示例.png (31.78 KB, 下载次数: 0)
下载附件 保存到相册
2019-11-11 17:48 上传
运行效果图
版权声明:
本站所有资源均为站长或网友整理自互联网或站长购买自互联网,站长无法分辨资源版权出自何处,所以不承担任何版权以及其他问题带来的法律责任,如有侵权或者其他问题请联系站长删除!站长QQ754403226 谢谢。
- 上一篇: 【分享】搜狗ocr识别
- 下一篇: python-requests爬坑解决方案