Python Show-Me-the-Code 第 0013 题 抓取妹子图片 使用scrapy

第 0013 题: 用 Python 写一个爬图片的程序,爬 这个链接里的日本妹子图片 :-)



完整代码

思路:

其实这个可以不用scrapy,就用正则匹配+request应该就可以完成任务了。我想练习下scrapy,于是就用scrapy做这个了。

这个只要求爬一个网页上的图片,所以也不用写什么follow规则,算是比较简单的。通过分析链接里的妹子图片的标签,发现百度贴吧里发的图片是带BDE_Image这个类的,所以就好办了,直接用xpath把所有img标签中带BDE_Image类的全部提出来,就是所需的图片了,把需要的东西放到item里,然后交给pipeline搞定。

我在pipeline中先判断信息是否齐全,然后检测是否已经下载过这图片,如果是的话就跳过,否则把图片下载下来,为了方便,保存图片后,我还把图片信息(名字,存放路径)存放在mongodb中。

步骤:

生成一个叫baidutieba的scrapy项目:scrapy startproject baidutieba
打开项目文件夹:cd baidutieba
生成一个叫meizi的spider:scrapy genspider meizi baidu.com
然后编写相关代码
运行:scrapy crawl meizi

代码:

spider:

meizi.py

# -*- coding: utf-8 -*-
import scrapy
from scrapy.contrib.spiders import CrawlSpider,Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from baidutieba.items import BaidutiebaItem
from scrapy.selector import Selector
import sys
reload(sys)
sys.setdefaultencoding(‘utf-8‘)

