点击上方“程序员大咖”,选择“置顶公众号”

关键时刻,第一时间送达!

最近一直在关注Python写爬虫相关的知识,尝试了采用requests + Beautiful Soup来爬取房天下(原搜房网)的推荐新楼盘。

不用不知道,一用发现有惊喜也有惊吓,本文就一同记录下惊喜和踩的一些乱码的坑。

首先,觉得Beautiful Soup解析网页更加符合人类的常规思维,比使用正则表达式(Python中的re库)更容易理解。 同时关于requests遇到了中文字符和特殊字符解码的问题。本文都将给于深入的解说。

软件环境

Python: 3.6.0

PyCharm: Community 2017.2

库1 : requests

库2 : beautiful soup

Requests知识概要

Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求。

完全支持Python3哦

1、安装requests

可以采用pip安装requests,具体代码是:

pip install requests

2、简单例子

下面例子中是几个常用的属性,text可以特到html的源代码,encoding默认为ISO-8859-1,此编码针对英文没有问题,如果我们的网页中带有中文,将会引起乱码的问题。后面有解决方案。

import requestsresponse = requests.get("http://sh.fang.com/") #获取一个Http请求print(response.encoding)          #当前编码,默认为 ISO-8859-1print(response.apparent_encoding) #当前网页的内容的实际编码print(response.content)  #content返回的是bytes型的原始数据print(response.text)     #text返回的是处理过的Unicode型的数据

Beautiful Soup简要知识

1、Beautiful Soup 

Beautiful Soup是一个非常流行的 Python 模块。 该模块可以解析网页, 并提供定位 内 容的便捷接口 。 如果你还没有安装该模块,可以使用下面的命令

安装其最新版本:

pip install beautifulsoup4

使用 Beautiful Soup 的第一步是将下载的 HTML 内容解析为 Soup 文档 。

2、如何引用bs

from bs4 import BeautifulSoup

3、一个简单例子

from bs4 import BeautifulSoup

html = "<ul class='country'><li>中国</li><li>美国</li></ul>"# 解析html然后得到一个soup文档soup = BeautifulSoup(html,'html.parser')html = soup.prettify()ul = soup.find('ul',attrs={'class':'country'})

#下面代码只返回一个匹配的元素print(ul.find('li'))     # returns the first match element

#下面代码返回又有匹配的元素for countryname in ul.find_all('li'):    print(countryname)

实战爬取房天下推荐新楼盘

1、在Chrome中打开sh.fang.com地址,按F12观察新盘推荐tab的网页源代码结构

主要结构是: 顶层为一个名为ti011的div,下面有四个class为tenrtd的div用于四个楼盘的现实。每个楼盘下面有一个class = “text1”的div存储了楼盘名称,另一个class = “text2”的存储了楼盘的价格。

2. 第一版代码完成如下,但是发现有一个中文乱码的问题

from bs4 import BeautifulSoupimport requestsrep = requests.get("http://sh.fang.com/")html = rep.textsoup = BeautifulSoup(html, 'html.parser')#获取顶层 新盘推荐 的整个divdiv = soup.find('div',attrs={'id':'ti011'})#获取四个楼盘的div,更具他们的class = "tenrtd"for house in div.find_all('div', attrs={'class': 'tenrtd'}):

    # 根据class="text1"获取存储楼盘标题的div    titleDiv = house.find('div', attrs={'class': 'text1'})    title = titleDiv.find('a').text    # 根据class="text2"获取存储楼盘价格的div    priceDiv = house.find('div', attrs={'class': 'text2'})    price = priceDiv.find('b').text    print(title, " ", price)

输入的结果尽然是, Why?

 Öнðº£ÌÄÍå     48000Ôª/©O  »ªÒêÒÝÆ·À½Íå     43057Ôª/©O  Öйú¹é¹È´´¿ÍSOHO     ¼Û¸ñ´ý¶¨  ÐÂÎ÷ÌÁ¿×ȸ³Ç     14000Ôª/©O

3. 研究中文乱码问题

中文乱码也算是requests常见的一个问题,为什么会这样的呢,看他自己的文档描述

Encodings

When you receive a response, Requests makes a guess at the encoding to use for decoding the response

when you access the Response.text attribute. Requests will first check for an encoding in the HTTP

header, and if none is present, will use chardet to attempt to guess the encoding.

The only time Requests will not do this is if no explicit charset is present in the HTTP headersand

the Content-Type header contains text. In this situation, RFC 2616 specifies that the default charset

must be ISO-8859-1. Requests follows the specification in this case. If you require a different encoding,

you can manually set the Response.encoding property, or use the rawResponse.content.

其实重要的也就是如果没有在requests里面制定encoding的话,那么其实默认采用的就用ISO-8859-1这个编码去解码response.content里面的字节数据。ISO-8859-1针对英文是没有问题的,但是针对中文就不行了。

