之前使用python3.4+selenium实现了爬58同城的详细信息,这次用pyspider实现,网上搜了下,目前比较流行的爬虫框架就是pyspider和scrapy,但是scrapy不支持python3,所以…

直接上代码,后面注解:

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# Created on 2016-04-17 16:54:22
# Project: tongcheng

from pyspider.libs.base_handler import *

class Handler(BaseHandler):
    crawl_config = {
                    'itag':'v226'  
    }

@every(minutes=24 * 60)
    def on_start(self):
        self.crawl('http://sz.58.com/pbdn/0/pn1/', callback=self.index_page)

@config(age=10 * 24 * 60 * 60)
    def index_page(self, response):
        for each in response.doc('#infolist a.t').items():
            if ('Mzhuanzhuan' not in str(each.attr.href)) and ('jump' not in each.attr.href):
                self.crawl(each.attr.href, callback=self.detail_page,fetch_type='js')

@config(priority=2)
    def detail_page(self, response):

return {
            "provice":response.doc('.crb_i a').eq(1).text(),
            "title":response.doc('.col_sub.mainTitle h1').text(),
             "data":response.doc(".time").text(),
            "views":response.doc("#totalcount").text(),
            "price":response.doc(".price.c_f50").text(),
            "condition":response.doc("#content > div.person_add_top.no_ident_top > div.per_ad_left > div.col_sub.sumary > ul > li:nth-child(2) > div.su_con > span").text(),
             "area":response.doc(".c_25d").find('a').text() if response.doc(".c_25d").find('a').text()!='' else "无",
             "seller":response.doc("#divContacter > ul > ul > li > a").text()
           
        }

crawl_config = { 'itag':'v226'  } #访问表头,useragent等请求信息都是在这里配置,其中itag表示版本的意思。pyspider有一个机制,如果在主页run一遍,那么每个请求的url都会有一个md5,标记这个任务已经结束,你再次点击run,pyspider不会再去请求同样的url,所以有时候我们修改完代码后,需要让任务执行一遍,重新将itag的版本号改一下就行。

on_start 函数类似java main函数,是运行代码的入口。

self.crawl('http://sz.58.com/pbdn/0/pn1/', callback=self.index_page) #意思是去请求'http://sz.58.com/pbdn/0/pn1/'网址,返回的内容交给index_page这个函数去处理。

index_page 函数,处理'http://sz.58.com/pbdn/0/pn1/'网址返回的内容,从代码我们可以看到,pyspider请求网站返回的对象都是用response为变量,而responce.doc()意思就是使用pyquery去处理网页返回的内容,所以responce.doc()该方法其实类似于:

from pyquery import PyQuery as doc 将pyquery封装。

detail_page函数作用,就是获取网页的详细信息,获取下图区域,价格,浏览量等信息,并且返回一个字典

fetch_type='js' #pyspider调用phantomjs去渲染js,因为浏览量是js渲染,如果我们使用requests去请求,得不到该数据。pyspider已经封装了调用phantomjs函数库,所以我们在使用fetch_type时候,要保证安装了phantomjs。

@every(minutes=24 * 60)

这些装饰器作用是告诉pyspider多久自动执行一次,这样我们每天就可以获取最新的信息,此处代表每天执行一次。

@config(age=10 * 24 * 60 * 60)表示已经得到的数据保留十天,十天后弃掉

最新文章

  1. 【如何快速的开发一个完整的iOS直播app】(采集篇)
  2. [转]C语言指针学习经验总结浅谈
  3. js判断微信浏览器
  4. 如何设置通过ip访问数据库
  5. 转--C++学习笔记(原创)
  6. HTML的结束标签问题
  7. hdu1043Eight (经典的八数码)(康托展开+BFS)
  8. C#读写共享文件夹
  9. mysql根据汉字首字母排序[转]
  10. Scala--映射和元组
  11. Python核心编程的四大神兽:迭代器、生成器、闭包以及装饰器
  12. (转)sublime text3 3176激活
  13. PageAdmin CMS网站建设教程:如何创建及管理栏目?
  14. React—Native开发之原生模块向JavaScript发送事件
  15. 起床困难综合症 NOI_2014_D1T1
  16. App-IOS与Android弱网环境测试
  17. 转转转!!Spring MVC控制器用@ResponseBody声明返回json数据报406的问题
  18. 随笔小问题(一)--mac打开class文件
  19. SpringBoot接口服务处理Whitelabel Error Page
  20. asp.net+mvc+easyui+sqlite 简单用户系统学习之旅(三)—— 简单登录页面+sqlite+动软代码生成器的使用

热门文章

  1. R语言的数据结构
  2. C语言float型数据在内存中的储存方式
  3. Oracle 10g RAC启动与关闭命令
  4. vs 自动生成core dump文件
  5. Qt编程之信号与槽-------unresolved external symbol "public: virtual struct QMetaObject const * __thiscall XX::metaObject(void)const
  6. java获得指定日期的前一天,后一天的代码
  7. tyvj1297 小气的小B
  8. SQL server 中 COUNT DISTINCT 函数
  9. ora-28056 (Writing audit records to Windows Event Log failed)
  10. python高级编程之元类(第3部分结束)