`

【Python真的很强大】使用yield优雅抓取网页分页数据

阅读更多

使用yield优雅抓取网页分页数据

在使用Python来抓取网页数据的时候,常常碰到分页数据,其中部分下一页按钮已经有具体的链接地址,而另外的可能是javascript来处理分页的。这要求同时能解析页面内容,又要采集下一页的url。怎样优雅用python写这样的代码呢?或者说怎样更pythonic?

下面分别给出部分代码实例

 

 

def get_next_page(obj):
                '''get next page content from a url or another content '''
                error_occurred = False
                for retry2 in xrange(3):
                    try:
                        if isinstance(obj, (basestring, unicode)):
                            resp = curr_session.get(obj, timeout=TIMEOUT, headers=headers,
                                                    cookies=cookies, allow_redirects=True)
                            content = resp.content
                            save_html_content(obj, content)
                            error_occurred = False
                        else:
                            content = obj
                        soup = BeautifulSoup(content, features='html5lib', from_encoding="utf8")
                        e_next_page = soup.find('a', text="下頁")
                        break
                    except:
                        error_occurred = True
                        time.sleep(2)
                if error_occurred:
                    yield content
                    return
                if e_next_page:
                    next_url = "http://www.etnet.com.hk" + e_next_page.get('href')
                    time.sleep(2)
                    yield content
                    for i in get_next_page(next_url):
                        yield i
                else:
                    yield content

 

def get_next_page(obj, page=1):
        '''get next page content from a url or another content '''
        error_occurred = False
        for retry2 in xrange(3):
            try:
                if isinstance(obj, (basestring, unicode)):
                    resp = curr_session.get(obj, timeout=TIMEOUT, headers=headers,
                                            cookies=cookies, allow_redirects=True)
                    content = resp.content
                    save_html_content(obj, content)
                    hrefs = re.findall('industrysymbol=.*&market_id=[^;]+', content)
                    if page == 1 and (not "sh=" in obj) and hrefs:
                        reset_url = ("http://www.aastocks.com/tc/cnhk/market/industry"
                                     "/sector-industry-details.aspx?%s&page=1" % \
                            (hrefs[0].replace('sh=1', 'sh=0').replace('&page=', '') \
                             .replace("'", '').split()[0]))
                        for next_page in get_next_page(reset_url):
                            yield next_page
                        return
                    error_occurred = False
                else:
                    content = obj
                soup = BeautifulSoup(content, features='html5lib', from_encoding="utf8")
                e_next_page = soup.find('td', text="下一頁 ")
                break
            except:
                error_occurred = True
                LOG.error(traceback.format_exc())
                time.sleep(2)
        if error_occurred:
            yield content
            return
        if e_next_page:
            hrefs = re.findall('industrysymbol=.*&market_id=[^;]+', content)
            if hrefs:
                next_url = ("http://www.aastocks.com/tc/cnhk/market/industry/sector-industry"
                            "-details.aspx?%s&page=%d" % \
                            (hrefs[0].replace('sh=1', 'sh=0') \
                             .replace('&page=', '').replace("'", '').split()[0], page+1))
            time.sleep(2)
            yield content
            for next_page in get_next_page(next_url, page+1):
                yield next_page
        else:
            yield content

 

 

for curr_href in e_href:
                retry_interval = random.randint(MIN_INTERVAL_SECONDS_FOR_RETRIEVING,
                                                MAX_INTERVAL_SECONDS_FOR_RETRIEVING)
                time.sleep(retry_interval)
                contents = get_next_page(curr_href)
                for content in contents:
                    get_page_data(content)

 

0
0
分享到:
评论

相关推荐

    scrapy分页及详情页数据爬取

    在这个"scrapy分页及详情页数据爬取"的项目中,我们主要关注如何使用Scrapy来实现对51job网站的主页和详情页的数据抓取,并将数据保存到日志文件中。 首先,我们需要创建一个Scrapy项目。通过运行`scrapy ...

    Python爬取同花顺每日股票公告信息实例

    在Python编程领域,爬虫技术...这个实例不仅展示了Python Scrapy框架的基本使用,还涵盖了网页数据的提取、爬虫的分页处理以及数据存储等关键环节,对于学习Python爬虫和金融数据分析的人来说是非常有价值的实践案例。

    Python 爬取校花网资源、批量下载图片,scrapy 框架 入门经典

    Python爬虫技术是数据获取的重要工具,特别是在网络资源丰富的今天,它被广泛应用于网页信息抓取、数据分析等领域。Scrapy框架则是Python爬虫开发中的一个高效解决方案,特别适合大规模、结构化的网页抓取任务。本篇...

    Python-百度贴吧爬虫基于scrapy和mysql

    在Python的Web爬虫领域,Scrapy是一个强大而高效的框架,常用于构建数据抓取项目。它提供了丰富的功能,如请求调度、中间件处理、数据清洗等,使得爬虫开发变得更加便捷。而MySQL作为流行的开源关系型数据库,常用于...

    Python爬虫-当当网玄幻书籍信息的爬取

    Python爬虫技术在数据获取和信息挖掘领域中扮演着重要角色,而Scrapy是一个功能强大的Python爬虫框架,尤其适合大型、复杂的网络抓取任务。本项目“Python爬虫-当当网玄幻书籍信息的爬取”是针对初学者的一次实践...

    scrapy 封装的爬取社保信息

    Scrapy 是一个强大的 Python 网络爬虫框架,它为开发者提供了构建高效、可扩展的网络爬虫的工具。在这个“scrapy 封装的爬取社保信息”项目中,我们将探讨如何利用 Scrapy 框架来抓取与社保相关的数据。社保信息通常...

    scrapy爬取文章站源码(可直接执行)

    Scrapy是一个强大的Python爬虫框架,它为网络数据抓取提供了高效的工具集,适用于复杂的网页抓取任务。本文将深入探讨如何使用Scrapy框架来爬取文章网站的源码,并结合提供的`seventeen_news`项目,帮助初学者快速...

    web-scraper:使用Scrapy,从网页上抓取您项目的数据

    Scrapy是一个强大的Python框架,专为爬取网站并从中提取结构化数据而设计。它提供了高效、可扩展的工具,让开发者能够轻松地构建网络爬虫项目,处理大量的网页数据。在本文中,我们将深入探讨如何使用Scrapy来构建一...

    python使用 Scrapy 爬取唯美女生网站的图片资源

    Scrapy是一个强大的Python爬虫框架,它为开发者提供了一套高效、灵活的工具,使得构建网络爬虫变得简单。在本教程中,我们将探讨如何利用Scrapy来爬取"唯美女生"网站上的美女图片资源,并将这些图片保存到本地。 ...

    Python-爬取百度图片的scrapy爬虫实现

    Scrapy是一个强大的Python框架,专为爬取网站并提取结构化数据而设计。在这个名为"Python-爬取百度图片的scrapy爬虫实现"的项目中,我们将深入探讨如何使用Scrapy来抓取百度图片。首先,让我们了解Scrapy的基本架构...

    使用Scrapy框架爬取房天下房源信息.pptx

    Scrapy是一个强大的Python爬虫框架,它简化了网络爬虫的开发过程,使得数据抓取、处理和存储变得更加高效。 首先,要开始一个Scrapy项目,你需要在命令行中使用`scrapy startproject [project_name]`命令创建一个新...

    scrapy爬取某股票网站入门实例

    Scrapy是一个强大的Python爬虫框架,它为开发者提供了一套高效、灵活的工具,用于抓取网页并提取结构化数据。在这个"scrapy爬取某股票网站入门实例"中,我们将学习如何使用Scrapy来抓取股票网站上的股票ID和名称。...

    spiderQiubai

    `Python Scrapy` 是一个强大的、开源的网络爬虫框架,用于高效地抓取网站数据。它以其模块化的设计和丰富的功能而受到广大开发者喜爱,尤其适合处理大规模的数据抓取任务。在这个项目中,我们将深入探讨如何使用...

    Scrapy例子-hr网站

    Scrapy是一个强大的Python爬虫框架,专为数据抓取和数据处理设计,广泛应用于Web页面内容提取、数据挖掘以及搜索引擎索引等任务。本项目是一个关于HR(人力资源)网站的数据抓取实例,通过使用Scrapy,我们可以高效...

    新浪微博图片爬虫

    Scrapy是一个强大的Python爬虫框架,它提供了一个完整的框架,使得开发者能够专注于爬虫的核心逻辑,而无需处理网络请求、数据解析等琐碎问题。要使用Scrapy,首先需要安装它,通常通过Python的包管理器pip进行: `...

    使用scrapy爬取伯乐在线文章并保存到mysql

    Scrapy是一个强大的Python爬虫框架,它为开发者提供了一套高效、灵活的工具,用于爬取网站并提取结构化数据。在这个项目中,我们利用Scrapy来爬取伯乐在线的文章,并将抓取到的数据存储到MySQL数据库中,实现数据的...

    使用scrapy爬去伯乐在线文章

    Scrapy是一个强大的Python爬虫框架,它为开发者提供了一套高效、灵活的工具,用于爬取网站并提取结构化数据。伯乐在线是一个知名的IT技术社区,包含了大量的技术文章和资源,非常适合用作爬虫练习的目标。下面我们将...

    scrapy的简单demo

    Scrapy是一个强大的Python爬虫框架,它为网络数据抓取提供了高效的工具和API,使得开发者可以专注于编写爬取逻辑,而无需关注底层实现。在这个简单的Scrapy demo中,我们将探讨如何搭建一个基本的Scrapy项目,理解其...

    本资源仅用作交流学习,欢迎各位下载交流。有不足之处欢迎指出。

    Scrapy是一个强大的Python爬虫框架,它为开发者提供了一套完整的解决方案来构建网络爬虫,高效地抓取网站数据并进行处理。51前程无忧是中国知名的招聘网站,其丰富的职位信息对于数据分析、市场研究等领域具有重要...

Global site tag (gtag.js) - Google Analytics