学习python已经很久了,从各个大牛的技术博客中获益良多。现在也想把自己的小小收获公开一下,以方便大家学习python,让python更加普及的应用。下面我准备写一个爬虫实例:从链家网爬取福田区二手房的数据。
环境:
背景知识:
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然后取值。需要使用正则进行抓取,我会在下一章将数据清理拆分到可以仔细分析的粒度。 各位,有疑问的或者提出改进意见的,请留言或者发邮件[email protected]! 谢谢!