• python_爬校花图片


    如何用python爬取校花图片并保存到本地来?

      1. 获取什么数据?

        校花名字  name

        校花所在学校 school

        校花图片的url   img_ulr  

      2.如何获取?

        打开网页http://www.xiaohuar.com/hua/ ,打开开发工具,研究每一张图片对应的html,找规律

        通过python 的scrapy框架进行批量爬取

    环境声明:

      python 3.50

      scrapy 库

    出现了哪些问题?

      1. 如何去除重复的url?

        通过对获取的url 进行md5,进行去重

      2. 如何该网站上所有的校花信息?

        先获取网页上所有的a标签,通过递归去取其他内容

      3. 如何内容永久化?

        写入文件,数据库等,该爬校花图片程序,我选择写入文件保存

    如何创建与逻辑处理?

      1. 新建爬虫项目

        scrapy startproject pa_girls  (通过命令行)

      2. spiders 目录下,建立 一个叫 、school_girls.py文件

        在school_girls.py文件中写入:

    #!/usr/bin/python3
    
    import scrapy
    from scrapy.selector import HtmlXPathSelector
    import hashlib
    # 把item模块添加到环境变量
    from items import Pa1Item
    
    
    # # 最终获取信息列表
    # school_girl = []
    
    # 获得总url,目的去重
    all_urls = {}
    
    
    class SchoolGirls(scrapy.Spider):
        name = 'school_girls'
        # 初始url,依次
        start_urls = [
            'http://www.xiaohuar.com/hua/',
        ]
    
        def parse(self, response):
            # 爬虫主体
            try:
                # 找标签
                hxs = HtmlXPathSelector(response)
                girls = Pa1Item()
                # 获取标签中指定数据
                school = hxs.select('//div[@class="img"]/div[@class="btns"]/a/text()').extract()
                name = hxs.select('//div[@class="img"]/span[@class="price"]/text()').extract()
                img_url = hxs.select('//div[@class="img"]/a/img/@src').extract()
                if school and name and img_url:
                    girls['school'] = hxs.select('//div[@class="img"]/div[@class="btns"]/a/text()').extract()
                    girls['name'] = hxs.select('//div[@class="img"]/span[@class="price"]/text()').extract()
                    girls['img_url'] = hxs.select('//div[@class="img"]/a/img/@src').extract()
                    yield girls
                else:
                    pass
                    #
                # 获取页面的所有连接
                page_urls = hxs.select('//a/@href').extract()
                page_urls.append('http://www.xiaohuar.com/hua/')
                # print(page_urls)
    
                # 进行url去重
                url_list = {}
                for url in page_urls:
                    if url.startswith('JavaScript') or url.startswith('#') or not url:
                        continue
                    else:
                        m = hashlib.md5()
                        m.update(bytes(url, encoding='utf-8'))
                        img_id = m.hexdigest()
                        # 判断是否重复url,重复就不需要再次访问
                        if img_id in all_urls:
                            continue
                        else:
                            all_urls[img_id] = url
                            url_list[img_id] = url
    
    
                # 递归查找该页面所有url
                for url in url_list.values():
                    yield scrapy.Request(url=url, callback=self.parse)
            except Exception as e:
                print(e)

      3. 在 items.py文件中写入

    import scrapy
    
    
    class Pa1Item(scrapy.Item):
        name = scrapy.Field()
        school = scrapy.Field()
        img_url = scrapy.Field()

      4. 在pipelines.py文件中写入

    import os
    import requests
    
    
    class GirlsMessage(object):
        '''获取有效数据'''
        def process_item(self, item, spider):
            for i in range(len(item['name'])):
                if item['name'][i].strip() and item['school'][i].strip() and item['img_url'][i].strip():
    
                    # 把信息写入文件
                    message_girls = item['name'][i] + '_' + item['school'][i] + ':' 
                                    + 'http://www.xiaohuar.com/' + item['img_url'][i]
                    with open('E:scrapy_newimgmessage_girls.text', 'a+', encoding='utf-8') as f_girls:
                        f_girls.write(message_girls)
    
                    # 下载图片
                    img_path = os.path.join('E:scrapy_newimg', item['name'][i] +'_' + item['school'][i] +'.jpg')
                    img_url = 'http://www.xiaohuar.com/' + item['img_url'][i]
                    try:
                        img_date = requests.get(img_url).content
                        with open(img_path, 'bw',) as f_img:
                            f_img.write(img_date)
                            f_img.flush()
                    except Exception as e:
                        print(e)
            return item

      5. 在setting文件中添加

    # 设置爬取深度
    DEPTH_LIMIT = 1
    
    # 激活pipelines中类
    ITEM_PIPELINES = {
        'pa_1.pipelines.GirlsMessage': 200,
    }

    可能会出现哪些问题?

      1. items模块导入不了,如何解决

        在spiders目录下的__init__.py文件中加入:

    import os
    import sys
    sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

     如何启动项目?

      scrapy crawl school_girls (需要在项目下,spiders目录下敲入命令)

  • 相关阅读:
    MySQL
    用python自动复制粘贴excel表里某一列的数据到另一个表中
    python操作excel小试牛刀
    python- 安装扩展包
    15分钟用ppt制作桌面整理四格壁纸
    R-算术运算符
    R-变量
    R-函数/语法-整合版
    MySQL-函数-整合版
    Python_图片对比问题汇总
  • 原文地址:https://www.cnblogs.com/2bjiujiu/p/7192208.html
Copyright © 2020-2023  润新知