笨笨猪 发表于 2018-8-11 19:30

(新手)Scrapy爬取煎蛋妹子图

来社区也已经20来天了,看到各位大佬操作猛如虎,我这个新手只能躲在角落里默默鼓掌{:301_1003:}

编程区里面看到很多大佬分享心得
有目录式的:一篇一篇,由浅入深;有项目式的,一篇一个项目
今天小弟我,分享一下爬取煎蛋网的妹子图心得
(第一次发帖,不知道清不清楚)——————————————————————————————————————————————————————————————————
贴出网址,http://jandan.net/ooxx进cmd建立一个scrapy项目,然后再创建一个spider,语法可以在网上查到
在item中创建我们需要取到的信息对象import scrapy


class JiandanpItem(scrapy.Item):
    img_name = scrapy.Field()
    img_url = scrapy.Field()这里我就创建了两个
在爬虫spider里就是重头戏了,使用xpath,css等选择器爬取网页中有用的信息,如下:
# -*- coding: utf-8 -*-
import scrapy
import base64
from jiandanP import items


class JiandanSpider(scrapy.Spider):

    name = 'jiandan'
    allowed_domains = ['jandan.net']
    start_urls = ['http://jandan.net/ooxx']

    def parse(self, response):
      img = response.xpath('//div[@id="comments"]/ol[@class="commentlist"]/li[@id]')
      for i in img:
            img_name = i.xpath('.//span[@class="righttext"]/a/text()').get()
            img_hash = i.xpath('.//p//span[@class="img-hash"]/text()').get()
            img_url_raw = base64.b64decode(img_hash)
            img_url = 'https:' + str(img_url_raw, encoding='utf-8')
            item = items.JiandanpItem(img_name=img_name, img_url=img_url)
            print(item)
            yield item

      #next_url = response.xpath('/html/body/div/div/div/div/div/div/a/@href').get()
      url = response.css('a::attr(href)').get()
      print('rushang')
      next_url = 'https:' + url
      if next_url:
            print('next_url存在, 正在下载' + next_url + '数据')
            yield scrapy.Request(url=next_url, callback=self.parse)




下面的一个next_url,存在不足,就是在第一页的时候不能够找到这个标签。。(也没有报错不知道为啥)
其实重点也就是,图片链接被js文件中的函数进行加密了而已,使用到了两个函数。
在这里我们发现只需要base64库中的函数进行解码就可以
最后是保存了,在pipeline中函数如下:
# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
import requests
import os

class JiandanpPipeline(object):
    def process_item(self, item, spider):
      path = os.path.abspath('..')
      save_path = path + '\\img'
      if not os.path.exists(save_path):
            os.mkdir(save_path)
            print('文件夹创建成功!')
      img_url = item['img_url']
      img_name = item['img_name']
      save_img = save_path + '\\' + img_name +'.jpg'
      r = requests.get(img_url)

      print('正在下载图片%s......' % img_name)

      with open(save_img, 'wb') as f:
            f.write(r.content)
      f.close()


代码的可变性比较大,比如说图片的命名,保存路径等。
主要自己对煎蛋网的网页源代码摸得不太熟,希望有大佬可以不吝赐教。{:301_1004:}



Avenshy 发表于 2018-8-11 20:06

值得像我这样的python萌新学习

lc5715232 发表于 2018-8-11 20:36

看不懂,但是谢谢分享

林麥蒙 发表于 2018-8-12 08:43

看不懂,好像很厉害

真爱贤 发表于 2018-8-12 09:24

妹子,妹子,我要妹子

陈家丶妖孽 发表于 2018-8-12 09:55

可以,不错。一上手就用了scrapy框架。我还是看resquests,BeautifulSoup.等这些基础的语法。

lttzz 发表于 2018-8-12 10:43

(前排提醒, linux需要修改path里的'\\'{:301_978:}

ph3ngz0r 发表于 2018-8-30 17:22

这么简单,学习下

zhu1123 发表于 2018-8-30 19:17

水印怎么破.....

sun8061 发表于 2018-8-31 09:03

感谢分享      
页: [1] 2 3
查看完整版本: (新手)Scrapy爬取煎蛋妹子图