当前位置 : 首页 » 博文聚焦 » 正文

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

分类 : 博文聚焦 | 发布时间 : 2018-01-07 09:17:32 | 浏览 : 1498

      学习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!
谢谢!

相关阅读:

How to read XML using XPath in Java

How to use XPath contains() here?

Select values from XML field in SQL Server 2008

XPath contains(text(),'some string') doesn't work when used with node with more than one Text subnode

Extract value of attribute node via XPath

XPath: Select first element with a specific attribute

xpath find if node exists

使用XPath获取属性

How can I match on an attribute that contains a certain string?

XSLT字符串替换