文档章节

数据抓取练习

明天以后
 明天以后
发布于 2015/06/04 21:25
字数 393
阅读 632
收藏 17

代码放在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



© 著作权归作者所有

明天以后

明天以后

粉丝 76
博文 130
码字总数 87367
作品 0
昌平
程序员
私信 提问
python抓取糗事百科

python抓取糗事百科 Run - 学习练习复习2016-01-0793 阅读 python抓取 直接上代码 [...] 点赞 python抓取 作者:Run - 学习练习复习 linux,c,python,php,javascript,系统架构,大数据分享博客...

Run - 学习练习复习
2016/01/07
0
0
python 抓取免费IP,并验证是否有真实

python 抓取免费IP,并验证是否有真实 Run - 学习练习复习2016-01-30189 阅读 python抓取免费IP验证 python把这些IP爬下来时,就可以批量爬站,投票,模拟用户等操作 用到python 组件 Mysql,...

Run - 学习练习复习
2016/01/30
0
0
python爬虫抓取站长之家IP库,仅供练习用!

python爬虫抓取站长之家IP库,单线程的,仅供练习,IP库数据有43亿条,如果按此种方法抓取至少得数年,所以谨以此作为练手,新手代码很糙,请大家见谅。 #!/usr/bin/python coding=UTF-8 imp...

苍狼牧
2017/03/13
0
0
使用pyspider抓取起点中文网小说数据

简介 pyspider是国人开发的相当好用的爬虫框架。虽然网上教程不是很多,但是文档详细,操作简单,非常适合用来做爬虫练习或者实现一些抓取数据的需求。 本文就以抓取起点中文小说网的小说作品...

某杰
2017/02/22
0
0
centos 安装samba服务,挂载目录

centos 安装samba服务,挂载目录 Run - 学习练习复习2016-02-27108 阅读 安装服务samba挂载CentOS 方便在centos开发,安装samba [...] 点赞 安装服务samba挂载CentOS 作者:Run - 学习练习复...

Run - 学习练习复习
2016/02/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

shangcheng-my

1.数据库主键、外键类型为bigint,那么在后台应该用什么类型的变量定义? 后台用string接收,因为前段传过来的一般都是json字符串,后台直接接收,mysql是可以吧数字类型的字符串转换为对应的...

榴莲黑芝麻糊
昨天
4
0
微服务架构依赖图

基于spring-cloud-alibaba + dubbo

龙影
昨天
5
0
Centos7 安装zabbix-agent

rpm -i https://repo.zabbix.com/zabbix/4.2/rhel/6/x86_64/zabbix-release-4.2-2.el6.noarch.rpm 可以到https://repo.zabbix.com/zabbix找到对应的版本 yum install zabbix-agent -y 出现E......

abowu
昨天
8
0
文本编辑器GNU nano 4.4 发布

GNU nano 4.4 "Hagelslag" 更新日志: 启动时,光标可以放在第一个或最后一个出现位置 字符串前面带有+/string 或 +?string的字符串。 发生自动硬包装时((--breaklonglines),任何前导引号...

linuxCool
昨天
7
0
你知道字节序吗

字节序 最近在调一个自定义报文的接口时,本来以为挺简单的,发现踩了好几个坑,其中一个比较“刻骨铭心”的问题就是数据的字节序问题。 背景 自定义报文,调用接口,服务端报文解析失败 iO...

杭城小刘
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部