专注app软件定制开发python爬取网站数据(含代码和讲解)

提示:专注app软件定制开发本次爬取是利用进行,专注app软件定制开发按文章的顺序走就OK的;

文章目录


前言

专注app软件定制开发这次爬取的网站是房天下网站;

专注app软件定制开发其中包含很多楼盘信息:https://newhouse.fang.com/house/s/b81-b91/

我在网站上进行了一步筛选,即选取北京及北京周边的房源,各位要是想爬取其他城市的房源信息也很简单,改一下url信息即可。

一、的准备

1.观察url规律

观察到北京及周边地区的房源有很多网页,翻几页就能发现url的规律:

网址就是:https://newhouse.fang.com/house/s/  +  b81-b9X  +  /   ;其中X是页码

 利用for循环遍历所有网页:

  1. for i in range(33): # 每页20个小区,共648个小区
  2. url = 'https://newhouse.fang.com/house/s/b81-b9' + str(i+1) + '/'

pip 安装库:

fake-useragent可以伪装生成headers请求头中的User Agent值,将爬虫伪装成浏览器正常操作。

!pip install fake_useragent

导入接下来会用到的包: 

  1. ## 导包
  2. from lxml import etree
  3. import requests
  4. from fake_useragent import UserAgent
  5. import pandas as pd
  6. import random
  7. import time
  8. import csv

设置请求参数:需要大家替换的有'cookie'和'referer'两项的值:

'cookie':每次访问网站服务器的时候,服务器都会在本地设置cookie,表明访问者的身份。记得每次使用时,都要按照固定方法人工填入一个 cookie。

 'referer':请求参数,标识请求是从哪个页面过来的。

  1. # 设置请求头参数:User-Agent, cookie, referer
  2. headers = {
  3. 'User-Agent' : UserAgent().random,
  4. 'cookie' : "global_cookie=kxyzkfz09n3hnn14le9z39b9g3ol3wgikwn; city=www; city.sig=OGYSb1kOr8YVFH0wBEXukpoi1DeOqwvdseB7aTrJ-zE; __utmz=147393320.1664372701.10.4.utmcsr=mp.csdn.net|utmccn=(referral)|utmcmd=referral|utmcct=/mp_blog/creation/editor; csrfToken=KUlWFFT_pcJiH1yo3qPmzIc_; g_sourcepage=xf_lp^lb_pc'; __utmc=147393320; unique_cookie=U_bystp5cfehunxkbjybklkryt62fl8mfox4z*3; __utma=147393320.97036532.1606372168.1664431058.1664433514.14; __utmt_t0=1; __utmt_t1=1; __utmt_t2=1; __utmt_t3=1; __utmt_t4=1; __utmb=147393320.5.10.1664433514",
  5. # 设置从何处跳转过来
  6. 'referer': 'https://newhouse.fang.com/house/s/b81-b91/'
  7. }

具体更改方法请见链接:

【腾讯文档】'cookie'和 'referer'的更改方法:

只能走链接了,一直审核不过555~ 

2.设定爬取位置和路径(xpath)

因为爬取数据主要依托于'目标数据所在位置的确定’,所以一定先要搞清楚目标数据的位置(位于div的哪一块);

先发送请求: 

  1. url = 'https://newhouse.fang.com/house/s/b81-b91/'# 首页网址URL
  2. page_text = requests.get(url=url, headers=headers).text# 请求发送
  3. tree = etree.HTML(page_text)#数据解析

我想爬取的数据主要就是:楼盘名称、评论数、房屋面积、详细地址、所在区域、均价 5项数据。

代码已经贴在下面了,具体方法描述还是走个链接: 

