前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据抓取练习

数据抓取练习

作者头像
lpe234
发布2020-07-27 17:07:24
1.1K0
发布2020-07-27 17:07:24
举报
文章被收录于专栏:若是烟花

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


基于Scrapy(0.22)爬虫示例

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

运行
代码语言:javascript
复制
python run_spider.py  # 即可
网站做了一些防爬措施

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

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


代码片段:

代码语言:javascript
复制
# -*- 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
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基于Scrapy(0.22)爬虫示例
    • 运行
      • 网站做了一些防爬措施
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档