使用scrapy框架爬取蜂鸟论坛的摄影图片并下载到本地

目标网站:http://bbs.fengniao.com/
使用框架:scrapy

因为有很多模块的方法都还不是很熟悉,所有本次爬虫有很多代码都用得比较笨,希望各位读者能给处意见

首先创建好爬虫项目,并使用crawl模板创建爬虫文件

通过观察论坛的规律得出,很多贴子的页数往往大于一页,那么要将贴子里各页的图片下载到同一文件夹内,并且不能重名,就是获取到当前的页码数,已页码数+自然数的方式命令文件。
发现scrapy自动爬虫会爬很多重复的页面,度娘后得出两个解决方法,第一个是用布隆过滤器,布隆过滤器相对于目前的我来说太过深奥,于是便采用了将URL写入mysql的方式,通过mysql键的唯一性来去重复。

先编写items文件

import scrapy

class FengniaoItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title=scrapy.Field()                                     #定义贴子名
    images=scrapy.Field()                              #定义图片链接
    act=scrapy.Field()                                     #定义页码数
    thisurl=scrapy.Field()                                 #定义当前url

其次是爬虫文件,这里命名为s1.py

# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from fengniao.items import FengniaoItem
from scrapy import Request

class S1Spider(CrawlSpider):
    name = ‘s1‘
    allowed_domains = [‘bbs.fengniao.com‘]
    #start_urls = [‘http://bbs.fengniao.com/‘]

    def start_requests(self):
        url=‘http://bbs.fengniao.com/forum/forum_101.html/‘                                         #爬虫开始的网址
        ua={"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36"}               #设置浏览器ua模拟浏览器
        yield Request(url,headers=ua)
    rules = (
        Rule(LinkExtractor(allow=r‘forum/‘), callback=‘parse_item‘, follow=True),                              #allow=r‘forum/‘ 设置爬取的网址的规律
    )

    def parse_item(self, response):
        item = FengniaoItem()
        item["thisurl"]=response.url                                                                                                       #获取当前页面
        item["title"]=response.xpath("/html/head/title/text()").extract()                                                #获取当前标题
        item["images"]=response.xpath("//div[@class=‘img‘]//img/@src").extract()                         #获取当前的图片url
        item["act"]=response.xpath("//a[@class=‘act‘]/text()").extract()                                              #获取当前的页码
        #i[‘domain_id‘] = response.xpath(‘//input[@id="sid"]/@value‘).extract()
        #i[‘name‘] = response.xpath(‘//div[@id="name"]‘).extract()
        #i[‘description‘] = response.xpath(‘//div[@id="description"]‘).extract()
        return item

当然啦,在settings.py里要开启pipelines 设置浏览器ua
然后我们在pipelines.py里开始处理我们的爬到的东西

# -*- coding: utf-8 -*-
import os
import urllib.request
import re
import pymysql
# 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

class FengniaoPipeline(object):

    def process_item(self, item, spider):

        images=item["images"]                                                      #将图片链接列表赋给images变量
        thisurl = item["thisurl"]                                                          #将当前网址赋值费thisurl变量
        conn=pymysql.connect(host=‘127.0.0.1‘,user=‘root‘,passwd=‘root‘,db=‘dd‘,charset=‘utf8‘)           #创建数据库连接
        cursor=conn.cursor()                                                                                                           #创建游标
        sql="insert into fengniao(link) values(‘" + thisurl + "‘)"                                                      编写数据库代码将当前链接插入数据库 

        try:                                                                                             #做一个异常处理,如果可以插进数据库,说明当前网址没有爬出过
            cursor.execute(sql)
            conn.commit()

            if len(images)>0:                                                                     #监测当前网址图片链接是否存在 ,如果存在则执行下面的操作
                title = item["title"][0]                                                              #将帖子名提取出来并赋值给title
                new_title = title.replace("【有图】", "")                            #使用replace方法将【有图】 去掉
                act = item["act"][0]  # 当前页码数                                      #提取当前的页码数并赋值给act
                print(act)

                print(thisurl)
                folder = "E:/PAS/fengniao1/" + new_title + ‘/‘      # 构造文件夹目录  以帖子名命名
                folder_test = os.path.exists(folder)                  # 监测文件夹是否存在
                if not folder_test:                                       #如果文件夹不存在
                    os.mkdir(folder)                                  #创建文件夹
                    print("创建文件夹"+new_title+"成功")

                else:                                                 #如果文件夹存在
                    print("文件夹"+new_title+"已存在")

                print("一共有" + str(len(images)) + "张图片")
                for i in range(0, len(images)):                                  #使用for循环依次输出图片地址

                    pat=‘(.*?)?imageView‘                                        #观察得出,图片的地址为小图地址,所以使用正则表达式处理一下图片地址,得到高品质图片的地址

                    new_images=re.compile(pat).findall(images[i])             #得到大图图片地址列表

                    #print(new_images)

                    num=int(act)-1                                              #处理一下页码数

                    print("正在下载" + str(num) + str(i) + "张图片")
                    file = folder + str(num) + str(i) + ".jpg"                                     #构造图片名称,为当前(页面数-1)+自然数

                    urllib.request.urlretrieve(new_images[0], filename=file)               #使用urllib.request.urlretrieve 方法下载图片
                # for i in range(0,len(images)):
                #     print("正在下载"+str(count)+str(i)+"张图片")
                #     file=folder+str(count)+str(i)+".jpg"
                #     urllib.request.urlretrieve(images[i],filename=file)
            else:                                                                                                     #如果当前网址没有图片 跳过
                pass
        except:                                                                                                    #如果当前url写不进数据库,输出异常
            print("本网页已经爬过了,跳过了哦")                                            #打印提示

        cursor.close()
        conn.close()

        return item

