首页 > 代码库 > python_爬校花

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_new\img\message_girls.text‘, ‘a+‘, encoding=‘utf-8‘) as f_girls:
                    f_girls.write(message_girls)

                # 下载图片
                img_path = os.path.join(‘E:\scrapy_new\img‘, 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目录下敲入命令)

python_爬校花