pyspider示例代码三:用PyQuery解析页面数据

本系列文章主要记录和讲解pyspider的示例代码,希望能抛砖引玉。pyspider示例代码官方网站是http://demo.pyspider.org/。上面的示例代码太多,无从下手。因此本人找出一下比较经典的示例进行简单讲解,希望对新手有一些帮助。

示例说明:

本示例主要是PyQuery解析返回的response页面数据。response.doc解析页面数据是pyspider的主要用法,应该熟练掌握基本使用方法。其他返回类型示例见后续文章。

pyspider爬取的内容通过回调的参数response返回,response有多种解析方式。
1、response.json用于解析json数据
2、response.doc返回的是PyQuery对象
3、response.etree返回的是lxml对象
4、response.text返回的是unicode文本
5、response.content返回的是字节码

使用方法:

PyQuery可以采用CSS选择器作为参数对网页进行解析。 关于PyQuery更多用法,可以参考PyQuery complete API。

PyQuery官方参考手册: https://pythonhosted.org/pyquery/

response.doc(‘.ml.mlt.mtw.cl > li‘).items()
response.doc(‘.pti > .pdbt > .authi > em > span‘).attr(‘title‘)

CSS选择器:更多详情请参考CSS Selector Reference

选择器 示例 示例说明
.class .intro Selects all elements with class=”intro”
#id #firstname Selects the element with id=”firstname”
element p Selects all <p> elements
element,element div, p Selects all <div> elements and all <p> elements
element element div p Selects all <p> elements inside <div> elements
element>element div > p Selects all <p> elements where the parent is a <div> element
[attribute] [target] Selects all elements with a target attribute
[attribute=value] [target=_blank] Selects all elements with target=”_blank”
[attribute^=value] a[href^=”https”] Selects every <a> element whose href attribute value begins with “https”
[attribute$=value] a[href$=”.pdf”] Selects every <a> element whose href attribute value ends with “.pdf”
[attribute*=value] a[href*=”w3schools”] Selects every <a> element whose href attribute value contains the substring “w3schools”
:checked input:checked Selects every checked <input> element

示例代码:

1、PyQuery基本语法应用

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# Created on 2016-10-09 15:16:04
# Project: douban_rent

from pyspider.libs.base_handler import *

groups = {‘上海租房‘: ‘https://www.douban.com/group/shanghaizufang/discussion?start=‘,
          ‘上海租房@长宁租房/徐汇/静安租房‘: ‘https://www.douban.com/group/zufan/discussion?start=‘,
          ‘上海短租日租小组 ‘: ‘https://www.douban.com/group/chuzu/discussion?start=‘,
          ‘上海短租‘: ‘https://www.douban.com/group/275832/discussion?start=‘,
          }

