Python3 爬虫实战 — 安居客武汉二手房【requests、Beautiful Soup、CSV】


  • 爬取时间:2019-10-09
  • 爬取难度:★★☆☆☆☆
  • 请求链接:https://wuhan.anjuke.com/sale/
  • 爬取目标:爬取武汉二手房每一条售房信息,包含地理位置、价格、面积等,保存为 CSV 文件
  • 涉及知识:请求库 requests、解析库 Beautiful Soup、CSV 文件储存、列表操作、分页判断
  • 完整代码:https://github.com/TRHX/Python3-Spider-Practice/tree/master/BasicTraining/anjuke
  • 其他爬虫实战代码合集(持续更新):https://github.com/TRHX/Python3-Spider-Practice
  • 爬虫实战专栏(持续更新):https://itrhx.blog.csdn.net/article/category/9351278

文章目录

  • 【1x00】页面整体分析
  • 【2x00】解析模块
  • 【3x00】循环爬取模块
  • 【4x00】数据储存模块
  • 【5x00】完整代码
  • 【6x00】数据截图
  • 【7x00】程序不足的地方


【1x00】页面整体分析

分析 安居客武汉二手房页面,这次爬取实战准备使用 BeautifulSoup 解析库,熟练 BeautifulSoup 解析库的用法,注意到该页面与其他页面不同的是,不能一次性看到到底有多少页,以前知道一共有多少页,直接一个循环爬取就行了,虽然可以通过改变 url 来尝试找到最后一页,但是这样就显得不程序员了?,因此可以通过 BeautifulSoup 解析 下一页按钮,提取到下一页的 url,直到没有 下一页按钮 这个元素为止,从而实现所有页面的爬取,剩下的信息提取和储存就比较简单了


【2x00】解析模块

分析页面,可以发现每条二手房信息都是包含在 <li> 标签内的,因此可以使用 BeautifulSoup 解析页面得到所有的 <li> 标签,然后再循环访问每个 <li> 标签,依次解析得到每条二手房的各种信息
01

def parse_pages(url, num):response = requests.get(url=url, headers=headers)soup = BeautifulSoup(response.text, 'lxml')result_list = soup.find_all('li', class_='list-item')# print(len(result_list))for result in result_list:# 标题title = result.find('a', class_='houseListTitle').text.strip()# print(title)# 户型layout = result.select('.details-item > span')[0].text# print(layout)# 面积cover = result.select('.details-item > span')[1].text# print(cover)# 楼层floor = result.select('.details-item > span')[2].text# print(floor)# 建造年份year = result.select('.details-item > span')[3].text# print(year)# 单价unit_price = result.find('span', class_='unit-price').text.strip()# print(unit_price)# 总价total_price = result.find('span', class_='price-det').text.strip()# print(total_price)# 关键字keyword = result.find('div', class_='tags-bottom').text.strip()# print(keyword)# 地址address = result.find('span', class_='comm-address').text.replace(' ', '').replace('\n', '')# print(address)# 详情页urldetails_url = result.find('a', class_='houseListTitle')['href']# print(details_url)if __name__ == '__main__':start_num = 0start_url = 'https://wuhan.anjuke.com/sale/'parse_pages(start_url, start_num)

【3x00】循环爬取模块

前面已经分析过,该网页是无法一下就能看到一共有多少页的,尝试找到最后一页,发现一共有50页,那么此时就可以搞个循环,一直到第50页就行了,但是如果有一天页面数增加了呢,那么代码的可维护性就不好了,我们可以观察 下一页按钮 ,当存在下一页的时候,是 <a> 标签,并且带有下一页的 URL,不存在下一页的时候是 <i> 标签,因此可以写个 if 语句,判断是否存在此 <a> 标签,若存在,表示有下一页,然后提取其 href 属性并传给解析模块,实现后面所有页面的信息提取,此外,由于安居客有反爬系统,我们还可以利用 Python中的 random.randint() 方法,在两个数值之间随机取一个数,传入 time.sleep() 方法,实现随机暂停爬取
02

