资讯专栏INFORMATION COLUMN

从零开始写爬虫

wwq0327 / 1761人阅读

摘要:几个朋友对爬虫很感兴趣,他们也都是开发人员,一个开发两个开发,都没有过项目开发经验,正好其中一个最近要爬一个网店的产品信息,所以希望我能拿这网站当写一个爬虫来给他们参考学习。我们就在这个文件里开发爬虫的相关逻辑。

几个朋友对爬虫很感兴趣,他们也都是开发人员,一个PHP开发两个JAVA开发,都没有过python项目开发经验,正好其中一个最近要爬一个网店的产品信息,所以希望我能拿这网站当demo写一个爬虫来给他们参考学习。要爬取的页是http://list.secoo.com/watches...,只要爬取产品相关了属性就可以。


这就是要爬取的相关信息

爬虫框架使用的是python的scrapy,这也是我现在项目中使用的爬虫框架。朋友们由于没有使用过scrapy,因此推荐他们去看一下框架文档,http://scrapy-chs.readthedocs...,这是scrapy的入门教程,基本上看完前面几章就能快速开发一个简单的爬虫了。

一、生成代码
scrapy提供了命令行工具来快速生成一个简单的爬虫,我们也使用这个工具来快速生成代码。在终端下面运行下面的命令就能快速生成一个scrapy爬虫的基础框架,免去一些最原始的代码开发操作。

scrapy startproject secoo

生成的项目文件就是上面的样子,spiders目录是存放爬虫代码,items.py是定义爬虫要爬取的字段信息,pipelines.py是用来处理爬虫爬到的数据的,比如用来做保存操作,像是存redis或是mysql等等,settings.py是项目的基础配置文件,定义一些爬虫的全局参数。
生成完项目基础代码后还可以使用下面的命令行工具来生成爬虫代码最简单的代码,和创建项目一样,可以省去创建文件的麻烦。

scrapy genspider watch secoo.com

命令执行完成后我们就会在spiders目录下发现我们生成好的爬虫文件watch.py了。我们就在这个文件里开发爬虫的相关逻辑。

二、 定义爬虫数据字段
爬虫要爬页面,肯定是要从爬取到的页面中提取到我们想要的字段信息,这样的话我们就要先来定义一下哪些是我们要的字段,后面好在本地保存,这个就是scrapy里的items来负责的。
我们打开根目录下面的items.py文件,这个文件里定义一个SecooItem的类,我们定义了4个字段,分别用来保存产品名、路径、价格和库存信息,这一步操作我们就完成了,后面的爬虫按这个定义好的格式来保存数据就可以了。

import scrapy

class SecooItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    product_name = scrapy.Field()       #产品名
    breadcrumb = scrapy.Field()         #面包屑路径
    product_price = scrapy.Field()      #产品价格
    product_stock = scrapy.Field()      #库存状态

三、定义保存数据操作
这一步是要来定义爬虫的数据提取出来以后,按照items.py定义的格式格式化以后是如何保存的。由于我们是写一个demo给大家来参考,因此这一部分代码是没有写实际的数据保存操作的,我们只定义了这个操作类,如果是想要进行保存数据操作的话可以直接修改SecooPipeline类的process_item方法,在这里可以和正常脚本操作数据库一样进行连接、写入操作的。

class SecooPipeline(object):
    def process_item(self, item, spider):
        return item

四、页面爬取
最后一步就是最重要的一步了,我们要进行爬虫逻辑的开发。在这里先贴上代码,然后再来解释每一步的操作。

# -*- coding: utf-8 -*-
import scrapy
from secoo.items import SecooItem

class WatchSpider(scrapy.Spider):
    name = "watch"
    allowed_domains = ["secoo.com"]
    start_urls = ["http://list.secoo.com/watches/93-0-0-0-0-1-0-0-1-10-0-908_0.shtml"]


    def parse(self, response):
        """
        解析商品列表页面的内容,提取商品页面链接并生成请求
        :param response:
        :return:
        """
        #解析商品链接
        goods_links = response.css("body .product_box .commodity-list dl .show_tips dt>a::attr(href)").extract()

        for url in goods_links:
            #分别去爬取商品信息
            yield scrapy.Request(url, callback=self.parse_goods, dont_filter=True)

        next_page = self.get_next_page_url(response)
        if next_page:
            yield scrapy.Request(next_page, callback=self.parse)


    def get_next_page_url(self, response):
        """
        获取下一个商品列表的链接
        :param response:
        :return:
        """
        return response.css("a.next::attr(href)").extract_first()

    def parse_goods(self, response):
        """
        解析商品内容,提取要爬取的字段
        :param response:
        :return:
        """
        name = response.css(".sopdetailsCon .contents .info_r .proName h2::text").extract_first()
        price = response.css("#secooPriceJs::text").extract_first()
        stock = response.css("#youhuo::text").extract_first()
        breadcrumb = "->".join(response.css(".smallNav p a::text").extract())

        yield SecooItem({
            "product_name": name,
            "breadcrumb": breadcrumb,
            "product_price": price,
            "product_stock": stock,
        })

