[python]简单的网络爬虫

有朋友工作需要从58同城上爬取部分数据,他之前用的免费版的"火车头"功能比较少,不能达到预期效果,所以请我帮忙.
  刚好最近正在自学python,听说python实现网络爬虫比较简单,就在工作之余研究了一下.

  关于python基础学习,请移步(廖雪峰的官方网站):http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/

  关于python实现网络爬虫,也是在某大侠(请叫我汪海)的博客专栏中学习了将近一天:请移步:http://blog.csdn.net/column/details/why-bug.html
  关于XPATH,请移步(有中文文档,很赞):http://zvon.org/xxl/XPathTutorial/General/examples.html
  好了,在知识储备差不多的情况下,开始着手爬数据

  先决条件:

  1.安装python
  2.因为lxml在解析复杂html时会报错,所以建议安装BeautifulSoup-3.2.1,下载链接https://pypi.python.org/packages/source/B/BeautifulSoup/BeautifulSoup-3.2.1.tar.gz,安装方法烦请百度

  接下来就是重头戏了,我的思路是请求58同城,获取响应并读取响应信息,将响应信息解析为顶级元素,然后使用XPATH获取想要的数据结果,最后打印输出,因为业务逻辑比较简单,故直接上代码:

#coding=utf-8
#从58同城爬取数据
#Created on 2015年4月9日
#author: windbeside
import urllib2
from lxml import etree
from lxml.html import soupparser

def test():
    #获取请求对象
    req = urllib2.Request('http://zz.58.com/ershoufang/pn1/?qq-pf-to=pcqq.group&PGTID=14285900569950.5156099369318879&ClickID=1')
    try:
        #得到服务器响应
        resp = urllib2.urlopen(req)
        #将响应的页面读取到一个字符串中
        html = resp.read()
        #关闭流
        resp.close()
        #使用soupparser将字符串格式的html解析为顶级元素对象
        doc = soupparser.fromstring(html)
        
        #获取指定行的集合
        row = doc.xpath(u"body/div[@id='category']/div[@id='main']/div[@id='infolist']/table[@class='tbimg']/tr")
        i = 0
        #指定元素对应的XPATH
        huxingPath = "td[@class='t']/div[@class='qj-listright btall']/span[@class='showroom']"
        shoujiaPath = "td[@class='t']/div[@class='qj-listright btall']/b[@class='pri']"
        weizhiPath = "td[@class='t']/div[@class='qj-listleft']/i[@class='clear']"
        fabushijianPath = "td[@class='t']/div[@class='qj-listleft']/span[@class='qj-listjjr']"
        #循环遍历每一行
        for r in row:
            #户型信息(转码,去空)
            huxing = r.find(huxingPath).text_content().encode('utf-8').strip()
            #售价信息
            shoujia = r.find(shoujiaPath).text
            #位置信息(先获取其之后的元素,然后调用getprevious()方法获取位置元素,转码,去空)
            weizhi = r.find(weizhiPath).getprevious().text.encode('utf-8').strip()
            #发布信息(转码,去空)
            fabushijian = ('').join(r.find(fabushijianPath).xpath('text()')).encode('utf-8').strip()
            i += 1
            #r = r.text_content().encode('utf-8')
            print '抓取的第%d 行记录中户型为%s'%(i, huxing)
            print '抓取的第%d 行记录中售价为%s'%(i, shoujia)
            print '抓取的第%d 行记录中位置为%s'%(i, weizhi)
            print '抓取的第%d 行记录中发布时间为%s'%(i, fabushijian)
    except urllib2.URLError, e:
        if hasattr(e, 'code'):
            print 'exception code:%s'%(e.code)
        elif hasattr(e, 'reason'):
            print 'exception reason:%s'%(e.reason)
        else:
            raise
test()


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值