记一次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程序实例(通讯录)
Nov 29 Python
在Python下利用OpenCV来旋转图像的教程
Apr 16 Python
Python简单实现自动删除目录下空文件夹的方法
Aug 29 Python
解决Python安装后pip不能用的问题
Jun 12 Python
tensorflow使用神经网络实现mnist分类
Sep 08 Python
Django文件上传与下载(FileFlid)
Oct 06 Python
关于ResNeXt网络的pytorch实现
Jan 14 Python
Docker部署Python爬虫项目的方法步骤
Jan 19 Python
python 使用cx-freeze打包程序的实现
Mar 14 Python
Python命令行参数定义及需要注意的地方
Nov 30 Python
python解包用法详解
Feb 17 Python
python实现简单的井字棋
May 26 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 版获取重定向后的地址(代码)
2013/06/26 PHP
php的ZipArchive类用法实例
2014/10/20 PHP
百度工程师讲PHP函数的实现原理及性能分析(三)
2015/05/13 PHP
Yii清理缓存的方法
2016/01/06 PHP
Laravel中如何增加自定义全局函数详解
2017/05/09 PHP
php pdo连接数据库操作示例
2019/11/18 PHP
Javascript解决常见浏览器兼容问题的12种方法
2010/01/04 Javascript
jquery实现微博文字输入框 输入时显示输入字数 效果实现
2013/07/12 Javascript
写出高效jquery代码的19条指南
2014/03/19 Javascript
使用forever管理nodejs应用教程
2014/06/03 NodeJs
JavaScript模块化开发之SeaJS
2015/12/13 Javascript
jQuery通过写入cookie实现更换网页背景的方法
2016/04/15 Javascript
jQuery简单实现仿京东分类导航层效果
2016/06/07 Javascript
开源免费天气预报接口API及全国所有地区代码(国家气象局提供)
2016/12/26 Javascript
JS获取子节点、父节点和兄弟节点的方法实例总结
2018/07/06 Javascript
vue的过滤器filter实例详解
2018/09/17 Javascript
Vue 使用formData方式向后台发送数据的实现
2019/04/14 Javascript
js遍历详解(forEach, map, for, for...in, for...of)
2019/08/28 Javascript
Python只用40行代码编写的计算器实例
2017/05/10 Python
Python3下错误AttributeError: ‘dict’ object has no attribute’iteritems‘的分析与解决
2017/07/06 Python
基于Python的文件类型和字符串详解
2017/12/21 Python
Python内置模块logging用法实例分析
2018/02/12 Python
python求最大值最小值方法总结
2019/06/25 Python
Python封装成可带参数的EXE安装包实例
2019/08/24 Python
Python requests模块cookie实例解析
2020/04/14 Python
翻转数列python实现,求前n项和,并能输出整个数列的案例
2020/05/03 Python
为什么相对PHP黑python的更少
2020/06/21 Python
CSS3——齿轮转动关键代码
2013/05/02 HTML / CSS
一款利用纯css3实现的超炫3D表单的实例教程
2014/12/01 HTML / CSS
浅谈HTML5新增及移除的元素
2016/06/27 HTML / CSS
Anthropologie英国:美国家喻户晓的休闲服装和家居产品品牌
2018/12/05 全球购物
学生党员思想汇报
2013/12/28 职场文书
2015年度团总支工作总结
2015/04/23 职场文书
小学五年级(说明文3篇)
2019/08/13 职场文书
500字作文之难忘的同学
2019/12/20 职场文书
Python几种酷炫的进度条的方式
2022/04/11 Python