# 判断是否还有下一页
next_url = soup.find_all('a', class_='aNxt')
if len(next_url) != 0:num += 1print('第' + str(num) + '页数据爬取完毕!')# 3-60秒之间随机暂停time.sleep(random.randint(3, 60))parse_pages(next_url[0].attrs['href'], num)
else:print('所有数据爬取完毕!')

【4x00】数据储存模块

数据储存比较简单,将每个二手房信息组成一个列表,依次写入到 anjuke.csv 文件中即可

results = [title, layout, cover, floor, year, unit_price, total_price, keyword, address, details_url]
with open('anjuke.csv', 'a', newline='', encoding='utf-8-sig') as f:w = csv.writer(f)w.writerow(results)

【5x00】完整代码

# =============================================
# --*-- coding: utf-8 --*--
# @Time    : 2019-10-09
# @Author  : TRHX
# @Blog    : www.itrhx.com
# @CSDN    : https://blog.csdn.net/qq_36759224
# @FileName: anjuke.py
# @Software: PyCharm
# =============================================import requests
import time
import csv
import random
from bs4 import BeautifulSoupheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
}def parse_pages(url, num):response = requests.get(url=url, headers=headers)soup = BeautifulSoup(response.text, 'lxml')result_list = soup.find_all('li', class_='list-item')# print(len(result_list))for result in result_list:# 标题title = result.find('a', class_='houseListTitle').text.strip()# print(title)# 户型layout = result.select('.details-item > span')[0].text# print(layout)# 面积cover = result.select('.details-item > span')[1].text# print(cover)# 楼层floor = result.select('.details-item > span')[2].text# print(floor)# 建造年份year = result.select('.details-item > span')[3].text# print(year)# 单价unit_price = result.find('span', class_='unit-price').text.strip()# print(unit_price)# 总价total_price = result.find('span', class_='price-det').text.strip()# print(total_price)# 关键字keyword = result.find('div', class_='tags-bottom').text.strip()# print(keyword)# 地址address = result.find('span', class_='comm-address').text.replace(' ', '').replace('\n', '')# print(address)# 详情页urldetails_url = result.find('a', class_='houseListTitle')['href']# print(details_url)results = [title, layout, cover, floor, year, unit_price, total_price, keyword, address, details_url]with open('anjuke.csv', 'a', newline='', encoding='utf-8-sig') as f:w = csv.writer(f)w.writerow(results)# 判断是否还有下一页next_url = soup.find_all('a', class_='aNxt')if len(next_url) != 0:num += 1print('第' + str(num) + '页数据爬取完毕!')# 3-60秒之间随机暂停time.sleep(random.randint(3, 60))parse_pages(next_url[0].attrs['href'], num)else:print('所有数据爬取完毕!')if __name__ == '__main__':with open('anjuke.csv', 'a', newline='', encoding='utf-8-sig') as fp:writer = csv.writer(fp)writer.writerow(['标题', '户型', '面积', '楼层', '建造年份', '单价', '总价', '关键字', '地址', '详情页地址'])start_num = 0start_url = 'https://wuhan.anjuke.com/sale/'parse_pages(start_url, start_num)

【6x00】数据截图

03


【7x00】程序不足的地方

  • 虽然使用了随机暂停爬取的方法,但是在爬取了大约 20 页的数据后依然会出现验证页面,导致程序终止

  • 原来设想的是可以由用户手动输入城市的拼音来查询不同城市的信息,方法是把用户输入的城市拼音和其他参数一起构造成一个 URL,然后对该 URL 发送请求,判断请求返回的代码,如果是 200 就代表可以访问,也就是用户输入的城市是正确的,然而发现即便是输入错误,该 URL 依然可以访问,只不过会跳转到一个正确的页面,没有搞清楚是什么原理,也就无法实现由用户输入城市来查询这个功能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/437899.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Sharepoint 修改密码

sharepoint安装在服务器上&#xff0c;比如windows 2008 R2(64), 但是在公司里面经常需要修改电脑的密码&#xff0c;电脑的密码一旦改变则相应的sharepoint服务器场密码也需改变&#xff0c;本文介绍修改sharepoint密码的简单方法&#xff0c;不用在命令行输入命令。 step1:打…

