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

第三部分 替换默认下载器,使用selenium下载页面


对详情页稍加分析就可以得出:我们感兴趣的大部分信息都是由javascript动态生成的,因此需要先在浏览器中执行javascript代码,再从最终的页面上抓取信息(当然也有别的解决方案)。

scrapy 本身提供了 Middleware机制。利用Dowloader Middleware可以改变默认的request对象和reponse对象,甚至替换默认的下载器。(可以对比JavaEE中的Filter理解Middleware)

scrapy 架构图

由于middleware的配置比较复杂,在这里我们采用一个简单的方法:改用最简单的spider,在parse函数中用selenium下载详情页面。

  1. 改写CrawlSpider为默认Spider,在parse函数中获取详情页面的链接
# -*- 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‘
    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(self, response):
       linkExtractor = 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‘]")
       linkList = linkExtractor.extract_links(response)
       for link in linkList:
           self.log("******************************************************")
           self.log(link.url)

2. 用firefox打开详情页面链接,获取页面源文件,查看得到的源文件是不是执行过js的“源文件”

def parse(self, response):
    linkExtractor = 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‘]")
    linkList = linkExtractor.extract_links(response)
    # open Firefox
    browser = webdriver.Firefox()
    file = open("C:\\pageSource.html", ‘w‘); flag = 0
    for link in linkList:
        browser.get(link.url)
        pageSource = browser.page_source
        if flag == 0:
            file.write(pageSource)
            file.close()
            flag = 1

    browser.close()

很不幸,试图写入文件时得到一个错误信息:

            file.write(pageSource)
        exceptions.UnicodeEncodeError: ‘ascii‘ codec can‘t encode characters in position 8427-8443: ordinal not in range(128)

这是由于系统默认编码是ascii,python解释器试图将unicode编码的内容先转换成ascii编码再写入文件。

提前设置一下系统编码就可以解决这个问题。在文件头部加入:

import sys
reload(sys)
sys.setdefaultencoding(‘utf-8‘)

查看源文件发现,页面上信息还是不全,例如

可以很高兴地看到,累计评价的信息已经有了(在最初的源文件中是没有的),但是月销量的数字还没显示出来。原因可能是我们通过brower.page_source请求源码的时候,js还没执行完。我们等浏览器10秒钟再试一下

for link in linkList:
    browser.get(link.url)
    time.sleep(10)  # wait for 10 seconds
    pageSource = browser.page_source
    if flag == 0:
        file.write(pageSource)
        file.close()
        flag = 1

此时再看得到的源文件,月销量的数据已经出现了

实际上除了月成交记录的详情信息,其它数据都已经出现在了源码里。

月成交记录的详情信息是鼠标触发的一个ajax请求,后面我们会用scrapy模拟ajax请求,这样可以直接从response中得到json格式交易记录详情。

到目前为止, spider的代码如下:

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

import sys
reload(sys)
sys.setdefaultencoding(‘utf-8‘)

import scrapy
from scrapy.contrib.linkextractors import LinkExtractor
from scrapy.contrib.spiders import CrawlSpider, Rule
from selenium import webdriver
import  time
from tmall.items import TmallItem

class TmallSpider(CrawlSpider):
    name = ‘tmallSpider‘
    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(self, response):
        linkExtractor = 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‘]")
        linkList = linkExtractor.extract_links(response)
        # open Firefox
        browser = webdriver.Firefox()
        file = open("C:\\pageSource.html", ‘wb‘); flag = 0
        for link in linkList:
            browser.get(link.url)
            time.sleep(10)
            pageSource = browser.page_source
            if flag == 0:
                file.write(pageSource)
                file.close()
                flag = 1

        browser.close()
时间: 2025-02-01 17:48:04

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

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

第二部分 抽取起始页中进入宝贝详情页面的链接 创建项目,并生成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://deta

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