解决思路就是换encoding,有一个方案可以看到网页的实际encoding,如下代码:它的输出是 GB2312

print(rep.apparent_encoding)

4.换编码解决中文字符

经过上面的研究,我们修订代码对response设定encoding = "GB2312"

rep.encoding = "GB2312"

运行后结果如下:

中金海棠湾     48000元/�O
华谊逸品澜湾     43057元/�O
中国归谷创客SOHO     价格待定
新西塘孔雀城     14000元/�O

发现代码显示的结果中㎡又乱码了,不应该啊,这又是为什么呢? 下面接着研究。。。

5. 研究解决特殊字符乱码问题

引起乱码的原因估计就是在字符集中找不到特定的字符,比如这个㎡。是不是GB2312这个字符集不够全面呢?带着这个疑问去查阅相关的资料关于中文的几个编码:

  • GB2312

GB 2312 或 GB 2312-80 是中国国家标准简体中文字符集,全称《信息交换用汉字编码字符集·基本集》,又称 GB 0,由中国国家标准总局发布,1981 年 5 月 1 日实施。GB 2312 编码通行于中国大陆;新加坡等地也采用此编码。中国大陆几乎所有的中文系统和国际化的软件都支持 GB 2312。GB 2312 标准共收录 6763 个汉字,其中一级汉字 3755 个,二级汉字 3008 个;同时收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的 682 个字符。GB 2312 的出现,基本满足了汉字的计算机处理需要,它所收录的汉字已经覆盖中国大陆99.75% 的使用频率。对于人名、古汉语等方面出现的罕用字,GB 2312 不能处理,这导致了后来 GBK 及 GB 18030 汉字字符集的出现。

  • GBK

GBK 即汉字内码扩展规范,K 为汉语拼音 Kuo Zhan(扩展)中“扩”字的声母。英文全称 Chinese Internal Code Specification。GBK 共收入 21886 个汉字和图形符号,包括:GB 2312 中的全部汉字、非汉字符号。BIG5 中的全部汉字。与 ISO 10646 相应的国家标准 GB 13000 中的其它 CJK 汉字,以上合计 20902 个汉字。其它汉字、部首、符号,共计 984 个。GBK 向下与 GB 2312 完全兼容,向上支持 ISO 10646 国际标准,在前者向后者过渡过程中起到的承上启下的作用。GBK 采用双字节表示,总体编码范围为 8140-FEFE 之间,首字节在 81-FE 之间,尾字节在 40-FE 之间,剔除 XX7F 一条线

  • GB18030

GB 18030,全称:国家标准 GB 18030-2005《信息技术中文编码字符集》,是×××现时最新的内码字集,是 GB 18030-2000《信息技术信息交换用汉字编码字符集基本集的扩充》的修订版。GB 18030 与 GB 2312-1980 和 GBK 兼容,共收录汉字70244个。与 UTF-8 相同,采用多字节编码,每个字可以由 1 个、2 个或 4 个字节组成。编码空间庞大,最多可定义 161 万个字符。支持中国国内少数民族的文字,不需要动用造字区。汉字收录范围包含繁体汉字以及日韩汉字

从上文中可以简要的得出GB 2312 过时标准、GBK 微软标准、GB 18030 国家标准,兼容性方面:GB 18030 > GBK > GB2312

所以我们决定采用 GB18030来解码我们的数据,代码改动如下:

rep.encoding = "gb18030"

附上完整的代码

from bs4 import BeautifulSoupimport requests

rep = requests.get("http://sh.fang.com/")rep.encoding = "gb18030"html = rep.textsoup = BeautifulSoup(html, 'html.parser')

#获取顶层 新盘推荐 的整个divdiv = soup.find('div',attrs={'id':'ti011'})

#获取四个楼盘的div,更具他们的class = "tenrtd"for house in div.find_all('div', attrs={'class': 'tenrtd'}):    # 根据class="text1"获取存储楼盘标题的div    titleDiv = house.find('div', attrs={'class': 'text1'})    title = titleDiv.find('a').text    # 根据class="text2"获取存储楼盘价格的div    priceDiv = house.find('div', attrs={'class': 'text2'})    price = priceDiv.find('b').text    print(title, " ", price)

输出结果:

中金海棠湾     48000元/㎡
华谊逸品澜湾     43057元/㎡
中国归谷创客SOHO     价格待定
新西塘孔雀城     14000元/㎡

总结

问题解决了,关键知识点总结:

  • 可以采用requests库来获取网页html;

  • 采用Beautiful Soup基于html构建一个soup文档,然后用find 或者 find_all方法查询自己需要的html节点;

  • 根据目标网页的内容来更改response.encoding从而解决乱码问题。

  • 来自:唐元志

  • http://blog.51cto.com/yuanzhitang/2058281

  • 程序员大咖整理发布,转载请联系作者获得授权

