记一次python 爬虫爬取深圳租房信息的过程及遇到的问题


Posted in Python onNovember 24, 2020

为了分析深圳市所有长租、短租公寓的信息,爬取了某租房公寓网站上深圳区域所有在租公寓信息,以下记录了爬取过程以及爬取过程中遇到的问题:

爬取代码:

import requests
from requests.exceptions import RequestException
from pyquery import PyQuery as pq
from bs4 import BeautifulSoup
import pymongo
from config import *
from multiprocessing import Pool

client = pymongo.MongoClient(MONGO_URL)  # 申明连接对象
db = client[MONGO_DB]  # 申明数据库

def get_one_page_html(url):  # 获取网站每一页的html
  headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
           "Chrome/85.0.4183.121 Safari/537.36"
  }
  try:
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
      return response.text
    else:
      return None
  except RequestException:
    return None


def get_room_url(html):  # 获取当前页面上所有room_info的url
  doc = pq(html)
  room_urls = doc('.r_lbx .r_lbx_cen .r_lbx_cena a').items()
  return room_urls


def parser_room_page(room_html):
  soup = BeautifulSoup(room_html, 'lxml')
  title = soup.h1.text
  price = soup.find('div', {'class': 'room-price-sale'}).text[:-3]
  x = soup.find_all('div', {'class': 'room-list'})
  area = x[0].text[7:-11]  # 面积
  bianhao = x[1].text[4:]
  house_type = x[2].text.strip()[3:7]  # 户型
  floor = x[5].text[4:-2]  # 楼层
  location1 = x[6].find_all('a')[0].text  # 分区
  location2 = x[6].find_all('a')[1].text
  location3 = x[6].find_all('a')[2].text
  subway = x[7].text[4:]
  addition = soup.find_all('div', {'class': 'room-title'})[0].text
  yield {
    'title': title,
    'price': price,
    'area': area,
    'bianhao': bianhao,
    'house_type': house_type,
    'floor': floor,
    'location1': location1,
    'location2': location2,
    'location3': location3,
    'subway': subway,
    'addition': addition
  }


def save_to_mongo(result):
  if db[MONGO_TABLE].insert_one(result):
    print('存储到mongodb成功', result)
    return True
  return False


def main(page):
  url = 'http://www.xxxxx.com/room/sz?page=' + str(page)  # url就不粘啦,嘻嘻
  html = get_one_page_html(url)
  room_urls = get_room_url(html)
  for room_url in room_urls:
    room_url_href = room_url.attr('href')
    room_html = get_one_page_html(room_url_href)
    if room_html is None:  # 非常重要,否则room_html为None时会报错
      pass
    else:
      results = parser_room_page(room_html)
      for result in results:
        save_to_mongo(result)

if __name__ == '__main__':
  pool = Pool() # 使用多进程提高爬取效率
  pool.map(main, [i for i in range(1, 258)])

在写爬取代码过程中遇到了两个问题:

(一)在get_room_url(html)函数中,开始是想直接return每个租房信息的room_url,但是return不同于print,函数运行到return时就会结束该函数,这样就只能返回每页第一个租房room_url。解决办法是:return 包含每页所有room_url的generator生成器,在main函数中用for循环遍历,再从每个room_url中获取href,传入到get_one_page_html(room_url_href)中进行解析。

(二)没有写第76行的if语句,我默认get_one_page_html(room_url_href)返回的room_html不为空,因此出现multiprocessing.pool.RemoteTraceback报错:

记一次python 爬虫爬取深圳租房信息的过程及遇到的问题

上图中显示markup为None情况下报错,点击蓝色"F:\ProgramFiles\anaconda3\lib\site-packages\bs4\__init__.py"发现markup为room_html,即部分room_html出现None情况。要解决这个问题,必须让代码跳过room_html is None的情况,因此添加 if 语句解决了这个问题。

最终成功爬取某租房公寓深圳市258页共4755条租房信息,为下一步进行数据分析做准备。

记一次python 爬虫爬取深圳租房信息的过程及遇到的问题

其中单条信息:

记一次python 爬虫爬取深圳租房信息的过程及遇到的问题

