Simple Life

和这个世界交手这许多年   你是否光彩依旧,兴致盎然...

您现在的位置是:首页 爱折腾 爱折腾详情

使用Scrapy爬取58同城租房信息

发布时间:2015-7-08 作者:Felix 浏览(3565)

        Sqlalchemy是由python开发的一款开源ORM,像众多轻量级的框架flask,tornado等,本身不带有ORM功能,可以选择sqlalchemy做拓展。sqlalchemy有两种方法,一种是session-mapper的方式,称为orm方式,另一种就是原生的select等sql语句,称之为core方式。Scrapy也是由python开发的一款爬虫框架,应用也十分广泛,可以用于数据挖掘、监测和自动化测试,之前自己也已经尝试过爬取,这次只是做个记录,之后会继续研究,轻喷。

        sqlalchemy的安装和使用这里就不赘述了,推荐下廖雪峰的官方网站(使用Sqlalchemy

        scrapy我安装的是最新版本,官方文档很详细,看这里(http://doc.scrapy.org/en/latest/intro/tutorial.html

        

        下面开始我们的爬取工作

        爬取的内容很简单,就是58上海的租房信息,网址(http://sh.58.com/chuzu/pn1/

        1. 新建scrapy工程

Felix-MacBook-Pro:workspace felix$ scrapy startproject zufang
Felix-MacBook-Pro:workspace felix$ cd zufang
Felix-MacBook-Pro:zufang felix$ scrapy genspider fang sh.58.com

        不出意外,你的工程应该是这样的:

        scrapy.png 

        2. 研究你的爬取对象

            用浏览器打开你要爬取的网页,以开发者模式分析他的HTML DOM,看下你要爬取的有效信息分布在哪里,需要哪些信息。

        3. 定义你的item       

        明确你要爬取的内容,在items里定义你要爬取的字段。

import scrapy


class ZufangItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    name = scrapy.Field()  # 标题
    area = scrapy.Field()  # 商圈
    price = scrapy.Field() # 价位
    space = scrapy.Field() # 户型
    people = scrapy.Field() # 经纪人

        4. 完善你的爬虫

from scrapy.selector import Selector
from zufang.items import ZufangItem
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors import LinkExtractor


class FangSpider(CrawlSpider):
    name = "fang"
    allowed_domains = ["sh.58.com"]
    start_urls = (
        '  # 需要爬取的起始url 
    )
    rules = [         # 利用rule继续爬取下一页
        Rule(LinkExtractor(allow=("/chuzu/pn\d+/", )), follow=True, callback='parse_item'),
    ]
    def parse_item(self, response):
        sel = Selector(response)
        sites = sel.xpath('//td[@class="t qj-rentd"]') 
        items = []
        for site in sites:
            item = ZufangItem()
            item['name'] = site.xpath("h1/a/text()")[0].extract()  # 利用xpath去匹配你要的信息
            item['area'] = site.css('.a_xq1').xpath('text()')[0].extract()
            item['price'] = site.xpath('..').css('.pri').xpath('text()').extract()
            item['space'] = site.xpath('..').css('.showroom').xpath('text()').extract()
            item['people'] = site.xpath('p[2]/span/a[1]/text()').extract()
            items.append(item)
        return items

        5. 配置你的pipeline

            pipeline可以对你的爬取数据进行过滤和处理,在setting中增加配置,让你的工程找到他。

ITEM_PIPELINES = {
    'zufang.pipelines.ZufangPipeline': 300
}

        6. 利用sqlalchemy保存你的爬取数据

            a) 在工程下新建model.py定义你要保存数据的模型,跟django的ORM相似。

from sqlalchemy import *
from sqlalchemy.ext.declarative import declarative_base

Basemodel = declarative_base()


class Zufang(Basemodel):
    id = Column(Integer, primary_key=True)
    name = Column(String(100))
    area = Column(String(20))
    price = Column(String(20))
    space = Column(String(20))
    people = Column(String(20))
    
    __tablename__ = 'zufang' # 数据库表名

            b) 利用ORM在pipeline中保存你的数据到mysql

from .models import Zufang, Basemodel
from sqlalchemy.orm import sessionmaker
from sqlalchemy import *

class ZufangPipeline(object):

    def process_item(self, item, spider):                               # 连接数据库,数据库事先建好
        engine = create_engine('mysql+mysqlconnector://root:@localhost:3306/alchemy', echo=True)  
        Basemodel.metadata.create_all(engine)  # 创建数据库表      这部分可以提取出去
        dbsession = sessionmaker(bind=engine)
        session = dbsession()
        
        people = item['people'][0] if isinstance(item['people'], list) and item['people'] else item['people']
        price = item['price'][0] if isinstance(item['price'], list) and item['price'] else item['price']
        space = item['space'][0] if isinstance(item['space'], list) and item['space'] else item['space']
        new_art = Zufang(name=item['name'], area=item['area'], price=price or '', space=space or '', people=people or '')
        
        session.add(new_art)
        session.commit()
        session.close()
        
        return item

        7. 执行你的代码

Felix-MacBook-Pro:zufang felix$ scrapy crawl fang -o items.json

            好了,看着终端里哗啦啦的在跑,程序猿的快感来了!

            到数据查看你爬到的数据吧,enjoy it!            

zf.png

        

基于 Django 搭建

服务器采用的 阿里云

域名来自 万网

苏ICP备16015443号

©2015-2016 felixglow.com.

GitHub

Design by Felix