【点击成为Python大神】

详解Python爬取房天下的推荐新楼盘相关推荐

  1. python爬取去哪里_详解Python 爬取13个旅游城市,告诉你五一大家最爱去哪玩?

    今年五一放了四天假,很多人不再只是选择周边游,因为时间充裕,选择了稍微远一点的景区,甚至出国游.各个景点成了人山人海,拥挤的人群,甚至去卫生间都要排队半天,那一刻我突然有点理解灭霸的行为了. 今天通过 ...

  2. Python爬取房天下租房信息实战

    目录 一.单线程爬虫 二.优化为多线程爬虫 三.使用asyncio进一步优化 四.存入Mysql数据库 (一)建表 (二)将数据存入数据库中 思路:先单线程爬虫,测试可以成功爬取之后再优化为多线程,最 ...

  3. 爬虫实战—爬取房天下全国所有的楼盘并入库(附源码)

    1.创建项目 使用命令创建scrapy项目:scrapy startproject fang进入到spiders文件中: cd fang/fang/spiders创建爬虫文件:scrapy gensp ...

  4. 详解Python 采用 requests + Beautiful Soup 爬取房天下新楼盘推荐

    最近一直在关注Python写爬虫相关的知识,尝试了采用requests + Beautiful Soup来爬取房天下(原搜房网)的推荐新楼盘. 不用不知道,一用发现有惊喜也有惊吓,本文就一同记录下惊喜 ...

  5. python爬虫——爬取房天下

    python爬虫--爬取房天下 话不多说,直接上代码! import requests as req import time import pandas as pd from bs4 import B ...

  6. Python 使用selenium爬取房天下网站,房源动态信息

    什么是Selenium selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium Remote Control)和测试的并行处理 ...

  7. Python爬虫案例3:爬取房天下房价等各种信息

    爬取房天下网站,爬取的内容: 区域.小区名.总价.房型.面积.单价.朝向.楼层位置.装修情况.建筑时间.是否有电梯.产权类型.住宅类型.发布日期 信息保存:保存在csv中 数据结果: 1.先建立爬虫项 ...

  8. 爬虫实战-爬取房天下网站全国所有城市的新房和二手房信息(最新)

    看到https://www.cnblogs.com/derek1184405959/p/9446544.html项目:爬取房天下网站全国所有城市的新房和二手房信息和其他博客的代码,因为网站的更新或者其 ...

  9. 爬取房天下数据观察广州房租情况

    新的一年,有房东提出了涨租,也有跳槽的小伙伴,考虑租房换房,趁着这个时点,再来说说租房的事,找到合适的房子是头等大事,接下来让我们通过爬取房天下数据来观察广州房租情况.(结果图在最后面,想看结果图的小 ...

最新文章

  1. linux epoll用法
  2. yii2model 基本模型类
  3. 结对开发----找出“水王
  4. Python定义点击右上角关闭按钮事件
  5. 如何在51cto博客中添加QQ链接
  6. 正确地kill java历程
  7. Linux(CentOS)挂载NTFS格式的U盘、移动硬盘
  8. QuickSort 优化后的快速排序算法
  9. hibernate中主键的生成策略
  10. 如何去提高代码代码质量
  11. powerpoint(ppt) 的制作
  12. 手机控制linux电脑软件,手机控制电脑软件哪个好用?
  13. 2013 Esri全球用户大会之元数据支持
  14. 【工具】中国菜刀 官方原版下载 官网下载链接
  15. fdisk 分区/格式化/挂载
  16. 路由器刷机群辉NAS+KODI (一)----NAS安装
  17. 代码传奇 张一鸣的成长之路
  18. 描述 由于被认为是客户端对错误(例如:畸形的请求语法、无效的请求信息帧或者虚拟的请求路由),服务器无法或不会处理当前请求。
  19. 每日一“酷”之Cookie
  20. latex 表格中如何精细控制行高,行距,行与行之间的距离

热门文章

  1. Git/GitHub (一):初识/及简单的实现本地与github的关联操作
  2. 软件Beta测试悄悄变味
  3. 计算机桌面怎么情理,电脑关机时自动清理垃圾设置技巧
  4. 初学游戏建模怎么入门
  5. WOW6432Node真身
  6. 各个银行信用卡对比,办哪个银行的信用卡比较好?
  7. java毕业生设计校园绿化管理系统计算机源码+系统+mysql+调试部署+lw
  8. [转]高效能程序员的七个习惯
  9. Lisk节点安装指南(主网节点和测试节点)
  10. Ubuntu18.04 pycharm汉化