Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Scrapy(4)spider 帮助你寻找最美小姐姐

Scrapy(4)spider 帮助你寻找最美小姐姐

作者头像
公众号---人生代码
发布于 2020-05-16 14:12:09
发布于 2020-05-16 14:12:09
55100
代码可运行
举报
文章被收录于专栏:人生代码人生代码
运行总次数:0
代码可运行

我们都知道我们平常想下载一些漂亮的图片来装饰自己的桌面,可是找到了都是需要收费的网站,真的很恼火,所以今天小编,可能要带大家实现这么一个工具,可以用来爬取某个网站的好看的图片

哈哈,行了我们进入主题吧

附上链接地址

https://image.so.com/

创建项目前,我们需要来分析下网站数据,进入 首页,点击美女,我们可以知道跳转到这个页面,可以看出数据是通过 jsonp 的形式,进行 ajax 渲染的,而且每一次刷新页面这个函数都会随机变化,也就是说可能写出来的代码是具有时效性的

我们再随机点击一张图片进入看更加详细的页面,

就来到了这个页面,我们 f12 一下,可以看到数据是这样的,具有每张图片的详细信息,点击这个链接,进入 preview

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://image.so.com/zjl?ch=beauty&direction=next&sn=0&pn=30&prevsn=-1

我们可以看到有图片的详细信息了,id,title,imgurl

然后我们再看看 header,里面需要哪些参数,从图上看,我们需要 ch, sn, pn

我们可以拼接出来这样一个链接,读者可以自行访问

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://image.so.com/zjl?ch=beauty&direction=next&prevsn=-1&sn=180

创建项目

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
scrapy startproject images

定义我们的 Item.py

我们通常爬取图片需要爬取保存图片的链接,图片,图片的名称,所以我们定义了这么一个 Item.py 类名

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- coding: utf-8 -*-

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

import scrapy


class ImagesItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    collection = table = 'images'
    imageid = scrapy.Field()
    group_title = scrapy.Field()
    url = scrapy.Field()

spider 蜘蛛

根据我们上面的分析,我们需要一些固定参数,ch,关键字,direction,prevsn,这几个固有参数,当然,我们也可以通过把 ch 动态输入的方式来爬取你需要的图片,这里就只是设置死了,sn 表示起始页数,这个是动态变化的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- coding: utf-8 -*-
import json
from urllib.parse import urlencode
from images.items import ImagesItem
from scrapy import Spider, Request
 
 
class ImagesSpider(Spider):
    name = 'images'
    allowed_domains = ['image.so.com']
 
    def start_requests(self):
        # 表单数据
        data = {
            'ch': 'beauty',
            'direction': 'next',
            'prevsn': -1,
        }
        # 爬虫起始地址
        base_url = 'http://image.so.com/zjl?'
        # page列表从150页循环递归,其中MAX_PAGE为最大页数
        for page in range(1, self.settings.get('MAX_PAGE') + 1):
            data['sn'] = page*30
            params = urlencode(data)
            # spider实际爬取的地址是api接口,如http://image.so.com/zj?ch=wallpaper&sn=30&listtype=new&temp=1
            url = base_url + params
            yield Request(url, self.parse)
 
    def parse(self, response):
        # 因response返回的数据为json格式,故json.loads解析
        result = json.loads(response.text)
        res = result.get('list')
        if res:
            for image in res:
                item = ImagesItem()
                item['imageid'] = image.get('id') # 图片id
                item['title'] = image.get('title') # 图片标题
                item['url'] = image.get('qhimg_url') # 图片地址
                yield item

因为这个网站具有反扒功能,所以我们需要准备一些 user_agents,由于 user_agents太多了,不太方便展示,所以我就剪切了三个展示在这里,需要的话,可以关注公众号,回复‘进群’,加我微信,私信发你

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
agents = [
   "Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1;SV1;AcooBrowser;.NETCLR1.1.4322;.NETCLR2.0.50727)",
    "Mozilla/4.0(compatible;MSIE7.0;WindowsNT6.0;AcooBrowser;SLCC1;.NETCLR2.0.50727;MediaCenterPC5.0;.NETCLR3.0.04506)",
    "Mozilla/4.0(compatible;MSIE7.0;AOL9.5;AOLBuild4337.35;WindowsNT5.1;.NETCLR1.1.4322;.NETCLR2.0.50727)",
]

