美文网首页
爬虫实战1-----链家二手房信息爬取

爬虫实战1-----链家二手房信息爬取

作者: strive鱼 | 来源:发表于2018-11-13 16:59 被阅读0次

    经过一段机器学习之后,发现实在是太枯燥了,为了增添一些趣味性以及熟练爬虫,在之后会不定时的爬取一些网站

    • 旨在熟悉网页结构--尤其是HTML的元素,ajax存储,json;熟练使用pyspider,scrapy两大框架;掌握基本的requests库,re正则匹配,urllib库,Beautifulsoup,css,pyquery 选择器的使用,pandas库的辅助;mongodb,csv,xlsx的存储,redis分布式爬虫;简单的反爬技巧

    本篇作为实战的第一篇,爬取了链家二手房的信息,一些思路借鉴了网上的框架结构,并非纯粹原创,特此声明,站在巨人的肩膀上眺望

    该篇我自己实践学习到的、需要注意的内容如下

    本项目实例的知识点有
    1. format 和 迭代yield 的使用
    
    2. 三大解析工具的使用   XPath,  beautifulsoup,pquery   
    
    3.关于变签选取,beautifulsoup 的select 方法返回的是列表,需要格外注意, 且用select 来选择class 标签的时候,只取 空格前边,class 等号后边的,比如62行
    
    
    4.如何将字典信息转化为pd.DataFrame 
    比如,dict={'a':'1','b':'2','c':'3'}
    直接使用data=pd.DataFrame(dict)则会报错:ValueError: If using all scalar values, you must pass an index
    如何解决呢?比较好的方法介绍两种
    第一种为:data=pd.DataFrame(dict,index=[0])
    第二种为:pd.DataFrame(list(idct.items())    代码位置117行
    
    
    
    5.当有多个列表同时需要转化为dataframe 的时候,可以将所有的字典全部的存放到一个列表当中,随后直接用pd.dataframe 
    

    所对应的代码和注释如下:

    class  lianjiaspider(object):
        def __init__(self):
            self.home_url='http://bj.lianjia.com/'#链家首页的链接
            self.auth_url='https://passport.lianjia.com/cas/login?service=http%3A%2F%2Fbj.lianjia.com%2F'#用户的登陆界面,登陆后为链家首页的界面
            self.zaishou_url='https://su.lianjia.com/ershoufang/pg{}/'
            self.headers=headers = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
        'Accept-Encoding': 'gzip, deflate',
        'Accept-Language': 'zh-CN,zh;q=0.8',
        'Cache-Control': 'max-age=0',
        'Connection': 'keep-alive',
        'Content-Type': 'application/x-www-form-urlencoded',
        'Host': 'su.lianjia.com',
        'Referer': 'https://su.lianjia.com/chengjiao/',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 Safari/537.36',
        'Upgrade-Insecure-Requests': '1',
        'X-Requested-With': 'XMLHttpRequest',
    
    }
    
    
        def main_url(self,page):#生成在售房屋每一页的URL
            #r=requests.get(self.home_url)
            #return r.text
            for next_page in range(1,int(page)):
                yield self.zaishou_url.format(next_page)#,可以用于迭代
    
        def detail_sall_url(self):
            user_num = input('请输入你想要的主页的页数:')
            detail_url_list = []
            for i in self.main_url(str(int(user_num)+1)):
                try:
                    response=requests.get(i,headers=self.headers)
                    if response.status_code==200:#一定不能加引号啊,不然怎么都匹配不到的
                        html=response.text
                        soup=bp(html,'lxml')
                        detail_a_label=soup.select('.clear .noresultRecommend')#返回的是一个列表
                        for each_a_label in detail_a_label:
                            detail_url_list.append(each_a_label['href'])#获得标签,然后获取属性href ,并依次取出详情页的标签把他放在一个列表当中
                except requests.ConnectionError as e:
                    print ('error:', e.args)
            return detail_url_list
    
    
        def parse_detail_url(self,detail_url_list):#用于解析详情页
            info_concat=[]
            for each_detail_url in detail_url_list:
                response_detail=requests.get(each_detail_url)
                if response_detail.status_code==200:
                    html_detail_url=response_detail.text
                    info={}#存为字典/json 形式
                    soup=bp(html_detail_url,'lxml')
                    info1=soup.select('.title .main')#获取含有标题的标签的列表
                    for  j in  info1:
                        info['出售房屋标题']=j.get_text()#获取标题
                    info2=soup.select('.price .total')#获取房屋价格
                    for p in info2:
                        info['总价']=p.string + '万'
                    info3 = soup.select('.unitPriceValue')  # 获取房屋每平方均价
                    for unit_price in info3:
                        info['平方售价'] = unit_price.get_text()
                    info4 = soup.select('.room')  # 获取厅室
                    for property in info4:
                        info['房屋属性'] = property.get_text()
                    info5 = soup.select('.area')
                    for areas in info5:
                        info['面积'] = areas.get_text()
                    info6 = soup.select('.type')
                    for areas in info6:
                        info['朝向'] = areas.get_text()
                        info_concat.append(info)
                else:
                    print ('error:', requests.ConnectionError)
            return info_concat
    
    
        def save_to_xlsx(self,detail_url_list): #用于将数据存储到 excel 当中
            pd.DataFrame(self.parse_detail_url(detail_url_list)).to_excel('链家二手房.xlsx', sheet_name='链家二手房信息')
    
    
    
    
    
    
    def main():
        lianjia=lianjiaspider()#实例化
        detail_url_list=lianjia.detail_sall_url()
        lianjia.save_to_xlsx(detail_url_list)
    
    
    if __name__=='__main__':
        main()
    

    代码选取5页的内容爬取并存储结果如下

    相关文章

      网友评论

          本文标题:爬虫实战1-----链家二手房信息爬取

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