至此,代码已经编写完成 我们来看看运行后是怎么样的

原文地址:http://blog.51cto.com/wuliu92/2167295

时间: 2024-11-08 23:38:02

使用scrapy框架爬取蜂鸟论坛的摄影图片并下载到本地的相关文章

03_使用scrapy框架爬取豆瓣电影TOP250

前言: 本次项目是使用scrapy框架,爬取豆瓣电影TOP250的相关信息.其中涉及到代理IP,随机UA代理,最后将得到的数据保存到mongoDB中.本次爬取的内容实则不难.主要是熟悉scrapy相关命令以及理解框架各部分的作用. 1.本次目标 爬取豆瓣电影TOP250的信息,将得到的数据保存到mongoDB中. 2.准备工作 需要安装好scrapy以及mongoDB,安装步骤这里不做赘述.(这里最好是先了解scrapy框架各个部分的基本作用和基础知识,这样方便后面的内容的理解.scrapy文档

scrapy框架爬取豆瓣读书(1)

1.scrapy框架 Scrapy,Python开发的一个快速.高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.Scrapy用途广泛,可以用于数据挖掘.监测和自动化测试. Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改.它也提供了多种类型爬虫的基类,如BaseSpider.sitemap爬虫等,最新版本又提供了web2.0爬虫的支持. 主要组件: 2.快速开始 scrapy startproject douban cd到douban根目录

基于python的scrapy框架爬取豆瓣电影及其可视化

1.Scrapy框架介绍 主要介绍,spiders,engine,scheduler,downloader,Item pipeline scrapy常见命令如下: 对应在scrapy文件中有,自己增加爬虫文件,系统生成items,pipelines,setting的配置文件就这些. items写需要爬取的属性名,pipelines写一些数据流操作,写入文件,还是导入数据库中.主要爬虫文件写domain,属性名的xpath,在每页添加属性对应的信息等. movieRank = scrapy.Fie

python 使用scrapy框架爬取一个图书网站的信息

1.新建项目 scrapy start_project book_project 2.编写items类 3.编写spider类 # -*- coding: utf-8 -*- import scrapy from book_project.items import BookItem class BookInfoSpider(scrapy.Spider): name = "bookinfo"#定义爬虫的名字 allowed_domains = ["allitebooks.com

python利用scrapy框架爬取起点

先上自己做完之后回顾细节和思路的东西,之后代码一起上. 1.Mongodb 建立一个叫QiDian的库,然后建立了一个叫Novelclass(小说类别表)Novelclass(可以把一级类别二级类别都存进去:玄幻--一级类别,东方玄幻--二级类别)的表 client = pymongo.MongoClient(host="127.0.0.1") db = client.QiDian collection = db.Novelclass 2.用parse回调方法,获得一级类别.循环取出(

scrapy框架爬取小说信息

1.爬取目标网站:http://www.zhaoxiaoshuo.com/all.php?c=0&o=0&s=0&f=2&l=0&page=1 2.爬取目标网站信息:小说类型  小说书名  小说作者  小说字数  小说投票数  小说搜藏数  小说状态 3.scrapy框架结构: zhaoxiaoshuo zhaoxiaoshuo spiders __init__.py zhaoxiaoshuo.py items.py middlewares.py pipelines

scrapy框架来爬取壁纸网站并将图片下载到本地文件中

首先需要确定要爬取的内容,所以第一步就应该是要确定要爬的字段: 首先去items中确定要爬的内容 class MeizhuoItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() # 图集的标题 title = scrapy.Field() # 图片的url,需要来进行图片的抓取 url = scrapy.Field() pass 在确定完要爬的字段之后,就是分析网站页面的请求

scrapy框架爬取糗事百科

在编写案例之前首先理解几个问题,1:什么是爬虫2:为什么说python是门友好的爬虫语言?3:选用哪种框架编写爬虫程序 一:什么是爬虫? 爬虫 webSpider 也称之为网络蜘蛛,是使用一段编写好的代码所生成的应用程序使其游弋于互联网这个庞大的体系中,帮助我们将想要的内容从目标服务器中搬到我们本地,通 过解析将所需要的数据结构化入库,为企业或个人决策提供依据.比如股票走势,某产品在淘宝上现存的经销商数量及销量等等 二:为什么说python是门友好的爬虫语言? 语言只是门工具,不同的语言侧重的领

用scrapy框架爬取映客直播用户头像

1. 创建项目 scrapy startproject yingke cd yingke 2. 创建爬虫  scrapy genspider live 3. 分析http://www.inke.cn/hotlive_list.html网页的response,找到响应里面数据的规律,并找到的位置,通过response.xpath()获取到 4. 通过在pipline里面进行数据的清洗,过滤,保存 5. 实现翻页,进行下一页的请求处理 6. 运行爬虫 scrapy crawl live 说明:这个程