记一次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 中文字符串的处理实现代码
Oct 25 Python
Python实现的检测网站挂马程序
Nov 30 Python
浅谈Python中copy()方法的使用
May 21 Python
在Python的Django框架中编写错误提示页面
Jul 22 Python
python函数中return后的语句一定不会执行吗?
Jul 06 Python
Python3实现定时任务的四种方式
Jun 03 Python
使用python搭建服务器并实现Android端与之通信的方法
Jun 28 Python
python匿名函数的使用方法解析
Oct 10 Python
树莓派安装OpenCV3完整过程的实现
Oct 10 Python
flask 实现token机制的示例代码
Nov 07 Python
python函数调用,循环,列表复制实例
May 03 Python
python 破解加密zip文件的密码
Apr 22 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
php数组函数序列之array_sum() - 计算数组元素值之和
2011/10/29 PHP
PHP 第一节 php简介
2012/04/28 PHP
关于使用key/value数据库redis和TTSERVER的心得体会
2013/06/28 PHP
解析php如何将日志写进syslog
2013/06/28 PHP
腾讯QQ微博API接口获取微博内容
2013/10/30 PHP
PHP实现的登录,注册及密码修改功能分析
2016/11/25 PHP
客户端脚本中常常出现的一些问题和调试技巧
2007/01/09 Javascript
firefox下frameset取不到值的解决方法
2010/09/06 Javascript
jquery获取当前点击对象的value方法
2014/02/28 Javascript
使用JavaScript获取电池状态的方法
2014/05/03 Javascript
详解javascript函数的参数
2015/11/10 Javascript
zTree插件下拉树使用入门教程
2016/04/11 Javascript
jquery插件方式实现table查询功能的简单实例
2016/06/06 Javascript
bootstrap switch开关组件使用方法详解
2017/08/22 Javascript
详解用Node.js写一个简单的命令行工具
2018/03/01 Javascript
vue-router中的hash和history两种模式的区别
2018/07/17 Javascript
Vue中 v-if/v-show/插值表达式导致闪现的原因及解决办法
2018/10/12 Javascript
微信小程序时间轴实现方法示例
2019/01/14 Javascript
vue+springboot+element+vue-resource实现文件上传教程
2020/10/21 Javascript
[02:51]2014DOTA2国际邀请赛 IG战队官方纪录片
2014/07/21 DOTA
Python的内存泄漏及gc模块的使用分析
2014/07/16 Python
在Windows服务器下用Apache和mod_wsgi配置Python应用的教程
2015/05/06 Python
pip install python 快速安装模块的教程图解
2019/10/08 Python
python使用pip安装SciPy、SymPy、matplotlib教程
2019/11/20 Python
详解tensorflow2.x版本无法调用gpu的一种解决方法
2020/05/25 Python
全世界最美丽的四星和五星级酒店预订:Prestigia.com
2017/11/15 全球购物
温泉秘密:Onsen Secret
2020/07/06 全球购物
五星级酒店餐饮部总监的标准岗位职责
2014/02/17 职场文书
司仪主持词两篇
2014/03/22 职场文书
艺术节主持词
2014/04/02 职场文书
企业挂职心得体会
2014/09/10 职场文书
学校师德师风自我剖析材料
2014/09/29 职场文书
2015高三毕业寄语赠言
2015/02/27 职场文书
2015年小学体育教师工作总结
2015/10/23 职场文书
2016年12月份红领巾广播稿
2015/12/21 职场文书
基于Python实现流星雨效果的绘制
2022/03/18 Python