以上就是记一次python 爬虫爬取深圳租房信息的过程及遇到的问题的详细内容,更多关于python 爬虫的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
使用Python的Twisted框架实现一个简单的服务器
Apr 16 Python
用Python操作字符串之rindex()方法的使用
May 19 Python
Django发送html邮件的方法
May 26 Python
python实现微信远程控制电脑
Feb 22 Python
Python实现的从右到左字符串替换方法示例
Jul 06 Python
python 发送和接收ActiveMQ消息的实例
Jan 30 Python
学习python的前途 python挣钱
Feb 27 Python
Python+OpenCV+图片旋转并用原底色填充新四角的例子
Dec 12 Python
Python3中的tuple函数知识点讲解
Jan 03 Python
Python Selenium库的基本使用教程
Jan 04 Python
只用Python就可以制作的简单词云
Jun 07 Python
python如何查找列表中元素的位置
May 30 Python
Pycharm安装python库的方法
Nov 24 #Python
python opencv角点检测连线功能的实现代码
Nov 24 #Python
python+appium+yaml移动端自动化测试框架实现详解
Nov 24 #Python
Python利用myqr库创建自己的二维码
Nov 24 #Python
关于pycharm 切换 python3.9 报错 ‘HTMLParser‘ object has no attribute ‘unescape‘ 的问题
Nov 24 #Python
python中使用.py配置文件的方法详解
Nov 23 #Python
python爬虫使用scrapy注意事项
Nov 23 #Python
You might like
ajax实现无刷新分页(php)
2010/07/18 PHP
一篇有意思的技术文章php介绍篇
2010/10/26 PHP
php学习笔记之 函数声明(二)
2011/06/09 PHP
Thinkphp集成抖音SDK的实现方法
2020/04/28 PHP
IE 条件注释详解总结(附实例代码)
2009/08/29 Javascript
jquery中.add()的使用分析
2013/04/26 Javascript
Jquery选中或取消radio示例
2013/09/29 Javascript
js动态创建上传表单通过iframe模拟Ajax实现无刷新
2014/02/20 Javascript
confirm的用法示例用于按钮操作时确定是否执行
2014/06/19 Javascript
JavaScript中的变量定义与储存介绍
2014/12/31 Javascript
javascript比较两个日期的先后示例代码
2014/12/31 Javascript
JQuery中上下文选择器实现方法
2015/05/18 Javascript
javascript实现方法调用与方法触发小结
2016/03/26 Javascript
JS、jQuery中select的用法详解
2016/04/21 Javascript
拥Bootstrap入怀——导航栏篇
2016/05/30 Javascript
js轮播图代码分享
2016/07/14 Javascript
基于JS快速实现导航下拉菜单动画效果附源码下载
2016/10/27 Javascript
老生常谈js-react组件生命周期
2017/05/02 Javascript
layui实现把数据表格时间戳转换为时间格式的例子
2019/09/12 Javascript
webpack DllPlugin xxx is not defined解决办法
2019/12/13 Javascript
[03:37]2014DOTA2国际邀请赛 主赛事第一日胜者组TOPPLAY
2014/07/19 DOTA
Python Socket编程入门教程
2014/07/11 Python
利用Python实现图书超期提醒
2016/08/02 Python
python遍历文件夹,指定遍历深度与忽略目录的方法
2018/07/11 Python
python使用numpy读取、保存txt数据的实例
2018/10/14 Python
Python中断多重循环的思路总结
2019/10/04 Python
PyCharm专业最新版2019.1安装步骤(含激活码)
2019/10/09 Python
命令行运行Python脚本时传入参数的三种方式详解
2019/10/11 Python
python求最大公约数和最小公倍数的简单方法
2020/02/13 Python
使用pygame编写Flappy bird小游戏
2020/03/14 Python
Python关于拓扑排序知识点讲解
2021/01/04 Python
python中添加模块导入路径的方法
2021/02/03 Python
大学生实习思想汇报
2014/01/12 职场文书
党的群众路线教育实践活动个人批评与自我批评
2014/10/16 职场文书
通知格式
2015/04/27 职场文书
基于Python实现股票收益率分析
2022/04/02 Python