使用scrapy框架爬取安居客

使用scrapy框架爬取安居客

import requests
from scrapy.contrib.spiders import CrawlSpider
import re
from bs4 import BeautifulSoup
import json
import urllib.request
from ..items import YilongItem

class YilongSpider(CrawlSpider):
    name = "yilong"
    allowed_domains = ["yilong.org"]
    start_urls = ["http://hotel.elong.com/beijing/"]

    def parse(self,response):
        def remove_emoji(comment, restr=''):
            # 过滤表情
            try:
                co = re.compile(u'[\U00010000-\U0010ffff]')
            except re.error:
                co = re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]')
            return co.sub(restr, comment)

        url = 'http://hotel.elong.com/ajax/tmapilist/asyncsearch'
        header = {
            'Accept': 'application/json, text/javascript, */*; q=0.01',
            'Accept-Encoding': 'gzip, deflate',
            'Accept-Language': 'zh-CN,zh;q=0.9',
            'Connection': 'keep-alive',
            'Content-Length': '1641',
            'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
            'Host': 'hotel.elong.com',
            'Origin': 'http://hotel.elong.com',
            'Referer': 'http://hotel.elong.com/beijing/',
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1',
            'X-Requested-With': 'XMLHttpRequest',
        }
        for i in range(1, 10):
            data = {'code': '-99',
                    'listRequest.pageIndex': i,
                    'listRequest.pageSize': '20'}
            # print(data['listRequest.pageIndex'])
            html = requests.post(url, data=data, headers=header)
            text = html.json()['value']['hotelListHtml']
            soup = BeautifulSoup(text, 'html.parser')
            name = soup.find_all('img')
            for a in name:
                page = 1
                while 1:
                    headers = {
                        'Accept': 'application/json, text/javascript, */*; q=0.01',
                        'Accept-Language': 'zh-CN,zh;q=0.9',
                        'Connection': 'keep-alive',
                        'Cookie': 'CookieGuid=e4473769-6b67-459a-9230-ee68a9cf44ee; s_eVar44=ppzqbaidu; _fid=e4473769-6b67-459a-9230-ee68a9cf44ee; ShHotel=CityID=0101&CityNameCN=%E5%8C%97%E4%BA%AC%E5%B8%82&CityName=%E5%8C%97%E4%BA%AC%E5%B8%82&OutDate=2018-11-06&CityNameEN=beijing&InDate=2018-11-05; CitySearchHistory=0101%23%E5%8C%97%E4%BA%AC%E5%B8%82%23beijing%23; SHBrowseHotel=cn=30101020%2C%2C%2C%2C%2C%2C%3B90549076%2C%2C%2C%2C%2C%2C%3B90922044%2C%2C%2C%2C%2C%2C%3B50101599%2C%2C%2C%2C%2C%2C%3B91751292%2C%2C%2C%2C%2C%2C%3B&; newjava2=1aa848d2c49dfc6719f2c5e03cd1e8b3; JSESSIONID=6146394FA28F1210B2A4670108FC74CD; SessionGuid=2fb539a2-31fd-470b-9d64-c1ffcac1322b; Esid=98039b1b-ad09-47e5-a297-88b1c00f5eae; com.eLong.CommonService.OrderFromCookieInfo=Status=1&Orderfromtype=5&Isusefparam=0&Pkid=50793&Parentid=3150&Coefficient=0.0&Makecomefrom=0&Cookiesdays=0&Savecookies=0&Priority=9001; fv=pcweb; ext_param=bns%3D4%26ct%3D3; s_cc=true; s_sq=elongcom%3D%2526pid%253Dhotel.elong.com%25252F30101020%25252F%2526pidt%253D1%2526oid%253Djavascript%25253Avoid(0)%2526ot%253DA; anti_token=C8C80446-4668-43E3-8EF5-FE55922A8718; __tccgd=0.0; __tctmc=0.248740382; __tctmd=0.207648715; semid=ppzqbaidu; outerFrom=ppzqbaidu; s_visit=1; __tctmb=0.87347167989023.1541417759666.1541417759666.1',
                        'Host': 'hotel.elong.com',
                        'Referer': 'http://hotel.elong.com/beijing/',
                        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1',
                        'X-Requested-With': 'XMLHttpRequest',
                    }
                    url1 = 'http://hotel.elong.com/ajax/comment/getcommentbypage/?hotelId=' + str(a['data-mark'].strip('img_')) + '&recommendedType=0&pageIndex=' + str(page) + '&mainTagId=0&subTagId=0&rankType=0&eToken=e4473769-6b67-459a-9230-ee68a9cf44ee&code=9375392&_=1540819416448'
                    request = urllib.request.Request(url1, headers=headers)
                    response1 = urllib.request.urlopen(request)
                    content = response1.read().decode('utf-8', 'ignore')
                    js = json.loads(content)
                    page += 1
                    if js['value']['Comments'] == []:
                        break
                    text1 = js['value']['Comments']
                    for j in range(len(text1)):
                        item = YilongItem()
                        # print(js['value']['Comments'][j]['CommentUser']['NickName'])
                        a1 = js['value']['Comments'][j]['CommentUser']['NickName']
                        a2 = js['value']['Comments'][j]['Content']
                        a3 = js['value']['Comments'][j]['CreateTime']
                        a2 = remove_emoji(a2, restr='')
                        a1 = remove_emoji(a1, restr='')
                        item['name'] = a['alt']
                        item['user_name'] = a1
                        item['content'] = a2
                        item['creattime'] = a3
                        print(item['user_name'])
                        yield item
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 安居客出租房(武汉为例)爬虫+数据分析+可视化 这个爬虫是我前段时间在淘宝上做单子的时候遇见的一个客户需求。本来以为就是一个简单的爬虫项目。但后面客户加了数据清洗和数据分析的要求。而后又加了要详细代码解释的需求等等。直到最后客户坦白说这是他们大专的毕设.......但是这个单子坐下来只有200左右,我想了一下,感觉好亏啊。在淘宝上随便找一个做毕设的都要好多钱的,而且客户本身的代码能力、数学、逻辑能力都很差,导致我每行都给注释以及看不懂,在我交付代码后又纠缠了我一个多礼拜。反正总体做下来的感觉就是烦躁。头一次感觉到了客户需求变更带来的巨大麻烦。 总之这是一次不是很愉快的爬虫经历。但是作为我写爬虫以来注释最详细的一次,以及第一次真正使用像matplotlib这种数据分析库的代码,我认为还是有必要分享出来给大家当个参考的(PS:大佬轻拍~)。爬虫本身几乎没有什么难度,写的也比较乱,敬请见谅。 **功能** 爬取安居客上的出租房信息(武汉地区的),并通过爬取的数据进行数据清洗以及数据分析。给出四个不同层面的可视化图。最终结果如下图所示: ![Image text](https://raw.githubusercontent.com/srx-2000/git_spider/master/anjuke_room_rent_info/result/1.png) ![Image text](https://raw.githubusercontent.com/srx-2000/git_spider/master/anjuke_room_rent_info/result/2.png) ![Image text](https://raw.githubusercontent.com/srx-2000/git_spider/master/anjuke_room_rent_info/result/3.png) ![Image text](https://raw.githubusercontent.com/srx-2000/git_spider/master/anjuke_room_rent_info/result/4.png) **环境** 1. Windows 10 2. python3.7 **使用方法** 首先声明该爬虫由于是特定情况下写的,所以本身的通用性特别差,仅可以对安居客网站上的武汉的出租房信息进行爬取,且需要自己手动更新cookie。同时在对数据进行分析及可视化的时候由于也是特别针对武汉出租房的进行的,所以针对性也比较强。如果别的需求需要自己进行更改。 1. 访问[安居客网址](https://wuhan.anjuke.com/),获取cookie。 > tip:获取cookie的方法可根据[此链接](https://jingyan.baidu.com/article/5d368d1ea6c6e33f60c057ef.html) 2. 在项目中找到`spider.py`的文件,将第12行的cookie换成你自己的cookie。 3. 运行`spider.py`,获取房源信息。运行后应会产生一个`武汉出租房源情况.csv`的文件。此文件为我们从安居客爬取的房源信息,其中包含`房屋租住链接、房屋描述、房屋地址、房屋详情(户型)以及经纪人、房屋价格`五个属性。 4. 在获取了数据之后我们运行`matplotlib.py`文件。进行数据清洗,分析,可视化。运行后即可获得**功能**中展示四个图片。 **技术栈** 1. request 2. parsel 3. pandas 4. matplotlib **进步(相比之前)** 此次爬虫相比之前的技术上可以说有减无增。但其中注释相当详细,可谓是每行代码都有注释。所以对于初学者应该有一些用处。同时使用matplotlib进行了数据分析可视化等。对于数据处理的代码的注释也是几乎每行都有注释的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值