当前位置:   article > 正文

python爬虫:爬取链家深圳全部二手房的详细信息_链家爬取二手房数据如何爬取全部

链家爬取二手房数据如何爬取全部

1、问题描述:

爬取链家深圳全部二手房的详细信息,并将爬取的数据存储到CSV文件中

2、思路分析:

(1)目标网址:https://sz.lianjia.com/ershoufang/

(2)代码结构:

  1. class LianjiaSpider(object):
  2. def __init__(self):
  3. def getMaxPage(self, url): # 获取maxPage
  4. def parsePage(self, url): # 解析每个page,获取每个huose的Link
  5. def parseDetail(self, url): # 根据Link,获取每个house的详细信息

(3) init(self)初始化函数

· hearders用到了fake_useragent库,用来随机生成请求头。
· datas空列表,用于保存爬取的数据。

  1. def __init__(self):
  2. self.headers = {"User-Agent": UserAgent().random}
  3. self.datas = list()

(4) getMaxPage()函数

主要用来获取二手房页面的最大页数.
Lianjia_II-01.png

  1. def getMaxPage(self, url):
  2. response = requests.get(url, headers = self.headers)
  3. if response.status_code == 200:
  4. source = response.text
  5. soup = BeautifulSoup(source, "html.parser")
  6. pageData = soup.find("div", class_ = "page-box house-lst-page-box")["page-data"]
  7. # pageData = '{"totalPage":100,"curPage":1}',通过eval()函数把字符串转换为字典
  8. maxPage = eval(pageData)["totalPage"]
  9. return maxPage
  10. else:
  11. print("Fail status: {}".format(response.status_code))
  12. return None

(5)parsePage()函数

主要是用来进行翻页的操作,得到每一页的所有二手房的Links链接。它通过利用一个for循环来重构 url实现翻页操作,而循环最大页数就是通过上面的 getMaxPage() 来获取到。

  1. def parsePage(self, url):
  2. maxPage = self.getMaxPage(url)
  3. # 解析每个page,获取每个二手房的链接
  4. for pageNum in range(1, maxPage+1 ):
  5. url = "https://sz.lianjia.com/ershoufang/pg{}/".format(pageNum)
  6. print("当前正在爬取: {}".format(url))
  7. response = requests.get(url, headers = self.headers)
  8. soup = BeautifulSoup(response.text, "html.parser")
  9. links = soup.find_all("div", class_ = "info clear")
  10. for i in links:
  11. link = i.find("a")["href"] #每个<info clear>标签有很多<a>,而我们只需要第一个,所以用find
  12. detail = self.parseDetail(link)
  13. self.datas.append(detail)

(6)parseDetail()函数

根据parsePage()函数获取的二手房Link链接,向该链接发送请求,获取出详细页面信息。

  1. def parseDetail(self, url):
  2. response = requests.get(url, headers = self.headers)
  3. detail = {}
  4. if response.status_code == 200:
  5. soup = BeautifulSoup(response.text, "html.parser")
  6. detail["价格"] = soup.find("span", class_ = "total").text
  7. detail["单价"] = soup.find("span", class_ = "unitPriceValue").text
  8. detail["小区"] = soup.find("div", class_ = "communityName").find("a", class_ = "info").text
  9. detail["位置"] = soup.find("div", class_="areaName").find("span", class_="info").text
  10. detail["地铁"] = soup.find("div", class_="areaName").find("a", class_="supplement").text
  11. base = soup.find("div", class_ = "base").find_all("li") # 基本信息
  12. detail["户型"] = base[0].text[4:]
  13. detail["面积"] = base[2].text[4:]
  14. detail["朝向"] = base[6].text[4:]
  15. detail["电梯"] = base[10].text[4:]
  16. return detail
  17. else:
  18. return None

(7)将数据存储到CSV文件中

这里用到了 pandas 库的 DataFrame() 方法,它默认的是按照列名的字典顺序排序的。想要自定义列的顺序,可以加columns字段。

  1. # 将所有爬取的二手房数据存储到csv文件中
  2. data = pd.DataFrame(self.datas)
  3. # columns字段:自定义列的顺序(DataFrame默认按列名的字典序排序)
  4. columns = ["小区", "户型", "面积", "价格", "单价", "朝向", "电梯", "位置", "地铁"]
  5. data.to_csv(".\Lianjia_II.csv", encoding='utf_8_sig', index=False, columns=columns)