我们在写中间件的时候,需要用到上面的 user_agents.py 文件

定义中间件

我们需要随机性的选择一个 user_agents ,这样就可以做到让对方不知道我们是同一台电脑在访问页面了,做到可以不被禁掉,我们可以定义一个随机类,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import random
from images.user_agents import agents
 
class RandomUserAgentMiddelware(object):
    """
    换User-Agent
    """
    def process_request(self, request, spider):
        request.headers['User-Agent'] = random.choice(agents)

接下里就是定义管道了

其实管道的意义就是充当数据库保存的作用,根据我的理解,在这里我们需要过滤信息,创建数据库,连接数据库,将数据插入到数据库中

我们这里需要用到我们之前讲过的 pymongo 这个库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pymongo
from scrapy import Request
from scrapy.exceptions import DropItem
from scrapy.pipelines.images import ImagesPipeline
 
# 数据信息存储至 mongo 中
class MongoPipeline(object):
    def __init__(self,mongo_uri, mongo_port, mongo_db):
        self.mongo_uri = mongo_uri
        self.mongo_port = mongo_port
        self.mongo_db = mongo_db
 
    @classmethod
    def from_crawler(cls, crawler):
        return cls(
            mongo_uri=crawler.settings.get('MONGO_URI'),
            mongo_port=crawler.settings.get('MONGO_PORT'),
            mongo_db=crawler.settings.get('MONGO_DB'),
        )
    # 链接数据库
    def open_spider(self, spider):
        self.client = pymongo.MongoClient(host=self.mongo_uri, port=self.mongo_port)
        self.db = self.client[self.mongo_db]
    # 插入数据
    def process_item(self, item, spider):
        self.db[item.collection].insert(dict(item))
        return item
    # 关闭数据库
    def close_spider(self, spider):
        self.client.close()
# 下载图片
class ImagePipeline(ImagesPipeline):
    def file_path(self, request, response=None, info=None):
        url = request.url
        file_name = url.split('/')[-1]
        return file_name
 
    def item_completed(self, results, item, info):
        image_paths = [x['path'] for ok, x in results if ok]
        if not image_paths:
            raise DropItem('Image Downloaded Failed')
        return item
 
    def get_media_requests(self, item, info):
        yield Request(item['url'])

scrapy.setting 设置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- coding: utf-8 -*-

# Scrapy settings for images project

BOT_NAME = 'images' # 其实就是爬虫的名字

SPIDER_MODULES = ['images.spiders'] # 爬虫模块
NEWSPIDER_MODULE = 'images.spiders' # 爬虫的命名空间


# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36' # 本机浏览器的 user_agent

# Obey robots.txt rules
ROBOTSTXT_OBEY = True # 遵循爬虫规则

# 抓取最大页数
MAX_PAGE = 50 # 设置爬取最大页码
# MONGO信息设置
MONGO_URI = 'localhost' # 本地数据库 uri
MONGO_PORT = 27017 # 数据库端口
MONGO_DB = 'images' # 数据库名字
 
# 图片下载路径
IMAGES_STORE = './image1' # 图片存储路径
 
# Obey robots.txt rules
ROBOTSTXT_OBEY = False
 
DOWNLOAD_DELAY = 2 # 延迟
# The download delay setting will honor only one of:
 
# See https://doc.scrapy.org/en/latest/topics/downloader-middleware.html
DOWNLOADER_MIDDLEWARES = { # 刚刚我们编写的随机 agent 中间件就在这里引用说明了,数字为权限级别
   'images.middlewares.RandomUserAgentMiddelware': 543,
}
 