在使用命令行工具生成爬虫的时候就会帮我们定义好三个变量,一个是name,这个是定义爬虫的名称的;第二个是allowed_domains,这个是一个list,定义爬虫允许爬取的域名;最后一个start_urls变量也是一个list类型,是用来定义爬虫入口URL的,可以定义多个入口地址。
接下来是parse方法,这个方法是框架默认的第一个处理方法,用来解析网页内容的。大概的逻辑在注释中写的比较清楚,逻辑就是我们解析那个产品列表页面,从其中提取产品列表链接,然后生成请求去爬取产品信息,然后再去提取产品列表页面的下一页链接,再生成请求去请求这个页面,处理回调方法就是parse方法,这样就能实现所有翻页爬取。
在parse方法里提取出来的产品链接生成了请求之后,我把爬虫回调处理方法设置成parse_goods,因此我们要去定义一个parse_goods方法来处理产品页面html内容。通过xpath或是css的selector方法来提取我们想要爬取的内容,然后丢给pipelines.py来处理了。这样我们就把爬虫的所有逻辑实现完成了,最后一步不是验证爬虫的运行情况了。

五、运行
最后一步就是就是运行操作,我们在命令行下,进入项目目录,然后执行下面命令就能正常运行爬虫了,由于我们没有写保存操作,因此我们就把数据导出到一个json文件里。

scrapy crawl watch --output=product.json

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/40810.html

相关文章

  • Python爬虫建站入门手记——从零开始建立采集站点(二:编爬虫

    摘要:接上回第二部分,编写爬虫。进入微信嵌套选择图片和上传图片接口,实现一键上传图片,遇到问题看吧,我现在已经可以通过爬虫获取的提问标题了。微信故意省略想做小偷站的,看到这里基本上就能搞出来了。下一篇,采集入库 上回,我装了环境 也就是一对乱七八糟的东西 装了pip,用pip装了virtualenv,建立了一个virtualenv,在这个virtualenv里面,装了Django,创建了一个...

    Codeing_ls 评论0 收藏0
  • Python 从零开始爬虫(零)——爬虫思路&requests模块使用

    摘要:定制筛选器,对内容进行筛选重点。审查元素这是浏览器自带的工具,提供抓包和检查网页源码的功能,供使用者分析网页。超时设置,如果服务器在指定秒数内没有应答,抛出异常,用于避免无响应连接,整形或浮点数。返回连接状态,正常。 前言 python 3.6 !! 本爬虫系列是面对有Python语法基础的读者写的,如果你没学过python,emmmm.....也没关系,你或许能从每篇文章中学到一些...

    YanceyOfficial 评论0 收藏0
  • Python 从零开始爬虫(一)——爬虫伪装&反“反爬”

    摘要:总的来说有两种反爬策略,要么验证身份,把虫子踩死在门口要么在网站植入各种反爬机制,让爬虫知难而退。本节内容就着这两种反爬策略提出一些对策。内嵌反爬很灵活,没有什么固定的代码格式,要花时间去分析出来。   之前提到过,有些网站是防爬虫的。其实事实是,凡是有一定规模的网站,大公司的网站,或是盈利性质比较强的网站,都是有高级的防爬措施的。总的来说有两种反爬策略,要么验证身份,把虫子踩死在门口...

    int64 评论0 收藏0
  • Python 从零开始爬虫(六)——动态爬取解决方案 之 手动分析

    摘要:之前提到动态加载就两个解决方案手动分析和。背后有许多不为人知的交易进行着,动态爬取的任务就是拦截它们揭开它们的真面目。在爬虫界有着霸王硬上弓的称号,管它情不情愿,来了动态加载也只有屈服的份了。 之前提到动态加载就两个解决方案——手动分析和selenium。接下来的文章我们会来深入探讨它们,本文将首先,重点介绍前者——手动分析 手动分析是一个比较有难度,比较麻烦的解决方案,但优点也很明显...

    rozbo 评论0 收藏0
  • Python爬虫建站入门手记——从零开始建立采集站点(三:采集入库)

    摘要:进入正题第三部分,采集入库。内容如下加上这个可以记住问题在的位置,方便以后更新或者其他操作都很直白,关于各个可以看看的文档。代码如下添加方法采集当前分页正在抓取分页这个地方写得很笨,之前该在加上这个属性。 上回,我已经大概把爬虫写出来了。 我写了一个内容爬虫,一个爬取tag里面内容链接的爬虫 其实还差一个,就是收集一共有哪些tag的爬虫。但是这里先不说这个问题,因为我上次忘了 这次又不...

    amuqiao 评论0 收藏0

发表评论

0条评论

wwq0327

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<