吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 6689|回复: 14
收起左侧

[Python 转载] scrapy爬虫的一些思路和分享

[复制链接]
3vil_Kali 发表于 2019-10-14 15:02
大佬绕道勿喷,我也是刚学scrapy的小白同学,只是单纯想分享一下成果和学到的技巧


前些天看到一些大佬做的爬虫,爬下了XX网的全部图片,刚好我这段时间也在学scrapy,便有了下面的故事。。。

找别(zi)人(ji)要(zhao)以一个有兴趣的网站,然后对网站进行分析:
分析结果如下:
1.  目的:像大佬那样爬下全部高清大图
2.  网站有对图集进行分类,每个分类下又有单套套图的封面图,想要获取所有高清图片就需要点击封面图进入大图页面,再从大图页面获取高清大图的URL。
     (意思就是我们要获取想要的URL就需要进入3层URL 里)

首页图集分类

首页图集分类

3. 右键从新标签查看图片时发现图片的URL与该图片是当前页面的第几张相对应,故有了通过获取当前页面里,该套图页数对URL里的页码进行遍历,构造新的URL。(具体的看下面的源码,我觉得写的很清楚了)
以上就是大概的思路了,话不多说直接撸代码:




1. spiders下创建一个XXXspider的文件
[Python] 纯文本查看 复制代码
import scrapy  #导入scrapy包

class quantuwangSpider(scrapy.Spider):  # 定义一个爬虫类
    name = 'meinv'  # 爬虫名字
    start_urls =[  #爬虫开始URL,列表类型
        'http://www.quantuwang.co/meinv/'
    ]
    custom_settings = {   #定义输出等级,以下为进输出错误以上的报错
        'LOG_LEVEL': 'ERROR'
    }

    def parse(self, response):  #parse是关键函数,接收start_urls里的起始url
        tags = response.css('.index_top_tag     a[href^="/meinv/"]::attr(href)').getall()   #通过类选择器找到所需要的信息,列表
        for tag in tags:
            tag = "http://www.quantuwang.co" + tag  #整合信息
            yield scrapy.Request(tag, callback=self.parseIndex)  #通过yeild函数传递给下一个函数,callback为整合信息后下一个被调用的函数
            print(tag)

    def parseIndex(self, response):
        domain = 'http://www.quantuwang.co'
        pages = response.css('.c_page a::attr(href)').getall()
        indexs = []
        try:  # try下的代码会被执行
            indexs.append(response.url)
            if len(pages) is not None:
                for page in pages:
                    indexs.append(domain + page)

        except: # except的代码是报错后执行的代码
            indexs.append(response.url)

        for index in indexs: 
            yield scrapy.Request(index, callback=self.parseUrls) #继续传递给下一个函数

    def parseUrls(self, response):
        urls = response.css('.index_left a[href^="/m/"]::attr(href)').getall()
        for url in urls:
            url = "http://www.quantuwang.co" + url
            yield scrapy.Request(url, callback=self.parseImg)

        def parseImg(self, response):
        item = QuantuwangItem() #实例化item
        imgUrl = response.css('.c_img img::attr(src)').get()
        imgUrl = imgUrl.replace('1.jpg', '')
        item['imgName'] = response.css('title::text').get()  #获取文章标题作为文件夹名字
        imgNum = response.css('.c_page a:last-child::text').get()
        imgUrls = []  #由于采用url拼接的方法,可以把url定于为一个list,再传递给item['imgUrl']
        for num in range(int(imgNum)):
            # print(imgUrl + str(num) + '.jpg')
            imgUrls.append(imgUrl + str(num) + '.jpg')

        item['imgUrl'] = imgUrls
        yield item  #yeild出去item



2. 编写item文件(将获取到的数据存为管道文件,便于后期pipelines使用)

[Python] 纯文本查看 复制代码
import scrapy #导入scrapy模块(也可以直接导入scrapy.Item)

class QuantuwangItem(scrapy.Item):
    imgName = scrapy.Field()  #获取spider获取的内容(此项为文件名)
    imgUrl = scrapy.Field() #获取spider获取的内容(此项为图片url)
    # pass
3. 编写pipelines文件(管道文件)
[Python] 纯文本查看 复制代码
from scrapy.pipelines.images import ImagesPipeline  #导入图片下载模块
from scrapy import Request  
import re