Python3 爬虫实战 — 虎扑论坛步行街【requests、Beautiful Soup、MongoDB】

爬取时间&#xff1a;2019-10-12爬取难度&#xff1a;★★☆☆☆☆请求链接&#xff1a;https://bbs.hupu.com/bxj爬取目标&#xff1a;爬取虎扑论坛步行街的帖子&#xff0c;包含主题&#xff0c;作者&#xff0c;发布时间等&#xff0c;数据保存到 MongoDB 数据库涉及知识&am…

Python3 爬虫实战 — 模拟登陆哔哩哔哩【滑动验证码对抗】

登陆时间&#xff1a;2019-10-21实现难度&#xff1a;★★★☆☆☆请求链接&#xff1a;https://passport.bilibili.com/login实现目标&#xff1a;模拟登陆哔哩哔哩&#xff0c;攻克滑动验证码涉及知识&#xff1a;滑动验证码的攻克、自动化测试工具 Selenium 的使用完整代码&…

Python3 爬虫实战 — 模拟登陆12306【点触验证码对抗】

登陆时间&#xff1a;2019-10-21实现难度&#xff1a;★★★☆☆☆请求链接&#xff1a;https://kyfw.12306.cn/otn/resources/login.html实现目标&#xff1a;模拟登陆中国铁路12306&#xff0c;攻克点触验证码涉及知识&#xff1a;点触验证码的攻克、自动化测试工具 Selenium…

SharePoint无代码工作流设计开发实例——交通费报销流程(一)

开发环境&#xff1a; (1)SharePoint Designer 2010 (2)SharePoint Online(Office 365) 关于Office 365和SharePoint Online的相关信息请参见以下链接 http://blog.csdn.net/miragesky2049/article/details/7242982 1、需求分析 组织结构&#xff1a; 用户类型&#xff1a…

Python3 爬虫实战 — 58同城武汉出租房【加密字体对抗】

爬取时间&#xff1a;2019-10-21爬取难度&#xff1a;★★★☆☆☆请求链接&#xff1a;https://wh.58.com/chuzu/爬取目标&#xff1a;58同城武汉出租房的所有信息涉及知识&#xff1a;网站加密字体的攻克、请求库 requests、解析库 Beautiful Soup、数据库 MySQL 的操作完整代…

SharePoint无代码工作流设计开发实例——交通费报销流程(二)

3、InfoPath表单的设计及发布 (1)数据源和页面设计 域&#xff08;元素&#xff09;和域&#xff08;属性&#xff09;如下&#xff1a; 白色为域&#xff08;元素&#xff09;&#xff0c;该类型的字段&#xff0c;发布时&#xff0c;提升成字段后&#xff0c;列表库的数据是…

SharePoint无代码工作流设计开发实例——交通费报销流程(三)

4、SharePoint Designer无代码工作流的设计 开发工具为SharePoint Designer 2010 新建“列表工作流”&#xff0c;绑定“交通费报销单”表单库 设置工作流启动选项“创建项目时自动启动工作流” 编辑工作流 &#xff08;关于以下工作流详细设计可参考http://blog.csdn.net/mi…

SharePoint学习札记[2] — MOSS2007体系结构概述

熟悉微软Office产品线的人都知道&#xff0c;MOSS 2007的上一个版本SPS 2003的全称是 Office Sharepoint Portal Server&#xff0c;在新版本中&#xff0c;微软去掉了Portal一个词。从这个角度很清楚地看到微软对MOSS 2007的定位&#xff0c;是的&#xff0c;MOSS 已经不再仅仅…

SharePoint学习札记[3] — Office SharePoint Server 2007部署

MOSS的第一步就是部署啦!《0ffice SharePoint Server 2007部署图示指南》图文并茂的展示了OSS2007的部署过程。虽然并不难&#xff0c;但对MOSS还摸不清方向的人来说是个不错的指导。手册的作者没有署名&#xff0c;也查不到出自谁手&#xff0c;在这里对他的劳动成果表示感谢…