3、效果展示

Lianjia_II-02.png

 

4、完整代码:

  1. # -* coding: utf-8 *-
  2. #author: wangshx6
  3. #data: 2018-11-07
  4. #descriptinon: 爬取链家深圳全部二手房的详细信息,并将爬取的数据存储到CSV文
  5. import requests
  6. from bs4 import BeautifulSoup
  7. import pandas as pd
  8. from fake_useragent import UserAgent
  9. class LianjiaSpider(object):
  10. def __init__(self):
  11. self.headers = {"User-Agent": UserAgent().random}
  12. self.datas = list()
  13. def getMaxPage(self, url):
  14. response = requests.get(url, headers = self.headers)
  15. if response.status_code == 200:
  16. source = response.text
  17. soup = BeautifulSoup(source, "html.parser")
  18. pageData = soup.find("div", class_ = "page-box house-lst-page-box")["page-data"]
  19. # pageData = '{"totalPage":100,"curPage":1}',通过eval()函数把字符串转换为字典
  20. maxPage = eval(pageData)["totalPage"]
  21. return maxPage
  22. else:
  23. print("Fail status: {}".format(response.status_code))
  24. return None
  25. def parsePage(self, url):
  26. maxPage = self.getMaxPage(url)
  27. # 解析每个page,获取每个二手房的链接
  28. for pageNum in range(1, maxPage+1 ):
  29. url = "https://sz.lianjia.com/ershoufang/pg{}/".format(pageNum)
  30. print("当前正在爬取: {}".format(url))
  31. response = requests.get(url, headers = self.headers)
  32. soup = BeautifulSoup(response.text, "html.parser")
  33. links = soup.find_all("div", class_ = "info clear")
  34. for i in links:
  35. link = i.find("a")["href"] #每个<info clear>标签有很多<a>,而我们只需要第一个,所以用find
  36. detail = self.parseDetail(link)
  37. self.datas.append(detail)
  38. # 将所有爬取的二手房数据存储到csv文件中
  39. data = pd.DataFrame(self.datas)
  40. # columns字段:自定义列的顺序(DataFrame默认按列名的字典序排序)
  41. columns = ["小区", "户型", "面积", "价格", "单价", "朝向", "电梯", "位置", "地铁"]
  42. data.to_csv(".\Lianjia_II.csv", encoding='utf_8_sig', index=False, columns=columns)
  43. def parseDetail(self, url):
  44. response = requests.get(url, headers = self.headers)
  45. detail = {}
  46. if response.status_code == 200:
  47. soup = BeautifulSoup(response.text, "html.parser")
  48. detail["价格"] = soup.find("span", class_ = "total").text
  49. detail["单价"] = soup.find("span", class_ = "unitPriceValue").text
  50. detail["小区"] = soup.find("div", class_ = "communityName").find("a", class_ = "info").text
  51. detail["位置"] = soup.find("div", class_="areaName").find("span", class_="info").text
  52. detail["地铁"] = soup.find("div", class_="areaName").find("a", class_="supplement").text
  53. base = soup.find("div", class_ = "base").find_all("li") # 基本信息
  54. detail["户型"] = base[0].text[4:]
  55. detail["面积"] = base[2].text[4:]
  56. detail["朝向"] = base[6].text[4:]
  57. detail["电梯"] = base[10].text[4:]
  58. return detail
  59. else:
  60. return None
  61. if __name__ == "__main__":
  62. Lianjia = LianjiaSpider()
  63. Lianjia.parsePage("https://sz.lianjia.com/ershoufang/")

5、改进:

1、为了获取更多的房源信息, 可以增加限制条件, 这样每个条件都能获取100页的信息, 可以爬取更多的信息

2、为了防止被网页限制访问, 可以在每次访问网页后暂停一段时间

3、为了防止系统中断时没有及时保存信息, 没爬取2页保存一次。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/504289
推荐阅读
相关标签
  

闽ICP备14008679号