python scrapy爬取动态页面

preface:最近学习工作之外,有个朋友需要爬取动态网页的要求,输入关键词爬取某个专利网站在该关键词下的一些专利说明。以往直接python urllib2可破,但是那只是对于静态网页可破,但是对于用js等其他的生成的动态网页的话,则貌似不行(没试过)。然后在网上找了些资料,发现scrapy结合selenium包好像可以。(之所以这么说,暂时卤主也还没实现,先记录下来。)

#=====================根据官网中简单的介绍作个人理解========================

首先,安装scrapy,selenium两个包:

卤主在ubuntu下,并且已经安装好了anaconda和pip以及easy_intasll,所以直接用pip安装一步到位(或者easy_install):

pip install -U selenium
pip install Scrapy
easy_install  -U selenium
easy_install  Scrapy

其次,需要用scrapy新建项目,在终端运行如下命令新建项目:

scrapy startproject tutorial
则自动生成如下形式的文件夹:

Figure 1:新建项目后的文件夹

再次,开始编写项目:

在items.py文件中需要定义一些变量:

import scrapy

class DmozItem(scrapy.Item):
    title = scrapy.Field()
    link = scrapy.Field()
    desc = scrapy.Field()

在文件夹tutorial/spiders下新建dmoz_spider.py文件:


import scrapy

class DmozSpider(scrapy.Spider):
    name = "dmoz"
    allowed_domains = ["dmoz.org"]
    start_urls = [
        "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
        "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
    ]

    def parse(self, response):
        filename = response.url.split("/")[-2]
        with open(filename, 'wb') as f:
            f.write(response.body)
在该文件中需要定义三个变量,其一为name,start_urls,parse这三个变量。

最后,在最外层文件夹下终端运行:

scrapy crawl dmoz

dmoz为文件夹tutorial/spiders下新建的文件中DmozSpider类中重要的变量之一name的值。

便能开始爬取。

#=============================================

博友:http://chenqx.github.io/2014/12/23/Spider-Advanced-for-Dynamic-Website-Crawling/

介绍了抓取动态网站的一些内容,并且在github上共享了完整的项目代码。(先下载代码,对着代码看文档)

其gouwu.sogou.com任务为动态抓取页面信息。

卤主针对自己的任务,更改其gouwu.sogou.com/etao/lstData.py文件,里面lstData类lst列表变量里面为搜索的关键词,传入到spider.py文件,组成url,开始爬取。

分析博友的代码没找到爬取下来的动态页面信息存在哪里的代码,

在spider.py文件中加入自己的代码:

    def parse(self, response):
        #crawl all display page
        for link in self.link_extractor['page_down'].extract_links(response):
            yield Request(url = link.url, callback=self.parse)

        #browser
        self.browser.get(response.url)
        time.sleep(5)
        # get the data and write it to scrapy items
        etaoItem_loader = ItemLoader(item=EtaoItem(), response = response)
        url = str(response.url)
        etaoItem_loader.add_value('url', url)
        etaoItem_loader.add_xpath('title', self._x_query['title'])
        etaoItem_loader.add_xpath('name', self._x_query['name'])
        etaoItem_loader.add_xpath('price', self._x_query['price'])
        #====================================
#        for link in self.link_extractor['page_down'].extract_links(response):
#            yield Request(url = link.url, callback = self.parse_detail)
        for sel in response.xpath('//ul/li'):
            title = sel.xpath('a/text()').extract()
            link2 = sel.xpath('a/@href').extract()
            desc = sel.xpath('text()').extract()
            for i in title:
                print i,
            for j in link2:
                print j,"+++++++++++++"
        #====================================
        yield etaoItem_loader.load_item()

能分析一些东西,但还不够,还需继续分析返回来的动态页面的源代码,更改抽取器extractor,选择器selector(还未开始难过),以便得到想要的结果。selenium包好像没用上。

#=============================================

卤主参考的一些资料:

scrapy官网:http://doc.scrapy.org/en/latest/intro/tutorial.html

scrapy中文翻译:http://scrapy-chs.readthedocs.org/zh_CN/latest/

selenium官网:http://selenium-python.readthedocs.org/

scrapy选择器:http://doc.scrapy.org/en/0.24/topics/selectors.html#topics-selectors

博友博客:http://blog.csdn.net/pleasecallmewhy/article/details/19642329

博友博客:http://chenqx.github.io/2014/12/23/Spider-Advanced-for-Dynamic-Website-Crawling/
博友博客:http://chenqx.github.io/2014/11/09/Scrapy-Tutorial-for-BBSSpider/

博友博客(selenium):http://www.cnblogs.com/fnng/archive/2013/05/29/3106515.html

存取问题:http://my.oschina.net/HappyRoad/blog/173510


发布了127 篇原创文章 · 获赞 125 · 访问量 88万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览