class MeiziSpider(CrawlSpider):
    name = "meizi"
    allowed_domains = ["baidu.com"]
    print "开始爬取妹子图"
    start_urls = (
        ‘http://tieba.baidu.com/p/2166231880‘,
    )

    # 定义parse方法,用来解析
    def parse(self, response):
        # 找出所有类为BDE_Image的图片
        AllImg = Selector(response).xpath(‘//img[@class="BDE_Image"]‘)
        for img in AllImg:
            item = BaidutiebaItem()
            item[‘Img_name‘] = img.xpath(‘@bdwater‘).extract()[0]
            item[‘Img_url‘] = img.xpath(‘@src‘).extract()[0]
            yield item

pipelines.py

# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don‘t forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html

import pymongo
from scrapy.conf import settings
from scrapy.exceptions import DropItem
from scrapy import log
import requests
import os

class ImageDownloadAndMongoDBPipeline(object):

    def __init__(self):
        # 创建mongodb连接
        connection = pymongo.MongoClient(
            settings[‘MONGODB_SERVER‘],
            settings[‘MONGODB_PORT‘]
        )
        db = connection[settings[‘MONGODB_DB‘]]
        self.collection = db[settings[‘MONGODB_COLLECTION‘]]

    def process_item(self, item, spider):

        valid = True
        # 检查是否合法
        for data in item:
            if not data:
                valid = False
                raise DropItem("Missing {0}!".format(data))
        if valid:
            # 定义目录地址
            dir_path = ‘%s/%s‘ % (settings[‘IMAGES_STORE‘], spider.name)
            # 检查目录是否存在
            if not os.path.exists(dir_path):
                log.msg("不存在目录,创建",
                        level=log.DEBUG, spider=spider)
                os.makedirs(dir_path)

            image_url = item[‘Img_url‘]
            # 文件名
            us = image_url.split(‘/‘)[3:]
            image_file_name = ‘_‘.join(us)
            file_path = ‘%s/%s‘ % (dir_path, image_file_name)

            if not os.path.exists(file_path):
                # 检查是否已经下载过 若不存在 下载该图片
                with open(file_path, ‘wb‘) as handle:
                    response = requests.get(image_url, stream=True)
                    for block in response.iter_content(1024):
                        if block:
                            handle.write(block)

                item[‘File_path‘] = file_path
                log.msg("已下载图片!",
                        level=log.DEBUG, spider=spider)

                # 数据库记录
                self.collection.insert(dict(item))
                log.msg("已存入数据库!",
                        level=log.DEBUG, spider=spider)
            else:
                log.msg("已下载过该图片,跳过",
                        level=log.DEBUG, spider=spider)

        return item

class ImageDownloadPipeline(object):
    def process_item(self, item, spider):
        print item
        return item

items.py

# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# http://doc.scrapy.org/en/latest/topics/items.html

import scrapy

class BaidutiebaItem(scrapy.Item):
    Img_name = scrapy.Field()
    Img_url = scrapy.Field()
    File_path = scrapy.Field()
    pass

settings.py

# -*- coding: utf-8 -*-

# Scrapy settings for baidutieba project
#
# For simplicity, this file contains only the most important settings by
# default. All the other settings are documented here:
#
#     http://doc.scrapy.org/en/latest/topics/settings.html
#

BOT_NAME = ‘baidutieba‘

SPIDER_MODULES = [‘baidutieba.spiders‘]
NEWSPIDER_MODULE = ‘baidutieba.spiders‘

ITEM_PIPELINES = {‘baidutieba.pipelines.ImageDownloadAndMongoDBPipeline‘: 1}
# 存放图片路径
IMAGES_STORE = ‘/home/bill/Pictures‘

# mongodb配置
MONGODB_SERVER = "localhost"
MONGODB_PORT = 27017
MONGODB_DB = "meizidb"
MONGODB_COLLECTION = "meizi"
# Crawl responsibly by identifying yourself (and your website) on the user-agent
#USER_AGENT = ‘baidutieba (+http://www.yourdomain.com)‘


爬取过程:

数据库:

爬到的妹子图:

时间: 2024-10-07 05:48:59

Python Show-Me-the-Code 第 0013 题 抓取妹子图片 使用scrapy的相关文章

Python 3.X 要使用urllib.request 来抓取网络资源。转

Python 3.X 要使用urllib.request 来抓取网络资源. 最简单的方式: #coding=utf-8 import urllib.request response = urllib.request.urlopen('http://python.org/') buff = response.read() #显示 html = buff.decode("utf8") response.close() print(html) 使用Request的方式: #coding=ut

Python -- 网络编程 -- 抓取网页图片 -- 图虫网

字符串(str)编码成字节码(bytes),字节码解码为字符串 获取当前环境编码:sys.stdin.encoding url编码urllib.parse.quote() url解码urllib.parse.unquote() 列表去重:pages = list(set(pages)) 创建文件夹(可多级创建):os.makedirs(folder)  os.mkdir()只能单级创建 首先分析网页(图虫网)的URL规律: 根网页地址形如: http://tuchong.com/tags/人像/

Python爬虫抓取网页图片

本文通过python 来实现这样一个简单的爬虫功能,把我们想要的图片爬取到本地. 下面就看看如何使用python来实现这样一个功能. # -*- coding: utf-8 -*- import urllib import re import time import os #显示下载进度 def schedule(a,b,c): ''''' a:已经下载的数据块 b:数据块的大小 c:远程文件的大小 ''' per = 100.0 * a * b / c if per > 100 : per =

python学习笔记-抓取网页图片脚本

初学者一枚,代码都是模仿网上的.亲测可用~ 运行脚本的前提是本机安装了httplib2模块 #!/usr/bin/python import os import re import string import urllib #author:reed #date:2014-05-14 def GetWebPictures(): url=raw_input('please input the website you want to download:') imgcontent=urllib.urlo

python爬虫:使用urllib.request和BeautifulSoup抓取新浪新闻标题、链接和主要内容

案例一 抓取对象: 新浪国内新闻(http://news.sina.com.cn/china/),该列表中的标题名称.时间.链接. 完整代码: from bs4 import BeautifulSoup import requests url = 'http://news.sina.com.cn/china/' web_data = requests.get(url) web_data.encoding = 'utf-8' soup = BeautifulSoup(web_data.text,'

Python爬虫实现抓取网页图片

在逛贴吧的时候看见贴吧里面漂亮的图片,或有漂亮妹纸的图片,是不是想保存下来? 但是有的网页的图片比较多,一个个保存下来比较麻烦. 最近在学Python,所以用Python来抓取网页内容还是比较方便的: 所以就尝试了一下 ------code------- #coding=utf-8 import re    import urllib   //导入模块     def gethtml(url):   //自定义函数,传参获取网页内容    page=urllib.urlopen(url)    

HDOJ Guess the number 3337【神题-抓取杭电后台输出数据】

Guess the number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7077    Accepted Submission(s): 1626 Problem Description AekdyCoin is the most powerful boy in the group ACM_DIY, whose signatur

Python爬虫新手教程:手机APP数据抓取 pyspider

1. 手机APP数据----写在前面 继续练习pyspider的使用,最近搜索了一些这个框架的一些使用技巧,发现文档竟然挺难理解的,不过使用起来暂时没有障碍,估摸着,要在写个5篇左右关于这个框架的教程.今天教程中增加了图片的处理,你可以重点学习一下. 2. 手机APP数据----页面分析 咱要爬取的网站是 http://www.liqucn.com/rj/new/ 这个网站我看了一下,有大概20000页,每页数据是9个,数据量大概在180000左右,可以抓取下来,后面做数据分析使用,也可以练习优

30分钟编写一个抓取 Unsplash 图片的 Python爬虫

我一直想用 Python and Selenium 创建一个网页爬虫,但从来没有实现它. 几天前, 我决定尝试一下,这听起来可能是挺复杂的, 然而编写代码从 Unsplash 抓取一些美丽的图片还是挺容易的. PS:很多人在学习Python的过程中,往往因为遇问题解决不了或者没好的教程从而导致自己放弃,为此我整理啦从基础的python脚本到web开发.爬虫.django.数据挖掘等[PDF等]需要的可以进Python全栈开发交流.裙 :一久武其而而流一思(数字的谐音)转换下可以找到了,里面有最新