美文网首页Python全栈技术收藏
爬取安居客所有城市二手房>2018-12-07

爬取安居客所有城市二手房>2018-12-07

作者: 小生来咯 | 来源:发表于2018-12-07 20:03 被阅读102次

    前言

    安卓干了半年多,我决定从安卓转python了,年轻就是任性,喜欢就去做,python那么火,挡不住啊ε=ε=ε=(#>д<)ノ

    确定目标

    爬取的是安居客城市汇总下所有城市的二手房的数据,因为在字母A-Z中已经包含了所有城市,所以就不爬取上边的热门城市了(重复)↓

    安居客城市汇总

    开趴^ _ ^

    爬取的时候需要在headers里加浏览器的user-agent,我在爬的时候没加就被封了,安居客在对无user-agent的请求直接封(需要注意一下),我用的是xpath匹配数据的,不用正则了,对于我这种渣渣又难又不方便,这里为了匹配A-Z的数据限定了li标签position()<=22,不懂xpath的童鞋可以看这xpath教程

    # 城市url
    url = 'https://www.anjuke.com/sy-city.html'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'
    }
    response = requests.get(url, headers=headers)
    html = response.text
    tree = etree.HTML(html)
    # 城市列表,匹配A-Z的数据限定了li标签position()<=22
    city_list = tree.xpath('/html/body/div[3]/div/div[2]/ul/li[position()<=23]/div/a/@href')
    

    可以看到这些城市对应的网址都拿到了,一共有658个,印象中全国好像没那么多城市吧,不知道这里为什么这么多,可能包含一些其他的


    城市链接

    接下来就要具体爬取每个城市二手房的详细信息了,网页长这样↓


    二手房
    帝都的房价真滴贵,五环外都4w多,打工仔的我还是看看就好o(╥﹏╥)o

    当我翻页的时候发现只有网址变了,并且xpath也还能匹配到,说明这是静态的界面,但是发现最多只有50条,可能安居客为了保护自家数据只展示了一部分,不过无所谓了有多少咱们就拿多少O(∩_∩)O,还记得刚才咱们拿到的城市链接了么,只需在原来的基础https://beijing.anjuke.com上加/sale/p1就行了

    二手房
    接下来我们就开始拿我们想要的数据啦 ^ _ ^
    详情

    像房价、面积、位置啊这些最基本的我们都把它拿下来

    # 房价列表
    price_list = tree.xpath('//*[@id="houselist-mod-new"]/li/div[3]/span[1]/strong/text()')
    # 地址列表
    address_list = tree.xpath('//*[@id="houselist-mod-new"]/li/div[2]/div[3]/span/text()')
    # 面积列表
    area_list = tree.xpath('//*[@id="houselist-mod-new"]/li/div[2]/div[2]/span[2]/text()')
    

    这里和大家安利一下xpath插件,毕竟用xpath看不到自己匹配了多少个标签,有了这个xpath插件就一目了然,不出意外你们的谷歌浏览器都安装不了,这里可以用插件伴侣解决

    xpath
    点击右上角黑色的图标开启xpath,他会出现一个黑框,左边输入xpath条件,右边为结果,可以看到我们xpath匹配到了60条数据,这些黄色高亮的数据就是xpath插件的功劳,是不是挺好用的。
    接下来你们就可以开个循环然后数据就哗啦啦的拿下来了,正常的爬虫到这里已经结束了,然而这个安居客的反爬实在是太不友好了,连续发几个请求就需要验证了,如果有IP代理那就可以直接解决了,我没买,只能自给自足了,然后就去网上找了个提供免费代理的网站xici代理
    xici代理
    可以看到这里有许多的IP,话不多说,撸下来
    # 这里我用随机数访问IP的页数
    page = random.randint(1,3000)
    url = 'http://www.xicidaili.com/nn/{}'.format(page)
    response = requests.get(url,headers=headers)
    tree = etree.HTML(response.text)
    # IP列表
    ip_list = tree.xpath('//*[@id="ip_list"]//tr/td[2]/text()')
    print 'IP代理的页数为',page
    print 'IP代理个数',len(ip_list)
    for ip in ip_list:
        print ip
    
    可以看到IP都拿到了
    IP

    接下来我们就把IP代理添加到requests请求中,爬的时候记得设置延时,否则还是会被封

    ip = {"http":""}
    ip["http"] = ip_list[i]
    response = requests.get(url_city, headers=headers, proxies=ip)
    
    本以为加个IP代理就完事了,结果还没完,安居客的反爬又提示要验证了

    不过我们怎么知道是否要验证呢,方法有很多,我这里是先判断当前返回的页面的title是否为访问验证-安居客

    # 网页的title
    title = tree.xpath('//head/title/text()')
    if (title[0] == '访问验证-安居客'):
        # 处理验证
    

    在网上看了下处理这种滑块的都是先解析图片然后用selenium移动滑块完成,对于我这种渣渣怎么可能有这本事(主要还是没时间,在工作中这么多网站要爬,不可能对每一个网站的验证都去写一套应对的方法,费时费力),果断采用半人工方法,我手动滑动,有些人肯定会说你这菜鸡,当然我这懒人不可能自己打开网站然后去验证,既然看到了selenium那何不拿来用呢,我这里是把需要验证的时候用selenium把网站打开,然后time.sleep(15)睡15秒用来手动验证,然后自己关闭。

    if (title[0] == '访问验证-安居客'):
        # 参数为你的chromedriver路径
        browser = webdriver.Chrome('C:\Users\\123\Desktop\chromedriver_win32\chromedriver.exe')
        # 打开网页
        browser.get(url_city)
        time.sleep(15)
        browser.close()
    
    最后我用pandas把数据都存在csv文件中,这里将先前的城市链接中的城市作为文件名
    data = pd.DataFrame(data=list, columns=['price', 'address', 'area'])
    name = city.split('/')[2].split('.')[0]
    path = '你的路径' + '\\' + name + '.csv'
    data.to_csv(path, index=False)
    
    保存效果
    csv文件

    到这里全部都结束了,这里说明一下,我用的是python2.7,公司电脑版本太低,用不了python3.0以上,所以有些代码和python3.0以上的有差异,不过语法也就那么回事,相信大家自己都可以搞定!

    最后附上源码↓

    源码

    相关文章

      网友评论

        本文标题:爬取安居客所有城市二手房>2018-12-07

        本文链接:https://www.haomeiwen.com/subject/ciqxhqtx.html