Python爬虫框架Scrapy 学习笔记 10.2 -------【实战】 抓取天猫某网店所有宝贝详情

第二部分 抽取起始页中进入宝贝详情页面的链接


  1. 创建项目,并生成spider模板,这里使用crawlspider。

2. 在中scrapy shell中测试选取链接要使用的正则表达式。

首先使用firefox和firebug查看源码,定位到要链接

然后在shell中打开网页:

scrapy shell  http://shanhuijj.tmall.com/search.htm?spm=a1z10.3-b.w4011-3112923129.1.KjGkS2

确定正则表达式为:http://detail.tmall.com/item.htm\?id=\d+&rn=\w+&abbucket=\d+

3. 在spider中测试上面的正则表达式

一开始我的spider是这样写的,但是parse_item函数总是没被调用

# -*- coding: utf-8 -*-
import scrapy
from scrapy.contrib.linkextractors import LinkExtractor
from scrapy.contrib.spiders import CrawlSpider, Rule

from tmall.items import TmallItem

class TmallSpider(CrawlSpider):
    name = ‘tmallSpider‘
    allowed_domains = [‘shanhuijj.tmall.com‘]
    start_urls = [‘http://shanhuijj.tmall.com/search.htm?spm=a1z10.3-b.w4011-3112923129.1.KjGkS2/‘]

    rules = (
        Rule(LinkExtractor(allow=r‘http://detail.tmall.com/item.htm\?id=\d+&rn=\w+&abbucket=\d+‘,
                           restrict_xpaths="//div[@class=‘J_TItems‘]/div/dl/dd[@class=‘detail‘]"),
             callback=‘parse_item‘, follow=False),
    )

    def parse_item(self, response):
        self.log("---------------------------------------------------------")
        item = TmallItem()
        item[‘url‘] = response.url
        return item

上面给规则加了一个 restrict_xpath参数,目的是限定寻找匹配的URL的范围

run spider得到的output是

C:\Users\Bo\PycharmProjects\tmall>scrapy crawl tmallSpider
2015-01-11 22:22:59+0800 [scrapy] INFO: Scrapy 0.24.4 started (bot: tmall)
2015-01-11 22:22:59+0800 [scrapy] INFO: Optional features available: ssl, http11
2015-01-11 22:22:59+0800 [scrapy] INFO: Overridden settings: {‘NEWSPIDER_MODULE‘: ‘tmall.spiders‘, ‘SPIDER_MODULES‘: [‘tmall.spiders‘], ‘BOT_NAME‘: ‘tmall‘}
2015-01-11 22:22:59+0800 [scrapy] INFO: Enabled extensions: LogStats, TelnetConsole, CloseSpider, WebService, CoreStats, SpiderState
2015-01-11 22:22:59+0800 [scrapy] INFO: Enabled downloader middlewares: HttpAuthMiddleware, DownloadTimeoutMiddleware, UserAgentMiddleware, RetryMiddleware, Defau
ltHeadersMiddleware, MetaRefreshMiddleware, HttpCompressionMiddleware, RedirectMiddleware, CookiesMiddleware, ChunkedTransferMiddleware, DownloaderStats
2015-01-11 22:22:59+0800 [scrapy] INFO: Enabled spider middlewares: HttpErrorMiddleware, OffsiteMiddleware, RefererMiddleware, UrlLengthMiddleware, DepthMiddlewar
e
2015-01-11 22:22:59+0800 [scrapy] INFO: Enabled item pipelines:
2015-01-11 22:22:59+0800 [tmallSpider] INFO: Spider opened
2015-01-11 22:22:59+0800 [tmallSpider] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2015-01-11 22:22:59+0800 [scrapy] DEBUG: Telnet console listening on 127.0.0.1:6024
2015-01-11 22:22:59+0800 [scrapy] DEBUG: Web service listening on 127.0.0.1:6081
2015-01-11 22:22:59+0800 [tmallSpider] DEBUG: Redirecting (302) to <GET http://jump.taobao.com/jump?target=http%3a%2f%2fshanhuijj.tmall.com%2fsearch.htm%3fspm%3da
1z10.3-b.w4011-3112923129.1.KjGkS2%2f%26tbpm%3d1> from <GET http://shanhuijj.tmall.com/search.htm?spm=a1z10.3-b.w4011-3112923129.1.KjGkS2/>
2015-01-11 22:22:59+0800 [tmallSpider] DEBUG: Redirecting (302) to <GET http://pass.tmall.com/add?_tb_token_=usBqQxmPNGXG&cookie2=1f684ca608c88f56e0df3eec780bd223
&t=323bcd0702e9fe03643e52efdb9f44bc&target=http%3a%2f%2fshanhuijj.tmall.com%2fsearch.htm%3fspm%3da1z10.3-b.w4011-3112923129.1.KjGkS2%2f%26tbpm%3d1&pacc=929hsh3NK_
FxsF9MJ5b50Q==&opi=183.128.158.212&tmsc=1420986185422946> from <GET http://jump.taobao.com/jump?target=http%3a%2f%2fshanhuijj.tmall.com%2fsearch.htm%3fspm%3da1z10
.3-b.w4011-3112923129.1.KjGkS2%2f%26tbpm%3d1>
2015-01-11 22:22:59+0800 [tmallSpider] DEBUG: Redirecting (302) to <GET http://shanhuijj.tmall.com/search.htm?spm=a1z10.3-b.w4011-3112923129.1.KjGkS2/&tbpm=1> fro
m <GET http://pass.tmall.com/add?_tb_token_=usBqQxmPNGXG&cookie2=1f684ca608c88f56e0df3eec780bd223&t=323bcd0702e9fe03643e52efdb9f44bc&target=http%3a%2f%2fshanhuijj
.tmall.com%2fsearch.htm%3fspm%3da1z10.3-b.w4011-3112923129.1.KjGkS2%2f%26tbpm%3d1&pacc=929hsh3NK_FxsF9MJ5b50Q==&opi=183.128.158.212&tmsc=1420986185422946>
2015-01-11 22:22:59+0800 [tmallSpider] DEBUG: Redirecting (302) to <GET http://shanhuijj.tmall.com/search.htm?spm=a1z10.3-b.w4011-3112923129.1.KjGkS2/> from <GET
http://shanhuijj.tmall.com/search.htm?spm=a1z10.3-b.w4011-3112923129.1.KjGkS2/&tbpm=1>
2015-01-11 22:22:59+0800 [tmallSpider] DEBUG: Crawled (200) <GET http://shanhuijj.tmall.com/search.htm?spm=a1z10.3-b.w4011-3112923129.1.KjGkS2/> (referer: None)
2015-01-11 22:22:59+0800 [tmallSpider] DEBUG: Filtered offsite request to ‘detail.tmall.com‘: <GET http://detail.tmall.com/item.htm?abbucket=17&id=10910218037&rn=
732c60a3a253eff86871e55dabc44a61>
2015-01-11 22:22:59+0800 [tmallSpider] INFO: Closing spider (finished)
2015-01-11 22:22:59+0800 [tmallSpider] INFO: Dumping Scrapy stats:
        {‘downloader/request_bytes‘: 1864,
         ‘downloader/request_count‘: 5,
         ‘downloader/request_method_count/GET‘: 5,
         ‘downloader/response_bytes‘: 74001,
         ‘downloader/response_count‘: 5,
         ‘downloader/response_status_count/200‘: 1,
         ‘downloader/response_status_count/302‘: 4,
         ‘finish_reason‘: ‘finished‘,
         ‘finish_time‘: datetime.datetime(2015, 1, 11, 14, 22, 59, 808000),
         ‘log_count/DEBUG‘: 8,
         ‘log_count/INFO‘: 7,
         ‘offsite/domains‘: 1,
         ‘offsite/filtered‘: 8,
         ‘request_depth_max‘: 1,
         ‘response_received_count‘: 1,
         ‘scheduler/dequeued‘: 5,
         ‘scheduler/dequeued/memory‘: 5,
         ‘scheduler/enqueued‘: 5,
         ‘scheduler/enqueued/memory‘: 5,
         ‘start_time‘: datetime.datetime(2015, 1, 11, 14, 22, 59, 539000)}
2015-01-11 22:22:59+0800 [tmallSpider] INFO: Spider closed (finished)

输出中出现了 ‘offsite/domains‘:1  ‘offsite/filtered‘:8 说明已经匹配到了8个链接。可是为什么parse_item方法没有执行呢?

答案是,你自己来找改过的代码与原来的代码的区别吧

# -*- coding: utf-8 -*-
import scrapy
from scrapy.contrib.linkextractors import LinkExtractor
from scrapy.contrib.spiders import CrawlSpider, Rule

from tmall.items import TmallItem

class TmallSpider(CrawlSpider):
    name = ‘tmallSpider‘
    allowed_domains = [‘shanhuijj.tmall.com‘, ‘detail.tmall.com‘]
    start_urls = [‘http://shanhuijj.tmall.com/search.htm?spm=a1z10.3-b.w4011-3112923129.1.KjGkS2/‘]

    rules = (
        Rule(LinkExtractor(allow=r‘http://detail.tmall.com/item.htm\?id=\d+&rn=\w+&abbucket=\d+‘,
                           restrict_xpaths="//div[@class=‘J_TItems‘]/div/dl/dd[@class=‘detail‘]"),
             callback=‘parse_item‘, follow=False),
    )

    def parse_item(self, response):
        self.log("---------------------------------------------------------")
        item = TmallItem()
        item[‘url‘] = response.url
        return item
时间: 2024-12-23 11:15:57

Python爬虫框架Scrapy 学习笔记 10.2 -------【实战】 抓取天猫某网店所有宝贝详情的相关文章

Python爬虫框架Scrapy 学习笔记 10.3 -------【实战】 抓取天猫某网店所有宝贝详情

第三部分 替换默认下载器,使用selenium下载页面 对详情页稍加分析就可以得出:我们感兴趣的大部分信息都是由javascript动态生成的,因此需要先在浏览器中执行javascript代码,再从最终的页面上抓取信息(当然也有别的解决方案). scrapy 本身提供了 Middleware机制.利用Dowloader Middleware可以改变默认的request对象和reponse对象,甚至替换默认的下载器.(可以对比JavaEE中的Filter理解Middleware) scrapy 架

Python爬虫框架Scrapy 学习笔记 10.1 -------【实战】 抓取天猫某网店所有宝贝详情

第一部分:任务描述 起始页面:http://shanhuijj.tmall.com/search.htm?spm=a1z10.3-b.w4011-3112923129.1.KjGkS2 这个页面列出了网店的所有宝贝,如图: 点击进入宝贝详情页面,例如:http://detail.tmall.com/item.htm?spm=a1z10.3-b.w4011-3112923129.62.xGx75B&id=10910218037&rn=918f15e64b1131d19b6f0f9585ec0

Python爬虫框架Scrapy 学习笔记 8 -------【实战】 抓取天猫宝贝详情

目标网页:http://detail.tmall.com/item.htm?id=12577759834 目标数据: 商品名称(productName), 价格区间(priceRange)月销量(monthSale) 累计评价(totalComment) 收藏人数(popularity) 成交记录(tradeRecord):买家(buyer),型号(type),数量(amount),价格(price),成交时间(tradeTime) 第一步:对网页结构

Python爬虫框架Scrapy 学习笔记 4 ------- 第二个Scrapy项目

1. 任务一,抓取以下两个URL的内容,写入文件 http://www.dmoz.org/Computers/Programming/Languages/Python/Books/ http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/ 项目截图 和上一个project不同的是,在spider中没有定义rules属性,而是定义了parse方法.这个方法告诉scrapy抓取start urls的内容后应该怎么做.第

Python爬虫框架Scrapy 学习笔记 8----Spider

什么是爬虫? 从逻辑角度讲,爬虫对应一个树.树枝是网页,树叶是感兴趣的信息. 当我们从一个URL出发查找感兴趣的信息时,当前URL返回的内容可能包含我们感兴趣的信息,也可能包含另一个可能包含我们感兴趣的信息的URL.一个爬虫对应一次信息搜索,信息搜索过程会建立起一棵树. scrapy.Spider这个类提供了接口,允许我们设计整个信息搜索的流程. 给spider传递运行时所需的参数.比如URL ?号后面的参数信息.这些信息可以选择使用crawl -a 命令传递 2. Spider循环 对spid

Python爬虫框架Scrapy 学习笔记 7------- scrapy.Item源码剖析

在前面的example中,我们知道定义一个Item类很简单,只要继承scrapy.Item,然后添加几个类型为scrapy.Field的对象作为类属性,就像下面这样 import scrapy class Product(scrapy.Item):     name = scrapy.Field()     price = scrapy.Field()     stock = scrapy.Field()     last_updated = scrapy.Field(serializer=st

Python爬虫框架Scrapy 学习笔记 9 ----selenium

selenium本是用来对web application做自动化测试的.不过,它有个天大的好处:能让我们用python(当然不仅是python)代码模拟人对浏览器的操作. 所需软件:python2.7 , firefox 25.0.1(版本不能太高), selenium2.44.0(使用pip install selenium安装即可) 1. 打开浏览器,请求百度主页,5秒钟后关闭浏览器 from selenium import webdriver import  time brower = w

Python爬虫框架Scrapy 学习笔记 1 ----- 安装

一. 安装 平台 windows 7 1. 安装 python2.7 32 位 2. 安装 Python2.7-twisted-14.0.2  下载msi安装包双击安装即可 3. 安装 python2.7对应的pip 4. 配置好python的环境变量后,打开cmd运行 : pip install scrapy pip默认为我安装了 Scrapy 0.24.4 二.相关文档下载 官方提供了PDF格式的文档,点击下载即可.文档只有205页.

Python爬虫框架Scrapy 学习笔记 5 ------- 使用pipelines过滤敏感词

还是上一篇博客的那个网站,我们增加了pipeline.py items.py from scrapy.item import Item, Field class Website(Item):     name = Field()     description = Field()     url = Field() dmoz.py from scrapy.spider import Spider from scrapy.selector import Selector from dirbot.i