Scrapy爬取动态页面下载图片(以抓取360图片为例)

当我们想要抓取一个页面的内容时,要做的第一件事不是写代码,而是分析页面,确定这是一个静态页面还是动态页面。抓取静态页面的方法十分简单,直接解析html源码再进行分析解析即可,如果不太明白,可以参考我上篇文章Scrapy抓取豆瓣电影信息,这里我主要讲述一下如何抓取动态页面。

抓取动态页面有两种方法:
第一种方法是采用第三方工具,模拟浏览器的行为,从而加载数据。比如:Selenium、PhantomJs。这种方法的优点在于不必考虑动态页面的各种变化多端,但是性能低。

第二种方法是分析页面,找到对应的请求接口,直接获取数据。这种方法的优点在于性能高,但缺点也显而易见,就是获取API接口比较麻烦。

我这里采用第二种方式抓取动态页面。

1.浏览器打开页面 http://image.so.com/z?ch=beauty,查看网页源代码,发现源码中没有图片信息,这是一个动态加载的页面,而且是ajax异步请求动态页面。

2.分析页面,提取API接口,通过F12,审查元素可以找到。

3.打开上面的url,发现传入的是json格式的数据,所以之后我们获取到response响应,要先用json.loads()解析数据。

4.观察API接口,可以发现有几个参数,ch、sn、listtype、temp,通过改变这些参数的值就能获取到不同的内容。

通过分析发现,ch参数代表图片分类,比如beauty就表示美女图片,sn表示图片的编号,比如0就表示1到30之间的图片,30就表示31到60之间的图片。

分析了这些参数,我们就确定了我们需要请求的url地址,此处的url不像静态页面中通过程序自动获取a标签中的href,而是需要我们自动设定,我们可以通过重写start_requests方法指定需要获取的url。

5.编写我们的spider

# -*- coding: utf-8 -*-
from json import loads

import scrapy

from urllib.parse import urlencode

from image360.items import BeautyItem


class ImageSpider(scrapy.Spider):
    name = 'image'
    allowed_domains = ['image.so.com']

    # 重写Spider中的start_requests方法:指定开始url
    def start_requests(self):
        base_url = 'http://image.so.com/zj?'
        param = {
  'ch': 'beauty', 'listtype': 
  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值