2025年5月17日 星期六 乙巳(蛇)年 二月十九 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > Python

爬取安居客租房详情+翻页

时间:03-29来源:作者:点击数:33

爬取链接:https://wf.zu.anjuke.com/?from=navigation

首先我们先打开浏览器,输入网址,利用network进行抓包,找到type ducument响应源码文件

在这里插入图片描述

我们发现我们要爬取的数据在html源码中,那么我们就方便了,使用requests和lxml配合使用爬取租房信息,采用面向对象进行开发,方便代码修改,然后我们编写代码!!!

  • # -- coding: utf-8 --
  • # @Time : 2020/12/28 15:40
  • # @FileName: Anjuke.py
  • # @Software: PyCharm
  • import requests
  • from lxml import etree
  • import csv
  • from pymongo import MongoClient
  • class Anjuke(object):
  • def __init__(self):
  • self.url = 'https://wf.zu.anjuke.com/?from=navigation'
  • self.headers = {
  • 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
  • 'Chrome/87.0.4280.88 Safari/537.36 ',
  • 'referer': 'https://weifang.anjuke.com/'
  • }
  • self.client = MongoClient("127.0.0.1", 27017)
  • self.db = self.client['Anjuke']
  • self.col = self.db['House']
  • def get_data(self):
  • proxies_url = 'http://webapi.http.zhimacangku.com/getip?num=20&type=2&pro=&city=0&yys=0&port=1&pack=131877&ts' \
  • '=0&ys=0&cs=0&lb=1&sb=0&pb=4&mr=1&regions= '
  • res = requests.get(proxies_url)
  • dict_data = json.loads(res.content)
  • for agent in dict_data["data"]:
  • ip = agent['ip']
  • port = agent['port']
  • # 代理服务器
  • proxyHost = ip
  • proxyPort = port
  • proxyMeta = "http://%(host)s:%(port)s" % {
  • "host": proxyHost,
  • "port": proxyPort,
  • }
  • self.proxies = {
  • "http": proxyMeta
  • }
  • response = requests.get(url=self.url, proxies=self.proxies)
  • return response
  • def parse_data(self, response):
  • html = etree.HTML(response.content)
  • node_list = html.xpath('//div[@class="zu-itemmod"]')
  • data_list = list()
  • for node in node_list:
  • temp = {}
  • temp["标题"] = node.xpath("./div[1]/h3/a/b/text()")[0]
  • temp["链接"] = node.xpath("./div[1]/h3/a/@href")[0]
  • temp["价格"] = node.xpath("./div[2]/p/strong/b/text()")[0] + '元'
  • temp["大小"] = node.xpath("./div[1]/p[1]/b[3]/text()")[0] + '平米'
  • shi = node.xpath("./div[1]/p[1]/b[1]/text()")[0]
  • ting = node.xpath("./div[1]/p[1]/b[2]/text()")[0]
  • temp["户型"] = shi + '室' + ting + '厅'
  • temp["姓名"] = node.xpath("./div[1]/p[1]/text()[6]")[0].strip()
  • temp["小区"] = node.xpath("./div[1]/address/a/text()")[0]
  • temp["地址"] = node.xpath("./div[1]/address/text()")[1].strip()
  • temp["整租"] = node.xpath("./div[1]/p[2]/span[1]/text()")[0]
  • temp["方向"] = node.xpath("./div[1]/p[2]/span[2]/text()")[0]
  • detail_link = temp["链接"]
  • self.url = detail_link
  • print(self.url)
  • response = requests.get(url=self.url, headers=self.headers)
  • html = etree.HTML(response.content)
  • try:
  • temp["要求"] = html.xpath('/html/body/div[3]/div[2]/div[1]/ul[1]/li[1]/span[2]/text()')[0]
  • except:
  • temp["要求"] = "空"
  • try:
  • temp["描述"] = html.xpath('/html/body/div[3]/div[2]/div[1]/div[6]/b/text()')[0]
  • except:
  • temp["描述"] = "空"
  • try:
  • temp["图片"] = html.xpath('//*[@id="room_pic_wrap"]/div/img/@data-src')[0]
  • except:
  • temp["图片"] = "空"
  • try:
  • temp["日期"] = html.xpath('/html/body/div[3]/div[2]/div[1]/div[2]/div/b/text()')[0]
  • except:
  • temp["日期"] = "空"
  • print(temp)
  • data_list.append(temp)
  • return data_list
  • def save_data(self, data_list):
  • for data in data_list:
  • csv_writer.writerow(
  • [data["标题"], data["链接"], data["价格"], data["大小"], data["户型"], data["姓名"], data["小区"], data["地址"],
  • data["整租"], data["方向"], data["要求"], data["描述"], data["图片"], data["日期"]])
  • self.col.insert_one(data)
  • self.client.close()
  • def run(self):
  • while True:
  • response = self.get_data()
  • data_list = self.parse_data(response)
  • self.save_data(data_list)
  • html = etree.HTML(response.content)
  • try:
  • next_url = html.xpath('//*[contains(text(),"下一页")]/@href')[0]
  • print(next_url)
  • self.url = next_url
  • except:
  • break
  • if __name__ == '__main__':
  • head = ["标题", "链接", "价格", "大小", "户型", "姓名", "小区", "地址", "整租", "方向", "要求", "描述", "图片", "日期"]
  • with open('安居客.csv', 'w', newline='', encoding="gb18030") as f:
  • csv_writer = csv.writer(f)
  • csv_writer.writerow(head)
  • anjuke = Anjuke()
  • anjuke.run()

将数据存储到csv中,并存储到mongodb数据库,并且实现了翻页功能,其中还添加了代理,因为在打开详情页时访问频繁被屏蔽403,利用代理ip进行爬取!

存储到csv的截图
存储到mongodb的截图

我爬取的是潍坊,如果想爬其他的地方,wf换成你想爬的城市的缩写就行

希望大家多多给我点赞呀!

在这里插入图片描述
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门