ITEM_PIPELINES = { # 管道权限声明
    'images.pipelines.ImagePipeline': 300,
    'images.pipelines.MongoPipeline': 301,
}

到此为止,我们的爬虫实际上已经完成了,所谓欲成大事,只欠东风来助一臂之力了,就是运行代码了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
scrapy crawl images

当当当,好多美女啊

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CryptoCode 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Scrapy框架之批量下载360妹纸图
0.导语1.项目初始化2.定义存储结构3.Spider核心代码4.pipeline下载及存储5.json知识
公众号guangcity
2019/09/20
6000
Scrapy框架之批量下载360妹纸图
Scrapy框架的使用之Item Pipeline的用法
Item Pipeline是项目管道,本节我们详细了解它的用法。 首先我们看看Item Pipeline在Scrapy中的架构,如下图所示。 图中的最左侧即为Item Pipeline,它的调用发生
崔庆才
2018/06/25
7.4K1
data pipeline是做什么_pycharm创建爬虫项目
爬取爱套图网图片:https://github.com/EExplode/scrapy_aitaotu
全栈程序员站长
2022/10/05
4850
Scrapy框架的使用之Scrapy对接Selenium
Scrapy抓取页面的方式和requests库类似,都是直接模拟HTTP请求,而Scrapy也不能抓取JavaScript动态渲染的页面。在前文中抓取JavaScript渲染的页面有两种方式。一种是分析Ajax请求,找到其对应的接口抓取,Scrapy同样可以用此种方式抓取。另一种是直接用Selenium或Splash模拟浏览器进行抓取,我们不需要关心页面后台发生的请求,也不需要分析渲染过程,只需要关心页面最终结果即可,可见即可爬。那么,如果Scrapy可以对接Selenium,那Scrapy就可以处理任何
崔庆才
2018/06/25
2.7K0
Scrapy 框架实战:构建高效的快看漫画分布式爬虫
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,它提供了强大的数据提取能力、灵活的扩展机制以及高效的异步处理性能。其核心架构包括:
小白学大数据
2025/08/28
700
Scrapy 对接 Selenium
Scrapy抓取页面的方式和Requests库类似,都是直接模拟HTTP请求,因此如果遇到JavaScript渲染的页面Scrapy同样是无法抓取的,而在前文中我们抓取JavaScript渲染的页面有
崔庆才
2017/08/08
6.6K0
Scrapy 对接 Selenium
利用 Scrapy 爬取知乎用户信息
  思路:通过获取知乎某个大V的关注列表和被关注列表,查看该大V和其关注用户和被关注用户的详细信息,然后通过层层递归调用,实现获取关注用户和被关注用户的关注列表和被关注列表,最终实现获取大量用户信息。 一、新建一个scrapy项目   scrapy startproject zhihuuser   移动到新建目录下: cd zhihuuser   新建spider项目: scrapy genspider zhihu zhihu.com 二、这里以爬取知乎大V轮子哥的用户信息来实现爬取知乎大量用户信息。 a)
