吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2655|回复: 7
收起左侧

[Python 转载] scrapy框架爬虫实战--轻松下载各种美食美女头像图片

  [复制链接]
梦幻嘟嘟 发表于 2019-11-11 18:05
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

运行效果图

运行效果图

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Py破解群众 发表于 2019-11-11 18:13
python 爬虫 真的很强大啊! 加油。自己好好学习
vethenc 发表于 2019-11-11 18:25
光之继承者 发表于 2019-11-11 19:51
Go语言版本的爬虫很厉害,python语言的这个版本也非常不错,学习了。
 楼主| 梦幻嘟嘟 发表于 2019-11-12 09:25

学爬虫容易营养不良~
mikeee 发表于 2019-11-13 22:20
感谢分享,关注一下
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 18:10

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表