python爬虫requests源码链家_python爬虫:爬取链家深圳全部二手房的详细信息

1、问题描述:

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

2、思路分析:

(1)目标网址:

(2)代码结构:

class lianjiaspider(object):

def __init__(self):

def getmaxpage(self, url): # 获取maxpage

def parsepage(self, url): # 解析每个page,获取每个huose的link

def parsedetail(self, url): # 根据link,获取每个house的详细信息

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

· hearders用到了fake_useragent库,用来随机生成请求头。

· datas空列表,用于保存爬取的数据。

def __init__(self):

self.headers = {"user-agent": useragent().random}

self.datas = list()

(4) getmaxpage()函数

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

b_0_201811081347438678.jpg

def getmaxpage(self, url):

response = requests.get(url, headers = self.headers)

if response.status_code == 200:

source = response.text

soup = beautifulsoup(source, "html.parser")

pagedata = soup.find("div", class_ = "page-box house-lst-page-box")["page-data"]

# pagedata = '{"totalpage":100,"curpage":1}',通过eval()函数把字符串转换为字典

maxpage = eval(pagedata)["totalpage"]

return maxpage

else:

print("fail status: {}".format(response.status_code))

return none

(5)parsepage()函数

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

def parsepage(self, url):

maxpage = self.getmaxpage(url)

# 解析每个page,获取每个二手房的链接

for pagenum in range(1, maxpage+1 ):

url = "https://sz.lianjia.com/ershoufang/pg{}/".format(pagenum)

print("当前正在爬取: {}".format(url))

response = requests.get(url, headers = self.headers)

soup = beautifulsoup(response.text, "html.parser")

links = soup.find_all("div", class_ = "info clear")

for i in links:

link = i.find("a")["href"] #每个标签有很多,而我们只需要第一个,所以用find

detail = self.parsedetail(link)

self.datas.append(detail)

(6)parsedetail()函数

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

def parsedetail(self, url):

response = requests.get(url, headers = self.headers)

detail = {}

if response.status_code == 200:

soup = beautifulsoup(response.text, "html.parser")

detail["价格"] = soup.find("span", class_ = "total").text

detail["单价"] = soup.find("span", class_ = "unitpricevalue").text

detail["小区"] = soup.find("div", class_ = "communityname").find("a", class_ = "info").text

detail["位置"] = soup.find("div", class_="areaname").find("span", class_="info").text

detail["地铁"] = soup.find("div", class_="areaname").find("a", class_="supplement").text

base = soup.find("div", class_ = "base").find_all("li") # 基本信息

detail["户型"] = base[0].text[4:]

detail["面积"] = base[2].text[4:]

detail["朝向"] = base[6].text[4:]

detail["电梯"] = base[10].text[4:]

return detail

else:

return none

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

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

# 将所有爬取的二手房数据存储到csv文件中

data = pd.dataframe(self.datas)

# columns字段:自定义列的顺序(dataframe默认按列名的字典序排序)

columns = ["小区", "户型", "面积", "价格", "单价", "朝向", "电梯", "位置", "地铁"]

data.to_csv(".\lianjia_ii.csv", encoding='utf_8_sig', index=false, columns=columns)

3、效果展示

b_0_201811081347431906.jpg

4、完整代码:

# -* coding: utf-8 *-

#author: wangshx6

#data: 2018-11-07

#descriptinon: 爬取链家深圳全部二手房的详细信息,并将爬取的数据存储到csv文

import requests

from bs4 import beautifulsoup

import pandas as pd

from fake_useragent import useragent

class lianjiaspider(object):

def __init__(self):

self.headers = {"user-agent": useragent().random}

self.datas = list()

def getmaxpage(self, url):

response = requests.get(url, headers = self.headers)

if response.status_code == 200:

source = response.text

soup = beautifulsoup(source, "html.parser")

pagedata = soup.find("div", class_ = "page-box house-lst-page-box")["page-data"]

# pagedata = '{"totalpage":100,"curpage":1}',通过eval()函数把字符串转换为字典

maxpage = eval(pagedata)["totalpage"]

return maxpage

else:

print("fail status: {}".format(response.status_code))

return none

def parsepage(self, url):

maxpage = self.getmaxpage(url)

# 解析每个page,获取每个二手房的链接

for pagenum in range(1, maxpage+1 ):

url = "https://sz.lianjia.com/ershoufang/pg{}/".format(pagenum)

print("当前正在爬取: {}".format(url))

response = requests.get(url, headers = self.headers)

soup = beautifulsoup(response.text, "html.parser")

links = soup.find_all("div", class_ = "info clear")

for i in links:

link = i.find("a")["href"] #每个标签有很多,而我们只需要第一个,所以用find

detail = self.parsedetail(link)

self.datas.append(detail)

# 将所有爬取的二手房数据存储到csv文件中

data = pd.dataframe(self.datas)

# columns字段:自定义列的顺序(dataframe默认按列名的字典序排序)

columns = ["小区", "户型", "面积", "价格", "单价", "朝向", "电梯", "位置", "地铁"]

data.to_csv(".\lianjia_ii.csv", encoding='utf_8_sig', index=false, columns=columns)

def parsedetail(self, url):

response = requests.get(url, headers = self.headers)

detail = {}

if response.status_code == 200:

soup = beautifulsoup(response.text, "html.parser")

detail["价格"] = soup.find("span", class_ = "total").text

detail["单价"] = soup.find("span", class_ = "unitpricevalue").text

detail["小区"] = soup.find("div", class_ = "communityname").find("a", class_ = "info").text

detail["位置"] = soup.find("div", class_="areaname").find("span", class_="info").text

detail["地铁"] = soup.find("div", class_="areaname").find("a", class_="supplement").text

base = soup.find("div", class_ = "base").find_all("li") # 基本信息

detail["户型"] = base[0].text[4:]

detail["面积"] = base[2].text[4:]

detail["朝向"] = base[6].text[4:]

detail["电梯"] = base[10].text[4:]

return detail

else:

return none

if __name__ == "__main__":

lianjia = lianjiaspider()

lianjia.parsepage("https://sz.lianjia.com/ershoufang/")

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值