美文网首页
Python 爬虫 链家二手房(自行输入城市爬取)

Python 爬虫 链家二手房(自行输入城市爬取)

作者: Abel_chen | 来源:发表于2019-03-05 15:12 被阅读0次

    因同事想在沈阳买房,对比分析沈阳各区的房价,让我帮忙爬取一下链家网相关数据,然后打 算记下笔记 用于总结学到的东西&用到的东西。

    一.爬虫需要会什么?

    学习东西 首先你要知道它是干嘛的。爬虫 顾名思义就是爬取你所看到的网页内容 小说/新闻/信息等。而网页相关的也就是 HTML 学过网页的最清楚不过了。 HTML(超文本标记语言) 用各种标签来识别内容,浏览器会翻译成所看到的网页页面,HTML只是个基础 展示的只是静态的网页(也就是不会动的陈列好的网页) 还需要美化的CSS 和 实现动态的JavaScipt。想学习的可以 参考 HTML 基础 | 菜鸟教程。做爬虫也不需要了解学习很多,只需要了解HTML是基于文档对象模型(DOM)的,以树的结构,存储各种标记。

    接下来 就是python(我用的是python3.6) 中 爬虫相关的辅助库

         Requests库 比较好用的HTTP库
    
         BeautifulSoup库 优秀的HTML/XML解析库,采用来做爬虫 该库解析时需要个解析器 lxml
    

    辅助的还有很多 由于本文只用到这两个 同时这两个基本足够了,有兴趣的可以百度学习别的。

    二.爬虫实例(链家二手房):

    1.URL(统一资源定位符 也称为网页地址):链家二手房

    像标题所言 自行输入城市 并不是所有的爬虫都通用 要找到每个url 之间的规律,如下

    https://sy.lianjia.com/ershoufang/pg1/

    https://bj.lianjia.com/ershoufang/pg1/

    https://ts.lianjia.com/ershoufang/pg1/

    很明显可以看出规律 https:// + city + .lianjia.com/ershoufang/pg +页码+/

    由于 基本最多页码就100页 也就不需要自己输入页码(在程序中循环替换页码) 故笔记中 url则为

    单页url:  
        a=1
        url ='http://' + user_in_city +'.lianjia.com/ershoufang/pg{}/' 
        url1.url.format(a)
    (或者直接写)
        url ='http://' + user_in_city +'.lianjia.com/ershoufang/pg1/' 
        
    循环url:
        user_in_city='sy'
        url ='http://' + user_in_city +'.lianjia.com/ershoufang/pg{}/' 
        for a in range(1, 101):
            url1 = url.format(a)
            print(url1)
    

    2.Request

    我们可以requests.get(url) 来 Get该网页从而获取该html内容

    import requests
    
    url = 'http://sy.lianjia.com/ershoufang/pg1/'
    page = requests.get(url)
    print(page)
    

    但是实践以后该网站会报错 403 服务器拒绝访问
    这就需要我们添加headers 模仿浏览器访问,就变成下面代码

    header = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36'}
    page = requests.get(url1, headers=header)
    a=page.text
    print(a)
    

    注:header获取方式
    抓取内容如下:

    网页HTML.png

    3.BeautifulSoup

    BeautifulSoup 作为优秀的HTML/XML解析库 方便又简单


    代码.png

    如上图所见,点击小红色框框的三角 选中网页上的模块,阴影部分会自动跳到该模块的标签位置(大红色框框)可以把该部分的标签粘贴到本地 方便查看。

    import requests
    from bs4 import BeautifulSoup
    
    url = 'http://sy.lianjia.com/ershoufang/pg1/'
    header = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36'}
    page = requests.get(url, headers=header)  #访问网址 获取该 html内容
    a = page.text
    soup = BeautifulSoup(a,"lxml")  #解析该网页内容
    b=soup.find_all('div',class_='info clear') #find_all 找到 div  class='info clear' 的标签
    print(b)
    

    爬取的内容就是我们需要的全部内容 中间会掺杂一些标签

    6.去除标签

    标签.png

    图片中 我们可以看到 爬取出来中 还掺杂许多标签,而我们只需要文字,然后我想到了正则(可惜我不会,哈哈哈哈,有会的大神可以教教我)
    但笨人有笨方法:我们一个一个解析 取文字
    像图片中 【枫合万嘉 南北通透...】我们可以看出是 div标签 class='title' 的。(因为每页有很多个房源信息 所以我们要 for 循环)
    其它标签亦然如此


    去标签.png

    我们还要爬出导入excle ,因此我在一个房源所有信息中加入[,] 方便我们后续分列 透视(只列出两个标签)


    分列.png

    7.标签去除掉 就要导入文件

     with open("链家-沈阳-二手房-over", "a", encoding='utf-8') as f:
               f.write(df+'\n')
    

    我导入的是txt 文本 ,有需要可以导入 Excle Csv

    8.分析数据(同事分析的一小部分数据)

    分析.png

    9.源代码

    ##author:Abel_chen
    ##防止你们照搬 我做了两个小错误 偷笑.jpg
    import requests
    from bs4 import BeautifulSoup
    
    
    def one_page_code(user_in_city):
     url = 'http://' + user_in_city + '.lianjia.com/ershoufang/pg{}/'
     for a in range(1, 101):
        url1 = url.format(a)
    
        header = {'User-Agent': '*********'}
        page = requests.get(url1, headers=header)
        a=page.text
        soup = BeautifulSoup(a,"lxml")
    
        for b in soup.find_all('div',class_='info clears'):
          for wz in b.find_all('div',class_='title'):
            wz=wz.get_text()
          for ad in b.find_all('div',class_='address'):
            ad=ad.get_text()
          for ys in b.find_all('div',class_='flood'):
            ys=ys.get_text()
          for sj in b.find_all('div',class_='followInfo'):
            sj=sj.get_text()
          for tag in b.find_all('div',class_='tag'):
            tag=tag.get_text()
          for jg in b.find_all('div',class_='priceInfo'):
            jg=jg.get_text()
    
          df=wz + ',' + ad + ',' + ys + ',' + sj + ',' + tag + ',' + jg
          with open("链家-沈阳-二手房-over", "a", encoding='utf-8') as f:
               f.write(df+'\n')
    
    def main():
        user_in_city = input('输入爬取城市:')
        one_page_code( user_in_city)
    
    if __name__ == '__main__':
        main()
    

    相关文章

      网友评论

          本文标题:Python 爬虫 链家二手房(自行输入城市爬取)

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