@DC学院《Python爬虫:入门+进阶》
昨晚睡不着,用《得到》随机听了三十分钟音频,其中一篇是王煜全老师讲的关于超级城市的商业机会,突然对超级城市有些感兴趣;今天早上在DC学院的爬虫课交流群里看到其他同学交的爬虫作业,突然对爬虫作业有些感兴趣;之前在数据分析入门课上学习获取数据这一章时,其实自己学爬过一些小数据,如是乎找了找之前的一些笔记,发现了自己爬房多多留下的蛛丝马迹;所以感兴趣加上对过去笔记的温习;我决定爬一下中国的超级城市在房多多上公布的新房数据。
是时候展现真正的技术了。首先确定爬取思路大概如下(好吧,我是渣渣,这是爬完之后总结的):1、确定待爬网站:房多多,待爬范围:新房,待爬内容(根据网页内容进行选择,页面如下图):城市名、楼盘名、楼盘所在区域、楼盘详细地址,户型、面积、总价、单价以及关注度等几项数据。
![](https://img.haomeiwen.com/i7440249/b51785e4bff81fec.png)
2、确认网页加载方式(禁用javascript,刷新网页来判断):房多多用的是同步加载;
3、观察网页特征,通过选取不同的页面可以发现网页参数只是改变了pg后的数字,那么在后面的抓取中只需要一个for循环就可以搞定多页抓取了,但是这时候有个新问题:每个超级城市的新房楼盘数量不同,所以在for循环时,range的个数也不一样;所以要通过网页抓取每个超级城市的新房有多少个page;
4、观察特征,抓取数据。
既然思路确认了,是时候展现真正的技术了;首先检查(好吧,我是渣渣,其实一开始我就没检查)我创建的python3.5的虚拟环境中是否安装了BeautifulSoup4和urllib.request模块,运行如下代码:import sys 和 sys.modules.keys() 即可查看所有已安装的模块
我喜欢从外层往内层的来写代码(好吧,我是渣渣,一开始我是只写单页的,后面才把循环一层层补上去的),鉴于我已经在代码中做了比较多的注释,就不进行一步步详解了,直接放代码:
from bs4 import BeautifulSoup
import urllib.request as urlrequest
url_get_pages = "https://{}.fangdd.com/loupan/"#这里使用每个supercity的第一页,为获取每个city的页数做准备
locations = ["chongqing","shanghai","beijing","tianjin","chengdu","guangzhou","shenzhen","haerbin","suzhou","wuhan"]
#获取每个城市新房总页数
pgs = []
for location in locations:
url =url_get_pages.format(location)#遍历补全每一个city的url
page_crawl_url = urlrequest.urlopen(url).read()#读取url内容
page_https_url = page_crawl_url.decode("utf-8")#编码设置
soup = BeautifulSoup(page_https_url,"html.parser")#设置解析方式为html
page_soup = soup.find_all(class_ ='_1EyO9')#根据class的特征获取总页数满足的范围
pgs.append(int(page_soup[-2].get_text()))#发现倒数第二个获取的结果即为总页数,注意使用int转换一下;将总页数添加到pgs的list中
pg_dict = dict(zip(locations,pgs))#创建city和页数的对应字典
with open ('fangduoduo.csv','w',encoding='utf-8')as outputfile:#设置导出文件名,编码方式,这里是默认目录
urls = "https://{}.fangdd.com/loupan-pg{}/"#设置url的通用式
for location in locations:#遍历city
for i in range(pg_dict[location]):#遍历页数
pg = i+1#设置页数每次增加1
url =urls.format(location,pg)#代入city和页数,组成每一个city的每一页的完整url
crawl_url = urlrequest.urlopen(url).read()
https_url = crawl_url.decode('utf8')
soup = BeautifulSoup(https_url,'html.parser')
all_soup = soup.find_all(class_ = '_22560')
links_url = "https://{}.fangdd.com"#这里在com后面没有加/是因为爬取的link前面已经带有/
link_url = links_url.format(location)
for each_soup in all_soup:
city = soup.find(class_ ='_1Ftcx').get_text().replace('\r\n','').replace(' ','').replace(',','')
name = each_soup.find(class_ ='_2Q-Ct').get_text().replace('\r\n','').replace(' ','').replace(',','')
areas = each_soup.find(class_ ='_2Sxyg').get_text().replace('\r\n','').replace(' ','').replace(',','')
details = each_soup.find(class_ ='_19Hij').get_text().replace('\r\n','').replace(' ','').replace(',','').split('|')
area = details[0]
#此后的几个特征都使用try和except的方式,存在特殊情况,确保统一性
try:
house_type = details[1]
except:
house_type = ""
try:
floor_space = details[2]
except:
floor_space = ""
try :
total_price = each_soup.find(class_ ='_1zKaO').get_text().replace('\r\n','').replace(' ','').replace(',','')
except:
total_price = each_soup.find(class_ ='X3L_9').get_text().replace('\r\n','').replace(' ','').replace(',','')
try:
price = each_soup.find(class_ ='_3J8M9').get_text().replace('\r\n','').replace(' ','') .replace(',','')
except:
price = ""
try:
attention = each_soup.find(class_ ='_2b7ai').get_text().replace('\r\n','').replace(' ','')
except:
attention = ""
links = each_soup.find(class_ ='_1AXFZ')
link = links.find_all('a')[0]
link_name=(link["href"])
true_link = link_url + link_name #通过抓取href再拼接上link_url组成完成的每个楼盘的url
#导出每一个特征,组成文件
outputfile.write('{},{},{},{},{},{},{},{},{}\n'.format(city,name,area,house_type,floor_space,total_price,price,attention,true_link))
爬取的截图结果如下:
![](https://img.haomeiwen.com/i7440249/dee019a5d5a157d4.png)
爬取的结果一共3056行,在获得csv文件后,直接用excel打开中文会出现乱码,需要使用记事本打开后,另存,改变编码方式为ANSI,再使用csv打开即可搞定。
其实写这次爬虫作业基本没有使用到DC爬虫课程中的学习内容,之前学习完DC的数据分析课程后,感觉自己的编程基础薄弱;最近在学习python的基础;突然在群里收到的消息,所以才想做一下这个作业,看了以及交完作业的几个同学写的爬虫,感觉很棒;待完成python基础的学习后,再来学习爬虫课程,xpath看起来很好用啊!后面要加油赶上进度了,尽早开始爬虫学习啦!希望能像ZhuNewNew同学一样,系统地写一个爬虫代码。
网友评论