本系列文章主要记录和讲解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- -*-
# Created on -- ::
# 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= * )
def on_start(self):
for i in groups:
url = groups[i] + ''
self.crawl(url, callback=self.index_page, validate_cert=False) @config(age= * * * )
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=)
def detail_page(self, response):
count_not=
notlist=[]
for i in response.doc('.bg-img-green a').items():
if i.text() <> response.doc('.from a').text():
count_not +=
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()][-].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- -*-
# Created on -- ::
# Project: learn_pyspider_db from pyspider.libs.base_handler import *
import re class Handler(BaseHandler):
crawl_config = {
} @every(minutes= * )
def on_start(self):
self.crawl('http://movie.douban.com/tag/', callback=self.index_page) @config(age= * * * )
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= * * * )
def list_tag_page(self, response):
all = response.doc('.more-links')
self.crawl(all.attr.href, callback=self.list_page) @config(age=***)
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=)
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()[].text
break
return {
"url": response.url,
"title": response.doc('title').text(),
"director": director,
}

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

#!/usr/bin/env python
# -*- encoding: utf- -*-
# Created on -- ::
# Project: qx_zj_poi2 import re
from pyspider.libs.base_handler import * class Handler(BaseHandler):
crawl_config = {
} @every(minutes= * )
def on_start(self):
self.crawl('http://www.poi86.com/poi/amap/province/330000.html', callback=self.city_page) @config(age= * * )
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= * * )
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= * * )
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=)
def poi_dtl_page(self, response):
return {
"url": response.url,
"id": re.findall('\d+',response.url)[],
"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(),
}

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

  1. pyspider用PyQuery解析页面数据

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

  2. pyspider示例代码:解析JSON数据

    pyspider示例代码官方网站是http://demo.pyspider.org/.上面的示例代码太多,无从下手.因此本人找出一下比较经典的示例进行简单讲解,希望对新手有一些帮助. 示例说明: py ...

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

    本系列文章主要记录和讲解pyspider的示例代码,希望能抛砖引玉.pyspider示例代码官方网站是http://demo.pyspider.org/.上面的示例代码太多,无从下手.因此本人找出一下 ...

  4. pyspider示例代码一:利用phantomjs解决js问题

    本系列文章主要记录和讲解pyspider的示例代码,希望能抛砖引玉.pyspider示例代码官方网站是http://demo.pyspider.org/.上面的示例代码太多,无从下手.因此本人找出一下 ...

  5. 找到你的位置(JS在页面中的位置)最常用的方式是在页面中head部分放置<script>元素,浏览器解析head部分就会执行这个代码,然后才解析页面的其余部分

    找到你的位置(JS在页面中的位置) 我们可以将JavaScript代码放在html文件中任何位置,但是我们一般放在网页的head或者body部分. 放在<head>部分 最常用的方式是在页 ...

  6. pyspider示例代码五:实现自动翻页功能

    实现自动翻页功能 示例代码一 #!/usr/bin/env python # -*- encoding: utf- -*- # Created on -- :: # Project: v2ex fro ...

  7. python爬虫解析页面数据的三种方式

    re模块 re.S表示匹配单行 re.M表示匹配多行 使用re模块提取图片url,下载所有糗事百科中的图片 普通版 import requests import re import os if not ...

  8. pyspider示例代码六:传递参数

    传递参数 示例一 #!/usr/bin/env python # -*- encoding: utf- -*- # vim: ts= sts= ff=unix fenc=utf8: # Created ...

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

    自动登陆并获得PDF文件下载地址 #!/usr/bin/env python # -*- encoding: utf- -*- # Created on -- :: # Project: pdf_sp ...

随机推荐

  1. 使用VS2008进行WEB负载测试

    软件测试中使用VS2008进行WEB负载测试 最近接触关于多线程的软件测试,所以对vs2005里的测试开始感兴趣,今天学习试用了一下,记下所获得的. vs 测试分“WEB测试”,“单元测试”,“负载测 ...

  2. ubuntu17.10安装LAMP并测试部署php探针系统

    ubuntu17.10修改密码以及安装LAMP并部署php探针系统 步骤1:ubuntu17.10配置IP (这个版本配置IP方式改变较大,apt-get upgrade更新至最新以前配置方式也可以用 ...

  3. HDFS 和 YARN 的 HA 故障切换【转】

    来源:https://blog.csdn.net/u011414200/article/details/50336735 一 非 HDFS HA 集群转换成 HA 集群二 HDFS 的 HA 自动切换 ...

  4. linux系统报错日志学习

    linux本身会自动记录系统报错日志:/var/log/messages 这个日志记录,我是在什么时候发现其强大的作用的呢?它有点像我们使用php脚本开发接口的时候技术员在重要地方打日志的效果,方便技 ...

  5. java 面向对象 — 类和对象

    构造方法 1.构造器必须与类同名(如果一个源文件中有多个类,那么构造器必须与公共类同名) 2.每个类可以有一个以上的构造器 3.构造器可以有0个.1个或1个以上的参数 4.构造器没有返回值 5.构造器 ...

  6. Python基础之文件

    输出一行一行的,效率更高 一个任务: 主函数:

  7. IDEA无法下载plugin的解决办法

    有些时候我们在用IDEA安装plugins的时候,会因为各种原因搜索不到想要的依赖,或者搜索到却无法安装,针对这个问题,现在这里有两种方法可以尝试一下. 第一种: 找到settings->sys ...

  8. jQuery ajax 当async为false时解决同步操作失败的问题

    jQuery的ajax,当async为false时,同步操作失败.解决方案,jqueryasync 最近做项目遇到jQuery的ajax,当async为false时,同步操作失败的问题,上网搜索下,得 ...

  9. 第八章 Mixer 适配器的应用

    概述: Mixer “知晓”每一次服务间的调用过程,这些调用过程会为Mixer提供丰富的相关信息,Mixer通过接入的适配器对这些信息进行处理,能够在调用的预检(执行前)和报告(执行后)阶段执行多种任 ...

  10. android中一个评分的控件

    RatingBar android中一个评分的控件 如何使用 Android Studio下: dependencies { compile 'com.hedgehog.ratingbar:app:1 ...