记一次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查询Mysql时返回字典结构的代码
Jun 18 Python
解决python3在anaconda下安装caffe失败的问题
Jun 15 Python
python3+PyQt5自定义视图详解
Apr 24 Python
python基础学习之如何对元组各个元素进行命名详解
Jul 12 Python
Django 登陆验证码和中间件的实现
Aug 17 Python
Python 如何优雅的将数字转化为时间格式的方法
Sep 26 Python
pandas-resample按时间聚合实例
Dec 27 Python
Python 在局部变量域中执行代码
Aug 07 Python
Pycharm自带Git实现版本管理的方法步骤
Sep 18 Python
python中Pexpect的工作流程实例讲解
Mar 02 Python
Python实现GIF动图以及视频卡通化详解
Dec 06 Python
Python 读取千万级数据自动写入 MySQL 数据库
Jun 28 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下实现折线图效果的代码
2007/04/28 PHP
谷歌音乐搜索栏的提示功能php修正代码
2011/05/09 PHP
phpmyadmin出现Cannot start session without errors问题解决方法
2014/08/14 PHP
php获取英文姓名首字母的方法
2015/07/13 PHP
PHP中Notice错误常见解决方法
2017/04/28 PHP
php经典趣味算法实例代码
2020/01/21 PHP
php解析非标准json、非规范json的方式实例
2020/12/10 PHP
jQuery.extend 函数的详细用法
2012/06/27 Javascript
JavaScript中变量声明有var和没var的区别示例介绍
2014/09/15 Javascript
浅谈JavaScript数据类型及转换
2015/02/28 Javascript
基于BootStrap Metronic开发框架经验小结【三】下拉列表Select2插件的使用
2016/05/12 Javascript
jquery实现tab选项卡切换效果(悬停、下方横线动画位移)
2017/05/05 jQuery
详解node child_process模块学习笔记
2018/01/24 Javascript
解决vue-router进行build无法正常显示路由页面的问题
2018/03/06 Javascript
Vue递归实现树形菜单方法实例
2018/11/06 Javascript
vue在index.html中引入静态文件不生效问题及解决方法
2019/04/29 Javascript
一起写一个即插即用的Vue Loading插件实现
2019/10/31 Javascript
Vue+elementUI实现多图片上传与回显功能(含回显后继续上传或删除)
2020/03/23 Javascript
[48:45]Ti4 循环赛第二日 NEWBEE vs EG
2014/07/11 DOTA
[58:46]OG vs NAVI 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
探究Python的Tornado框架对子域名和泛域名的支持
2015/05/02 Python
Python爬虫抓取手机APP的传输数据
2016/01/22 Python
解决python3运行selenium下HTMLTestRunner报错的问题
2018/12/27 Python
详解Python3除法之真除法、截断除法和下取整对比
2019/05/23 Python
在django-xadmin中APScheduler的启动初始化实例
2019/11/15 Python
Python阶乘求和的代码详解
2020/02/14 Python
python 实现rolling和apply函数的向下取值操作
2020/06/08 Python
Python3爬虫RedisDump的安装步骤
2021/02/20 Python
斯德哥尔摩通票:Stockholm Pass
2018/01/09 全球购物
英国时尚女装购物网站:Missguided
2018/08/23 全球购物
土木工程专业自荐信
2013/10/04 职场文书
相亲大会策划方案
2014/06/05 职场文书
大国崛起观后感
2015/06/02 职场文书
2015大学生暑期实习报告
2015/07/13 职场文书
幼儿园毕业典礼家长致辞
2015/07/29 职场文书
一文弄懂MySQL索引创建原则
2022/02/28 MySQL