SharePoint学习札记[4] — 创建SharePoint站点

为减少创建SharePoint站点过程中的麻烦&#xff0c;先打开IIS管理器&#xff0c;将“默认站点”停止或删除。后面的创建过程中&#xff0c;创建向导会自动创建端口为80的网站。 现在将&#xff1a; 1. 创建两个Web应用程序。 2. 创建共享服务。 3. 创建…

【Python CheckiO 题解】Sun Angle

CheckiO 是面向初学者和高级程序员的编码游戏&#xff0c;使用 Python 和 JavaScript 解决棘手的挑战和有趣的任务&#xff0c;从而提高你的编码技能&#xff0c;本博客主要记录自己用 Python 在闯关时的做题思路和实现代码&#xff0c;同时也学习学习其他大神写的代码。 Chec…

Python CheckiO 题解系列 丨 博客目录索引

CheckiO 是面向初学者和高级程序员的编码游戏&#xff0c;使用 Python 和 JavaScript 解决棘手的挑战和有趣的任务&#xff0c;从而提高你的编码技能&#xff0c;本题解系列主要记录自己在用 Python 闯关时的做题思路和实现代码&#xff0c;同时也学习学习其他大神写的代码。 …

文带你深入了解 Redis 内存模型

前言 Redis是目前最火爆的内存数据库之一&#xff0c;通过在内存中读写数据&#xff0c;大大提高了读写速度&#xff0c;可以说Redis是实现网站高并发不可或缺的一部分。 我们使用Redis时&#xff0c;会接触Redis的5种对象类型&#xff08;字符串、哈希、列表、集合、有序集合…

【Python CheckiO 题解】Pawn Brotherhood

CheckiO 是面向初学者和高级程序员的编码游戏&#xff0c;使用 Python 和 JavaScript 解决棘手的挑战和有趣的任务&#xff0c;从而提高你的编码技能&#xff0c;本博客主要记录自己用 Python 在闯关时的做题思路和实现代码&#xff0c;同时也学习学习其他大神写的代码。 Chec…

【Python CheckiO 题解】Xs and Os Referee

CheckiO 是面向初学者和高级程序员的编码游戏&#xff0c;使用 Python 和 JavaScript 解决棘手的挑战和有趣的任务&#xff0c;从而提高你的编码技能&#xff0c;本博客主要记录自己用 Python 在闯关时的做题思路和实现代码&#xff0c;同时也学习学习其他大神写的代码。 Chec…

c#多线程总结(纯干货)

线程基础 创建线程 static void Main(string[] args) {Thread t new Thread(PrintNumbers);t.Start();//线程开始执行PrintNumbers();Console.ReadKey(); }static void PrintNumbers() {Console.WriteLine("Starting...");for (int i 1; i < 10; i){Console.Wr…

Hexo 博客优化之实用功能添加系列(持续更新)

2022-01-25 更新&#xff1a;博客新地址&#xff1a;https://www.itbob.cn/&#xff0c;文章距上次编辑时间较远&#xff0c;部分内容可能已经过时&#xff01; 本文将讲述一些 Hexo 博客实用功能的添加&#xff0c;本文以作者 luuman 的 spfk 主题和作者 xaoxuu 的 Material X…

【Python CheckiO 题解】The Warriors

CheckiO 是面向初学者和高级程序员的编码游戏&#xff0c;使用 Python 和 JavaScript 解决棘手的挑战和有趣的任务&#xff0c;从而提高你的编码技能&#xff0c;本博客主要记录自己用 Python 在闯关时的做题思路和实现代码&#xff0c;同时也学习学习其他大神写的代码。 Chec…

【Python CheckiO 题解】Multiply (Intro)

CheckiO 是面向初学者和高级程序员的编码游戏&#xff0c;使用 Python 和 JavaScript 解决棘手的挑战和有趣的任务&#xff0c;从而提高你的编码技能&#xff0c;本博客主要记录自己用 Python 在闯关时的做题思路和实现代码&#xff0c;同时也学习学习其他大神写的代码。 Chec…