记一次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获得时间的实例说明
Mar 25 Python
Python中的hypot()方法使用简介
May 18 Python
剖析Python的Tornado框架中session支持的实现代码
Aug 21 Python
Python列出一个文件夹及其子目录的所有文件
Jun 30 Python
简介Python的collections模块中defaultdict类型的用法
Jul 07 Python
python爬虫框架scrapy实战之爬取京东商城进阶篇
Apr 24 Python
numpy使用fromstring创建矩阵的实例
Jun 15 Python
Python绘制并保存指定大小图像的方法
Jan 10 Python
Python3中编码与解码之Unicode与bytes的讲解
Feb 28 Python
Python 计算任意两向量之间的夹角方法
Jul 05 Python
python点击鼠标获取坐标(Graphics)
Aug 10 Python
Python 下载Bing壁纸的示例
Sep 29 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与SQL注入攻击防范小技巧
2011/09/16 PHP
Sublime里直接运行PHP配置方法
2014/11/28 PHP
php语言的7种基本的排序方法
2020/12/28 PHP
用HTML/JS/PHP方式实现页面延时跳转的简单实例
2016/07/18 PHP
php-msf源码详解
2017/12/25 PHP
使用正则替换变量
2007/05/05 Javascript
仅IE9/10同时支持script元素的onload和onreadystatechange事件分析
2011/04/27 Javascript
原生js写的放大镜效果
2012/08/22 Javascript
js 通用订单代码
2013/12/23 Javascript
JavaScript生成SQL查询表单的方法
2015/08/13 Javascript
Jquery1.9.1源码分析系列(六)延时对象应用之jQuery.ready
2015/11/24 Javascript
仅30行代码实现Javascript中的MVC
2016/02/15 Javascript
全面理解闭包机制
2016/07/11 Javascript
Vuejs第九篇之组件作用域及props数据传递实例详解
2016/09/05 Javascript
Jquery删除css属性的简单方法
2016/12/04 Javascript
Bootstrap模态框插入视频的实现代码
2017/06/25 Javascript
VUE axios上传图片到七牛的实例代码
2017/07/28 Javascript
JavaScript门道之标准库
2018/05/26 Javascript
微信小程序提交form操作示例
2018/12/30 Javascript
Js通过AES加密后PHP用Openssl解密的方法
2019/07/12 Javascript
详解JS函数防抖
2020/06/05 Javascript
React中使用Vditor自定义图片详解
2020/12/25 Javascript
[59:59]EG vs IG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python实现多线程的方式及多条命令并发执行
2016/06/07 Python
一步步教你用python的scrapy编写一个爬虫
2019/04/17 Python
详解Python并发编程之创建多线程的几种方法
2019/08/23 Python
python基于socket实现的UDP及TCP通讯功能示例
2019/11/01 Python
使用OpenCV去除面积较小的连通域
2020/07/05 Python
Docker如何部署Python项目的实现详解
2020/10/26 Python
css3模拟jq点击事件的实例代码
2017/07/06 HTML / CSS
分公司经理岗位职责
2013/11/11 职场文书
气象学专业个人求职信
2014/04/22 职场文书
2014年银行员工工作总结
2014/11/12 职场文书
环境建议书
2015/02/04 职场文书
JavaScript函数柯里化
2021/11/07 Javascript
一文搞懂PHP中的抽象类和接口
2022/05/25 PHP