class QuantuwangPipeline(ImagesPipeline):
    def get_media_requests(self, item, info):  #重写get_media_request方法,定义文件存放目录
        for img_url in item['imgUrl']:
            print(img_url)
            yield Request(img_url, meta={'name': item['imgName']})  #将目录名(title名)缓存起来,传递给下面的file_path函数

    def file_path(self, request, response=None, info=None):
        image_guid = request.url.split('/')[-1]  #对获取到的图片url进行分割,取以'/'的后部分
        name = request.meta['name']  
        name = re.sub(r'[?\\*|“<>:/]', '', name) #过滤windows字符串,避免一些未知错误
        filename = u'{0}/{1}'.format(name, image_guid) #对路径/文件的拼接
        print(filename)
        return filename #return文件名


4. setting文件配置(设置scrapy通用配置文件)
#为scrapy提供pipeline文件位置,300表示优先权(1-1000,数字越小,优先权越高)
[Python] 纯文本查看 复制代码
ITEM_PIPELINES = {  
   'quantuwang.pipelines.QuantuwangPipeline': 300,
} 

#自定义UA
[Python] 纯文本查看 复制代码
import random
USER_AGENT_LIST = [  
    'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'
    "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
    "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
]
USER_AGENT = random.choice(USER_AGENT_LIST)

#不遵循爬虫协议(即使是robots文件也爬取)
[Python] 纯文本查看 复制代码
ROBOTSTXT_OBEY = False  

#定义middlewares模块(不定义的话,可能会遇到302报错)
[Python] 纯文本查看 复制代码
DOWNLOADER_MIDDLEWARES = {
    'quantuwang.middlewares.QuantuwangDownloaderMiddleware': 543,#自有
    'quantuwang.middlewares.RandomUserAgentMiddleware': 400, #新增,引用middleware里的RandomUserAgentMiddleware类
}

#定义文件下载目录(pipeline定义的是目录,总的下载目录为IMAGES_STORE\PIPELINES定义的目录)
[Python] 纯文本查看 复制代码
IMAGES_STORE = 'D:\\PyCode\\quantuwang'

# 其他方法解决302问题
[Python] 纯文本查看 复制代码
MEDIA_ALLOW_REDIRECTS = True  #允许重定向
HTTPERROR_ALLOWED_CODES = [302]  #允许302状态码
COOKIES_ENABLED = False #不启用cookie


5. 编写middlewares模块(下载模块,解决该例子302问题)
[Python] 纯文本查看 复制代码
from quantuwang.settings import USER_AGENT_LIST  #引用settings里面的UA-list
class RandomUserAgentMiddleware(object):
    def process_request(self, request, spider):
        rand_use = random.choice(USER_AGENT_LIST)
        if rand_use:
            request.headers.setdefault('User-Agent', rand_use)


附上源码:链接: https://pan.baidu.com/s/1vNYISvSd3mvIFnZ2A9UVgA 提取码: 1234

quantuwang.zip (15.22 KB, 下载次数: 33)

免费评分

参与人数 2吾爱币 +4 收起 理由
jiangyu_2006 + 1 谢谢@Thanks!
zzzain46 + 3 用心讨论,共获提升!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 3vil_Kali 发表于 2020-1-9 10:09
只有汝丶 发表于 2020-1-3 18:17
想问一下,关于一些招聘网站需要cookie才能访问成功的,该怎么设置呢?

需要添加cookie的话,阔以在setting文件修改Cookies_enabled=False这个参数,我在这篇文章不需要使用到cookie,但是我其他爬虫有用到,具体的参考https://blog.csdn.net/qq_40655579/article/details/85126064这篇文章
 楼主| 3vil_Kali 发表于 2019-12-24 09:56
luochanguo 发表于 2019-12-11 13:07
作为新手。我都不知道。 你的文件怎么运行。需要什么环境

把下载的文件在ida打开,然后在ida终端输入scrapy crawl meinv 即可运行。环境的话,只需要安装scrapy就好。推荐使用Anaconda安装scrapy。然后可以在IMAGE_STORE修改自己的保存路径。
石晓一格莱 发表于 2019-10-14 15:49
大狗腿子 发表于 2019-10-14 16:19
感谢分享,谢谢
piaoransfx 发表于 2019-10-14 16:47
看起来很厉害,我最近才刚开始学习最简单的
 楼主| 3vil_Kali 发表于 2019-10-14 17:22
石晓一格莱 发表于 2019-10-14 15:49
感谢分享,给了很大的启发

不客气哈,能帮到你就好。
机灵鹤 发表于 2019-10-23 13:45
最近也在学scrapy,感谢分享
luochanguo 发表于 2019-12-11 13:07
作为新手。我都不知道。 你的文件怎么运行。需要什么环境
lxy56415653 发表于 2019-12-11 13:22
感谢分享,我学到了好多东西。。。
husan 发表于 2019-12-17 11:11
厉害了,我正好需要
遗忘时光 发表于 2019-12-24 09:15
前来学习学习
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 19:36

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表