【腾讯文档】获取具体爬取位置的讲解

  1. # 小区名称
  2. name = [i.strip() for i in tree.xpath("//div[@class='nlcd_name']/a/text()")]
  3. print(name)
  4. print(len(name))
  5. # 评论数
  6. commentCounts = tree.xpath("//span[@class='value_num']/text()")
  7. print(commentCounts)
  8. print(len(commentCounts))
  9. # 房屋面积
  10. buildingarea = [i.strip() for i in tree.xpath("//div[@class='house_type clearfix']/text()")]
  11. print(buildingarea)
  12. print(len(buildingarea))
  13. # 详细地址
  14. detailAddress = tree.xpath("//div[@class='address']/a/@title")
  15. print(detailAddress)
  16. print(len(detailAddress))
  17. # 所在区
  18. district = [i.strip() for i in tree.xpath("//div[@class='address']//span[@class='sngrey']/text()")]
  19. print(district)
  20. print(len(district))
  21. # 均价
  22. num = tree.xpath("//div[@class='nlc_details']/div[@class='nhouse_price']/span/text() | //div[@class='nlc_details']/div[@class='nhouse_price']/i/text()")
  23. unit = tree.xpath("//div[@class='nlc_details']/div[@class='nhouse_price']/em/text()")
  24. price = [i+j for i,j in zip(num, unit)]
  25. print(price)
  26. print(len(price))

此时采集到的数据还包含着:[]方括号、—横杠、“平米”等符号或者单位,所以要对数据进行简单的split处理,把真正需要的数据提取出来:

  1. # 评论数处理
  2. commentCounts = [int(i.split('(')[1].split('条')[0]) for i in commentCounts]
  3. print(commentCounts)
  4. # 详细地址处理
  5. detailAddress = [i.split(']')[1] for i in detailAddress]
  6. print(detailAddress)
  7. # 所在区字段处理
  8. district = [i.split('[')[1].split(']')[0] for i in district]
  9. print(district)
  10. # 房屋面积处理
  11. t = []
  12. for i in buildingarea:
  13. if i != '/' and i != '':
  14. t.append(i.split('—')[1].split('平米')[0])
  15. print(t)
  16. print(len(t))

二、数据采集

1. 建立存放数据的dataframe

  1. df = pd.DataFrame(columns = ['小区名称', '详细地址', '所在区', '均价', '评论数'])
  2. df

2. 开始爬取

这里图方便就只爬取了前10页,因为后面的房源就经常少信息,要么没有面积信息,要么没有所在区域。 

  1. for k in range(10):
  2. url = 'https://newhouse.fang.com/house/s/b81-b9' + str(k+1) + '/'
  3. page_text = requests.get(url=url, headers=headers).text #请求发送
  4. tree = etree.HTML(page_text) #数据解析
  5. # 小区名称
  6. name = [i.strip() for i in tree.xpath("//div[@class='nlcd_name']/a/text()")]
  7. # 评论数
  8. commentCounts = tree.xpath("//span[@class='value_num']/text()")
  9. # 详细地址
  10. detailAddress = tree.xpath("//div[@class='address']/a/@title")
  11. # 所在区
  12. district = [i.strip() for i in tree.xpath("//div[@class='address']//text()")]
  13. # 均价
  14. num = tree.xpath("//div[@class='nlc_details']/div[@class='nhouse_price']/span/text() | //div[@class='nlc_details']/div[@class='nhouse_price']/i/text()")
  15. unit = tree.xpath("//div[@class='nlc_details']/div[@class='nhouse_price']/em/text()")
  16. price = [i+j for i,j in zip(num, unit)]
  17. #评论数处理
  18. commentCounts = [int(i.split('(')[1].split('条')[0]) for i in commentCounts]
  19. #详细地址处理
  20. tmp1 = []
  21. for i in detailAddress:
  22. if ']' in i:
  23. tmp1.append(i.split(']')[1])
  24. continue
  25. tmp1.append(i)
  26. detailAddress = tmp1
  27. #所在区处理
  28. tmp2 = []
  29. for i in district:
  30. if ']' in i and '[' in i:
  31. tmp2.append(i.split(']')[0].split('[')[1])
  32. district = tmp2
  33. dic = {'小区名称':name, '详细地址':detailAddress, '所在区':district, '均价':price, '评论数':commentCounts}
  34. df2 = pd.DataFrame(dic)
  35. df = pd.concat([df,df2], axis=0)
  36. print('第{}页爬取成功, 共{}条数据'.format(k+1, len(df2)))
  37. print('全部数据爬取成功')

3. 把数据导出成csv表格

df.to_csv('北京小区数据信息.csv',index=None)

总结

说实话,本文使用的爬取方法简单而且信息正确,但是存在一些不足,比如面对楼盘的部分信息空缺时,就无法按照null来采集,而是会报错,所以我现有的解决方法就是在循环中人工去设置条件,跳过空缺信息。

我会继续优化这个方法的~

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发