stonejianbu 发表于 2019-7-10 21:39:54

基于scrapy框架爬取某某某网站,25000+番号图

本帖最后由 stonejianbu 于 2019-7-12 00:56 编辑


听说新鱼油都喜欢爬虫贴,特别是那种不断换动作的动作片,嘻...(一脸邪恶) 上图为su ren系列,年轻或清纯....(眼神迷离)直接上代码。
# -*- coding: utf-8 -*-
import scrapy


class Luxu8Spider(scrapy.Spider):
    name = 'luxu8'
    allowed_domains = ['www.259luxu8.com']
    start_urls = ['https://www.259luxu8.com/']

    def parse(self, response):
      list_link = response.xpath('//ul[@id="menu-259luxu"]/li')
      link_href_list = [(link.xpath('./a/@href').get(), link.xpath('./a/text()').get()) for link in list_link]
      for link, name in link_href_list:
            yield response.follow(link, callback=self.parse_list, meta={'name': name})

    def parse_list(self, response):
      article_list = response.xpath('//div[@id="post_list_box"]/article')
      article_href_list = /h2/a/@href').get() for article in article_list]
      for link in article_href_list:
            yield response.follow(link, callback=self.parse_detail, meta={'name': response.meta['name']})

      # 获取下一页地址
      next_url = response.xpath('//a[@title="下页"]/@href').get()
      if next_url:
            yield response.follow(next_url, callback=self.parse_list, meta={'name': response.meta['name']})

    def parse_detail(self, response):
      img_name = response.xpath('//p/img/@alt').get()
      img_list = response.xpath('//p/img/@src').getall()
      img_path_list = [('{}/{}/{}_{}'.format(self.name, response.meta['name'], img_name, i+1),
                        img_list) for i in range(len(img_list))]
      print('Downloading: {}'.format(img_name))
      yield {'img_list': img_path_list}

        以上代码基于scrapy框架,看起来较为简单清晰,其思路大概为:首先获取网站首页取分类页的链接,然后爬取分类的列表页,接着进入详情页获取番号图,不断地提取<下一页>以爬取整个网站。
import scrapy
from scrapy.pipelines.images import ImagesPipeline


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


class MyImagePipeline(ImagesPipeline):
    def get_media_requests(self, item, info):
      for name, image_url in item['img_list']:
            yield scrapy.Request(image_url, meta={'image_name': name})

    def file_path(self, request, response=None, info=None):
      name = request.meta['image_name']
      filename = '{}.jpg'.format(name)
      return filename
        对于爬取到的番号链接列表,可使用继承scrapy内置类ImagesPipeline以达到下载并修改将图片名命名为相应的番号的目的,使用其还需要设置下IMAGES_STORE='./mm',这里指的是图片下载到目录mm下。
        以上网站有2500+番号图。标题25000+?哈,今天爬了三个网站,保存了25000+的番号图,但是由于首次发帖,不知道这样是否违规,但为了鱼油们的性福我还是铤而走险。各位鱼油可以自己把代码跑一遍,什么样mm都有(嘿~注意身体)。如果有鱼油对我另外的两个网站资源代码也感兴趣,可以联系下我邮箱,或者评论写邮箱地址,后面可考虑写个程序自动给你们发源码。如果有鱼油不重过程只重结果,只对25000+的番号图图有不轨,可私信我下,有空的话可以给你们发,太多人就不发了,所以还是建议你们自己跑程序,程序应该不会有什么问题,当然有问题可以评论下,鱼油互相帮助回答下!{:5_109:}




hdcomb 发表于 2019-7-11 19:43:05

然后呢??爬取下一步保存在哪了?请指教:hdcomb@163.com

stonejianbu 发表于 2019-7-12 00:49:05

hdcomb 发表于 2019-7-11 19:43
然后呢??爬取下一步保存在哪了?请指教:

帖子已编辑。对于爬取到链接后有很多中处理方式,我选择继承ImagesPipeline类然后直接下载到本地。

renmjchn 发表于 2019-7-28 12:49:04

renmjchn@qq.com
求源码

3437899705 发表于 2019-7-29 10:29:34

老铁,我是小白,能不能直接点,感谢啊

83519489 发表于 2019-8-26 15:37:22

gkd,老司机带带我,最爱那些一言不合就变换着姿势的网站了{:10_281:}{:10_281:}
gerry0071@163.com

233倔强不秃 发表于 2020-4-1 11:17:31

滴滴滴
页: [1]
查看完整版本: 基于scrapy框架爬取某某某网站,25000+番号图