希希里之海
2018/05/16
6980
Scrapy框架之爬取城市天气预报
1.项目初始化2.提取数据 2.1 原理分析 2.2 数据抽取 2.3 自定义spider3.存储数据 3.1 修改settings.py 3.2 数据存储4.结果展示5.作者的话
公众号guangcity
2019/09/20
1.8K1
Scrapy框架之爬取城市天气预报
Python(十六)
接下来的几篇,我们将介绍一下最流行的爬虫框架 Scrapy。本篇,我们会介绍一下 Scrapy 的基本使用。
1ess
2021/11/01
3720
Python(十六)
手把手教你用Scrapy爬取知乎大V粉丝列表
导读:通过获取知乎某个大V的关注列表和被关注列表,查看该大V以及其关注用户和被关注用户的详细信息,然后通过层层递归调用,实现获取关注用户和被关注用户的关注列表和被关注列表,最终实现获取大量用户信息。
IT阅读排行榜
2021/05/06
9770
一个scrapy框架的爬虫(爬取京东图书)
我们的这个爬虫设计来爬取京东图书(jd.com)。 scrapy框架相信大家比较了解了。里面有很多复杂的机制,超出本文的范围。 1、爬虫spider tips: 1、xpath的语法比较坑,但是你可以在chrome上装一个xpath helper,轻松帮你搞定xpath正则表达式 2、动态内容,比如价格等是不能爬取到的 3、如本代码中,评论爬取部分代码涉及xpath对象的链式调用,可以参考 # -*- coding: utf-8 -*- # import scrapy # 可以用这句代替下面三句,但不推荐
用户1225216
2018/03/05
1.4K0
17.splash_case06_ScrapySplashTest-master
taobao.py # -*- coding: utf-8 -*- from scrapy import Spider, Request from urllib.parse import quote from scrapysplashtest.items import ProductItem from scrapy_splash import SplashRequest script = """ function main(splash, args) splash.images_enabled = f
hankleo
2020/09/17
4280
Python爬虫案例:Scrapy+XPath解析当当网网页结构
在当今大数据时代,网络爬虫已成为获取互联网信息的重要工具。作为Python生态中最强大的爬虫框架之一,Scrapy凭借其高性能、易扩展的特性受到开发者广泛青睐。本文将详细介绍如何利用Scrapy框架结合XPath技术解析当当网的商品页面结构,实现一个完整的电商数据爬取案例。
小白学大数据
2025/07/24
1220
分布式爬虫搭建系列 之三---scrapy框架初用
其次,通过我们的神器PyCharm打开我们的项目--crawlquote(也可以将PyCharm打开我们使用虚拟环境创建的项目)
wfaceboss
2019/04/08
6370
分布式爬虫搭建系列 之三---scrapy框架初用
Python爬虫框架:scrapy爬取知乎数据
基础环境沿用之前的环境,只是增加了MongoDB(非关系型数据库)和PyMongo(Python 的 MongoDB 连接库),默认我认为大家都已经安装好并启动 了MongoDB 服务。
python学习教程
2019/10/22
1.6K0
Python爬虫框架:scrapy爬取知乎数据
Scrapy框架的使用之Scrapy入门
接下来介绍一个简单的项目,完成一遍Scrapy抓取流程。通过这个过程,我们可以对Scrapy的基本用法和原理有大体了解。 一、准备工作 本节要完成的任务如下。 创建一个Scrapy项目。 创建一个Spider来抓取站点和处理数据。 通过命令行将抓取的内容导出。 将抓取的内容保存的到MongoDB数据库。 二、准备工作 我们需要安装好Scrapy框架、MongoDB和PyMongo库。 三、创建项目 创建一个Scrapy项目,项目文件可以直接用scrapy命令生成,命令如下所示: scrapy st
崔庆才
2018/06/25
1.5K0
scrapy 进阶使用
乐百川
2018/01/09
2.1K0
scrapy 进阶使用
实操 | 从0到1教你用Python来爬取整站天气网
Scrapy是Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。
润森
2019/09/17
8000
实操 | 从0到1教你用Python来爬取整站天气网
Scrapy项目实战:爬取某社区用户详情
get_cookies.py from selenium import webdriver from pymongo import MongoClient from scrapy.crawler import overridden_settings # from segmentfault import settings import time import settings class GetCookies(object): def __init__(self): # 初始化组件
hankleo
2020/09/17
6230
起点小说爬取--scrapy/redis/scrapyd
之前写了一篇网络字体反爬之pyspider爬取起点中文小说 可能有人看了感觉讲的太模糊了,基本上就是一笔带过,一点也不详细。这里要说明一下,上一篇主要是因为有字体反爬,所以我才写了那篇文章,所以主要就是提一个字体反爬的概念让大家知道,其中并没有涉及到其他比较难的知识点,所以就是大概介绍一下。
星星在线
2018/08/21
1.9K0
起点小说爬取--scrapy/redis/scrapyd
相关推荐
Scrapy框架之批量下载360妹纸图
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验