class Handler(BaseHandler):
    crawl_config = {
    }

    @every(minutes=24 * 60)
    def on_start(self):
        for i in groups:
            url = groups[i] + ‘0‘
            self.crawl(url, callback=self.index_page, validate_cert=False)

    @config(age=10 * 24 * 60 * 60)
    def index_page(self, response):
        for each in response.doc(‘.olt .title a‘).items():
            self.crawl(each.attr.href, callback=self.detail_page)

        #next page
        for each in response.doc(‘.next a‘).items():
            self.crawl(each.attr.href, callback=self.index_page)

    @config(priority=2)
    def detail_page(self, response):
        count_not=0
        notlist=[]
        for i in response.doc(‘.bg-img-green a‘).items():
            if i.text() <> response.doc(‘.from a‘).text():
                count_not +=1
                notlist.append(i.text())
        for i in notlist: print i

        return {
            "url": response.url,
            "title": response.doc(‘title‘).text(),
            "author": response.doc(‘.from a‘).text(),
            "time": response.doc(‘.color-green‘).text(),
            "content": response.doc(‘#link-report p‘).text(),
            "回应数": len([x.text() for x in response.doc(‘h4‘).items()])   ,
            # "最后回帖时间": [x for x in response.doc(‘.pubtime‘).items()][-1].text(),
            "非lz回帖数": count_not,
            "非lz回帖人数": len(set(notlist)),
            # "主演": [x.text() for x in response.doc(‘.actor a‘).items()],
        }

2、PyQuery基本语法应用

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# Created on 2015-10-09 09:00:10
# Project: learn_pyspider_db

from pyspider.libs.base_handler import *
import re

class Handler(BaseHandler):
    crawl_config = {
    }

    @every(minutes=24 * 60)
    def on_start(self):
        self.crawl(‘http://movie.douban.com/tag/‘, callback=self.index_page)

    @config(age=10 * 24 * 60 * 60)
    def index_page(self, response):
        for each in response.doc(‘.tagCol a‘).items():
            self.crawl(each.attr.href, callback=self.list_tag_page)

    @config(age=10 * 24 * 60 * 60)
    def list_tag_page(self, response):
        all = response.doc(‘.more-links‘)
        self.crawl(all.attr.href, callback=self.list_page)

    @config(age=10*24*60*60)
    def list_page(self, response):
        for each in response.doc(‘.title‘).items():
            self.crawl(each.attr.href, callback=self.detail_page)
        # craw the next page
        next_page = response.doc(‘.next > a‘)
        self.crawl(next_page.attr.href, callback=self.list_page)

    @config(priority=2)
    def detail_page(self, response):
        director = ‘‘
        for item in response.doc(‘#info > span > .pl‘):
            if item.text == u‘导演‘:
                next_item = item.getnext()
                director = next_item.getchildren()[0].text
                break
        return {
            "url": response.url,
            "title": response.doc(‘title‘).text(),
            "director": director,
        }

3、PyQuery复杂选择及翻页处理

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# Created on 2016-10-12 06:39:31
# Project: qx_zj_poi2

import re
from pyspider.libs.base_handler import *

class Handler(BaseHandler):
    crawl_config = {
    }

    @every(minutes=24 * 60)
    def on_start(self):
        self.crawl(‘http://www.poi86.com/poi/amap/province/330000.html‘, callback=self.city_page)

    @config(age=24 * 60 * 60)
    def city_page(self, response):
        for each in response.doc(‘body > div:nth-child(2) > div > div.panel-body > ul > li > a‘).items():
            self.crawl(each.attr.href, callback=self.district_page)

    @config(age=24 * 60 * 60)
    def district_page(self, response):
        for each in response.doc(‘body > div:nth-child(2) > div > div.panel-body > ul > li > a‘).items():
            self.crawl(each.attr.href, callback=self.poi_idx_page)

    @config(age=24 * 60 * 60)
    def poi_idx_page(self, response):
        for each in response.doc(‘td > a‘).items():
            self.crawl(each.attr.href, callback=self.poi_dtl_page)
        # 翻页
        for each in response.doc(‘body > div:nth-child(2) > div > div.panel-body > div > ul > li:nth-child(13) > a‘).items():
            self.crawl(each.attr.href, callback=self.poi_idx_page)

    @config(priority=100)
    def poi_dtl_page(self, response):
        return {
            "url": response.url,
            "id": re.findall(‘\d+‘,response.url)[1],
            "name": response.doc(‘body > div:nth-child(2) > div:nth-child(2) > div.panel-heading > h1‘).text(),
            "province": response.doc(‘body > div:nth-child(2) > div:nth-child(2) > div.panel-body > ul > li:nth-child(1) > a‘).text(),
            "city": response.doc(‘body > div:nth-child(2) > div:nth-child(2) > div.panel-body > ul > li:nth-child(2) > a‘).text(),
            "district": response.doc(‘body > div:nth-child(2) > div:nth-child(2) > div.panel-body > ul > li:nth-child(3) > a‘).text(),
            "addr": response.doc(‘body > div:nth-child(2) > div:nth-child(2) > div.panel-body > ul > li:nth-child(4)‘).text(),
            "tel": response.doc(‘body > div:nth-child(2) > div:nth-child(2) > div.panel-body > ul > li:nth-child(5)‘).text(),
            "type": response.doc(‘body > div:nth-child(2) > div:nth-child(2) > div.panel-body > ul > li:nth-child(6)‘).text(),
            "dd_map": response.doc(‘body > div:nth-child(2) > div:nth-child(2) > div.panel-body > ul > li:nth-child(7)‘).text(),
            "hx_map": response.doc(‘body > div:nth-child(2) > div:nth-child(2) > div.panel-body > ul > li:nth-child(8)‘).text(),
            "bd_map": response.doc(‘body > div:nth-child(2) > div:nth-child(2) > div.panel-body > ul > li:nth-child(9)‘).text(),
        }
时间: 11-27

pyspider示例代码三:用PyQuery解析页面数据的相关文章

pyspider示例代码二:解析JSON数据

本系列文章主要记录和讲解pyspider的示例代码,希望能抛砖引玉.pyspider示例代码官方网站是http://demo.pyspider.org/.上面的示例代码太多,无从下手.因此本人找出一下比较经典的示例进行简单讲解,希望对新手有一些帮助. 示例说明: pyspider爬取的内容通过回调的参数response返回,response有多种解析方式.1.response.json用于解析json数据2.response.doc返回的是PyQuery对象3.response.etree返回的

pyspider示例代码:解析JSON数据

pyspider示例代码官方网站是http://demo.pyspider.org/.上面的示例代码太多,无从下手.因此本人找出一下比较经典的示例进行简单讲解,希望对新手有一些帮助. 示例说明: pyspider爬取的内容通过回调的参数response返回,response有多种解析方式.1.response.json用于解析json数据2.response.doc返回的是PyQuery对象3.response.etree返回的是lxml对象4.response.text返回的是unicode文

pyspider示例代码七:自动登陆并获得PDF文件下载地址

自动登陆并获得PDF文件下载地址 #!/usr/bin/env python # -*- encoding: utf-8 -*- # Created on 2015-03-22 22:06:55 # Project: pdf_spider import re from pyspider.libs.base_handler import * class Handler(BaseHandler): global Cookie Cookie= {"tsclub_bb90_saltkey":&

【Android应用开发】 Universal Image Loader ( 使用简介 | 示例代码解析 )

作者 : 韩曙亮 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/50824912 相关地址介绍 : -- Universal Image Loader 项目 GitHub 官方地址 : https://github.com/nostra13/Android-Universal-Image-Loader . -- Universal Image Loader 项目完整中文注释版, 已经将所有类都进行了中文注释, 适合源码学习参

jsp页面使用javascript添加页面元素示例代码

<body>    <input type="button" value="test" onclick="javascript:a();">    <table id="tab">      <tr>       <td>1</td>       <td><input name="11" type="text

C/C++ 开源库及示例代码

C/C++ 开源库及示例代码 Table of Contents 说明 1 综合性的库 2 数据结构 & 算法 2.1 容器 2.1.1 标准容器 2.1.2 Lockfree 的容器 2.1.3 环形缓冲 2.1.4 多维数组 2.1.5 图 2.2 对容器的操作 2.3 字符串处理 2.3.1 字符集 2.3.2 字符串格式化 2.3.3 正则表达式 2.3.4 (其它) 2.4 内存相关 2.4.1 智能指针 2.4.2 内存池 2.5 时间 & 日期 2.6 编码 & 解码

左右JAVA示例代码事件分发和监督机制来实现-绝对原创有用

文章标题:左右JAVA示例代码事件分发和监督机制来实现 文章地址: http://blog.csdn.net/5iasp/article/details/37054171 作者: javaboy2012Email:[email protected]qq:    1046011462 一.场景如果 如果有博客系统中须要实现例如以下功能: 系统中用户公布文章.改动文章.删除文章时,须要一些相关的操作须要运行. 公布文章后,给好友发送邮件通知.给用户加积分,对文章做全文索引. 改动文章后,给好友发送邮

Swift常用语法示例代码(一)

此篇文章整理自我以前学习Swift时的一些练习代码,其存在的意义多是可以通过看示例代码更快地回忆Swift的主要语法. 如果你想系统学习Swift或者是Swift的初学者请绕路,感谢Github上The Swift Programming Language开源翻译的中文版,感谢极客学院wiki提供的PDF版本. 代码和PDF版本上传至Github,有兴趣的可以下载下来试试. SwiftTour Base var str = "Hello, World!" print(str) // 变

构建施耐德楼控系统数据库后台服务器示例工程三(Web端展示)

最近看到Extjs的示例中有仿操作系统桌面的代码,并且展示效果很美观,结合楼控这个系统的Web端展示需求,目前前端采用Extjs.楼控相关的操作会设计成桌面中的不同应用. Extjs初次入手看起来很复杂,但是由于其自带的示例代码很丰富,通常在了解一些基本概念后,参照着示例代码一步一步去做,我认为是最好的学习方式了. 目前我参照着Extjs中仿照桌面的示例代码,做出了如下的画面: 从图中我们可以看出,我目前在仿照着这个示例代码中的GridPanel.TabPanel.Window这些基本的组件,做