0


python爬取网站数据(含代码和讲解)

提示:本次爬取是利用xpath进行,按文章的顺序走就OK的;

前言

这次爬取的网站是房天下网站;

其中包含很多楼盘信息: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库:

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

  1. !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'的更改方法:
https://docs.qq.com/doc/DR2RzUkJTQXJ5ZGt6

只能走链接了,一直审核不过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项数据。

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

【腾讯文档】获取具体爬取位置的讲解
https://docs.qq.com/doc/DR3BFRW1lVGFRU0Na

  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表格

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

总结

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

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


本文转载自: https://blog.csdn.net/weixin_50706330/article/details/127115265
版权归原作者 99.99% 所有, 如有侵权,请联系我们删除。

“python爬取网站数据(含代码和讲解)”的评论:

还没有评论