数据抓取练习

代码放在Github上了。https://github.com/lpe234/meizi_spider 


基于Scrapy(0.22)爬虫示例

获取(http://www.meizitu.com/)网站图片,并保存到本地文件夹(meizi_images)下。

运行
python run_spider.py  # 即可
网站做了一些防爬措施

1.必须使用Cookie,否则无法访问

2.访问频率限制(请求间隔2秒,可正常访问)



代码片段:

# -*- coding: utf-8 -*-

from scrapy.spider import Spider
from scrapy.selector import Selector
from scrapy.http.request import Request

import urlparse

from meizi.items import MeiziItem

__author__ = 'lpe234'


class MeiziSpider(Spider):

    name = 'meizi'
    start_urls = ['http://www.meizitu.com/']

    def parse(self, response):
        """
        scrapy 默认入口函数,获取所有分类url(即所有入口)
        :param response:
        :return:
        """
        sel = Selector(response)
        category_nodes = sel.xpath('//div[@class="tags"]/span//a[@title][@href]')
        for node in category_nodes:
            try:
                tag = node.xpath('./@title').extract()[0]
                href = node.xpath('./@href').extract()[0]
                if tag and href:
                    yield Request(
                        url=href,
                        callback=self.parse_list,
                        meta={'data': tag}
                    )
            except(IndexError, TypeError):
                continue

    def parse_list(self, response):
        """
        根据 不同分类 进入列表页,进行遍历(存在分页情况)
        :param response:
        :return:
        """
        tag = response.meta['data']
        sel = Selector(response)

        # 当前页 结点遍历
        nodes = sel.xpath('//ul/li[@class="wp-item"]//h3/a[@href]')
        for node in nodes:
            try:
                title = node.xpath('./b/text()').extract()[0]
                href = node.xpath('./@href').extract()[0]
                if title and href:
                    yield Request(
                        url=href,
                        callback=self.parse_details,
                        meta={'data': '-'.join((tag, title))}
                    )
            except(IndexError, TypeError):
                continue

        # 其他页
        other_pages = sel.xpath('//div[@id="wp_page_numbers"]//li/a[@href]')
        for page in other_pages:
            try:
                href = page.xpath('./@href').extract()[0]
                href = urlparse.urlparse(href, response.url)
                if href:
                    yield Request(
                        url=href,
                        callback=self.parse_list,
                        meta={'data': tag}
                    )
            except(IndexError, TypeError):
                continue

    def parse_details(self, response):
        package_name = response.meta['data']
        images = self.fetch_images(response)

        item = MeiziItem()
        item['name'] = package_name
        item['images'] = images

        yield item

    @classmethod
    def fetch_images(cls, response):
        """
        解析当前页 所有图片
        :param response:
        :return:
        """
        sel = Selector(response)

        images = []
        images_nodes = sel.xpath('//div[@id="picture"]//img[@src]')
        for node in images_nodes:
            try:
                image = node.xpath('./@src').extract()[0]
                if image:
                    images.append(image)
            except(IndexError, TypeError):
                continue
        return images



转载于:https://my.oschina.net/lpe234/blog/425027

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值