记一次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 相关文章推荐
用pywin32实现windows模拟鼠标及键盘动作
Apr 22 Python
Python中urllib2模块的8个使用细节分享
Jan 01 Python
Google开源的Python格式化工具YAPF的安装和使用教程
May 31 Python
使用Python实现一个栈判断括号是否平衡
Aug 23 Python
Python QQBot库的QQ聊天机器人
Jun 19 Python
pyenv与virtualenv安装实现python多版本多项目管理
Aug 17 Python
python django生成迁移文件的实例
Aug 31 Python
Python描述符descriptor使用原理解析
Mar 21 Python
python 基于Apscheduler实现定时任务
Dec 15 Python
tensorflow学习笔记之tfrecord文件的生成与读取
Mar 31 Python
python scrapy简单模拟登录的代码分析
Jul 21 Python
Python可视化神器pyecharts之绘制地理图表练习
Jul 07 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判断是否是微信打开还是浏览器打开的方法
2019/02/27 PHP
火狐textarea输入法的bug的触发及解决
2013/07/24 Javascript
给事件响应函数传参数的四种方式小结
2013/12/05 Javascript
JavaScript字符串对象replace方法实例(用于字符串替换或正则替换)
2014/10/16 Javascript
nodejs实现的一个简单聊天室功能分享
2014/12/06 NodeJs
jQuery实现伸展与合拢panel的方法
2015/04/30 Javascript
jquery+css3实现会动的小圆圈效果
2016/01/27 Javascript
JS显示日历和天气的方法
2016/03/01 Javascript
DIV随滚动条滚动而滚动的实现代码【推荐】
2016/04/12 Javascript
Js动态设置rem来实现移动端字体的自适应代码
2016/10/14 Javascript
easyui中combotree循环获取父节点至根节点并输出路径实现方法
2016/11/10 Javascript
canvas滤镜效果实现代码
2017/02/06 Javascript
JS日程管理插件FullCalendar中文说明文档
2017/02/06 Javascript
从零开始最小实现react服务器渲染详解
2018/01/26 Javascript
Vue.extend实现挂载到实例上的方法
2019/05/01 Javascript
Node.js从字符串生成文件流的实现方法
2019/08/18 Javascript
[02:03]永远的信仰DOTA2 中国军团历届国际邀请赛回顾
2016/06/26 DOTA
[03:13]DOTA2-DPC中国联赛1月25日Recap集锦
2021/03/11 DOTA
Python的ORM框架SQLObject入门实例
2014/04/28 Python
在Python的Flask框架下使用sqlalchemy库的简单教程
2015/04/09 Python
Python读取Json字典写入Excel表格的方法
2018/01/03 Python
详解python中的线程
2018/02/10 Python
django解决跨域请求的问题详解
2019/01/20 Python
python encrypt 实现AES加密的实例详解
2020/02/20 Python
Django {{ MEDIA_URL }}无法显示图片的解决方式
2020/04/07 Python
使用python采集Excel表中某一格数据
2020/05/14 Python
解决numpy矩阵相减出现的负值自动转正值的问题
2020/06/03 Python
Spartoo芬兰:欧洲最大的网上鞋店
2016/08/28 全球购物
会计专业自我鉴定范文
2013/12/29 职场文书
关于逃课的检讨书
2014/01/23 职场文书
党员四风问题对照检查材料思想汇报
2014/09/16 职场文书
2014年平安创建工作总结
2014/11/24 职场文书
2015年保险公司工作总结
2015/04/24 职场文书
辩论赛开场白大全(主持人+辩手)
2015/05/29 职场文书
煤矿安全学习心得体会
2016/01/18 职场文书
Python爬取某拍短视频
2021/06/11 Python