爬虫实战:从链家网爬取数据

风格不统一 提交于 2019-12-08 22:28:17

      学习python已经很久了,从各个大牛的技术博客中获益良多。现在也想把自己的小小收获公开一下,以方便大家学习python,让python更加普及的应用。下面我准备写一个爬虫实例:从链家网爬取福田区二手房的数据。

环境:

win10专业版
python3.6(需要使用模块BeatifulSoup;pandas;Selector;time;re)
Office2013

背景知识:

Xpath的使用
pandas的使用
request的使用

    python爬虫能力大致分为三个层次:第一个层次就是静态网页的爬取;第二个层次就是异步加载的网页数据的爬取;第三个层次使用加密请求数据的网站数据爬取(使用selenium)。

    今天我们的任务是非常简单的爬取静态网站数据。要爬取的是2017年10月24日的链家网福田区二手房挂牌房源数据(图片截取是为了让大家看清网页机构并不是当天截取)。链家网的数据爬取非常简单,步骤如下:




一、观察网站地址和不同页码的网址变化,得到目标网页100页的网址列表;编写request请求的头部信息(让对方知道你是一个浏览器);最好加入代理ip地址;

我们打开第二页的目标网址是:https://sz.lianjia.com/ershoufang/futianqu/pg2/
所以我们可以判断pg后面就是页码的数字。

二、制作一个空表格;

三、编写函数将每一页的信息都爬取下来变成表格(使用Selector的xpath定位信息);

四、使用循环将所有页面上的房源信息(房屋介绍的文本信息;房屋编号;图片地址)写入空的表格。

#coding=utf-8
from bs4 import BeautifulSoup
import re
import requests
from parsel import Selector
import pandas as pd
import time
#############################################################
'''
这个模块爬取链家网福田区的二手房信息;仅仅爬取了前100页的数据
为了避免反爬虫策略,设定每5秒钟抓取一页信息
@time=2017-10-24
@author=wq

'''

###########################################################
# 进行网络请求的浏览器头部
 headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 BIDUBrowser/8.7 Safari/537.36'

}
# pages是不同页码的网址列表
pages=['https://sz.lianjia.com/ershoufang/futianqu/pg{}/'.format(x) for x in range(1,100)]
############################################################

#############################################################
lj_futian = pd.DataFrame(columns=['code','dec','img'])
count=0
def l_par_html(url):
    # 这个函数是用来获取链家网福田区二手房的信息
    wr=requests.get(url,headers=headers,stream=True)
    sel=Selector(wr.text)
    # describ用来获取房源的文字信息
    describ=sel.xpath('//li[@class="clear"]//text()').extract()
    new_information=([x for x in describ if x != '关注'and x != '加入对比' ])
    sep_infor=' '.join(new_information).split(r'/平米')[:-1]
    # hou_code用来获取房源的编号
    hou_code=sel.xpath('//li[@class="clear"]/a/@data-housecode').extract()
    # hou_image用来获取房源的图片
    hou_image=sel.xpath('//li[@class="clear"]/a/img/@data-original').extract()
    # 将信息形成表格全部写到一起
    pages_info=pd.DataFrame(list(zip(hou_code,sep_infor,hou_image)),columns=['code','dec','img'])
    return pages_info

for page in pages:
    a=l_par_html(page)
    count=count+1
    print ('the '+str(count)+' page is sucessful')
    time.sleep(5)
    lj_futian=pd.concat([lj_futian,a],ignore_index=True)

# 将表格数据输出到excel文件
lj_futian.to_excel('d:\\lianjia_ershou_futian_100.xlsx')

  


  同样,改动一下网址和excel文件地址,你可以继续抓取深圳每个区的二手房数据。为了简单实例我只使用了福田区的二手房数据。大家可以看到,抓取的数据全部集中到三列中。
      可以从表格中看到抓取的信息是非结构化的数据,不能直接split然后取值。需要使用正则进行抓取,我会在下一章将数据清理拆分到可以仔细分析的粒度。
    各位,有疑问的或者提出改进意见的,请留言或者发邮件rwangnqian@126.com!
谢谢!

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!