记一次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中运行并行任务技巧
Feb 26 Python
Python中if __name__ == '__main__'作用解析
Jun 29 Python
学习python之编写简单简单连接数据库并执行查询操作
Feb 27 Python
tensorflow实现对图片的读取的示例代码
Feb 12 Python
python sys,os,time模块的使用(包括时间格式的各种转换)
Apr 27 Python
python算法题 链表反转详解
Jul 02 Python
Django打印出在数据库中执行的语句问题
Jul 25 Python
python利用openpyxl拆分多个工作表的工作簿的方法
Sep 27 Python
Django admin禁用编辑链接和添加删除操作详解
Nov 15 Python
Python 内置函数globals()和locals()对比详解
Dec 23 Python
Python smtp邮件发送模块用法教程
Jun 15 Python
Keras多线程机制与flask多线程冲突的解决方案
May 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&java(一)
2006/10/09 PHP
php 过滤危险html代码
2009/06/29 PHP
PHP中数组合并的两种方法及区别介绍
2012/09/14 PHP
php实现简易计算器
2020/08/28 PHP
JS之小练习代码
2008/10/12 Javascript
Jquery ajax不能解析json对象,报Invalid JSON错误的原因和解决方法
2010/03/27 Javascript
国外大牛IE版本检测!现在IE都到9了,IE检测代码
2012/01/04 Javascript
window.open以post方式将内容提交到新窗口
2012/12/26 Javascript
document.createElement()用法
2013/03/13 Javascript
js保留小数点后几位的写法
2014/01/03 Javascript
JavaScript比较两个对象是否相等的方法
2015/02/06 Javascript
老生常谈JavaScript数组的用法
2016/06/10 Javascript
jQuery制作圣诞主题页面 更像是爱情影集
2016/08/10 Javascript
微信小程序  生命周期详解
2016/10/27 Javascript
canvas雪花效果核心代码分享
2017/02/19 Javascript
Angular2.0/4.0 使用Echarts图表的示例代码
2017/12/07 Javascript
vue 巧用过渡效果(小结)
2018/09/22 Javascript
Element Alert警告的具体使用方法
2020/07/27 Javascript
Python简单读写Xls格式文档的方法示例
2018/08/17 Python
python使用matplotlib库生成随机漫步图
2018/08/27 Python
对python numpy.array插入一行或一列的方法详解
2019/01/29 Python
pyqt5实现按钮添加背景图片以及背景图片的切换方法
2019/06/13 Python
python将字典列表导出为Excel文件的方法
2019/09/02 Python
Python3.8安装Pygame教程步骤详解
2020/08/14 Python
细说CSS3中box属性中的overflow-x属性和overflow-y属性值的效果
2014/07/21 HTML / CSS
html5小程序飞入购物车(抛物线绘制运动轨迹点)
2020/10/19 HTML / CSS
乌克兰珠宝大卖场:Zlato.ua
2020/09/27 全球购物
类和结构的区别
2012/08/15 面试题
毕业生文员求职信
2013/11/03 职场文书
人力资源管理专业学生自我评价
2013/11/20 职场文书
演讲稿怎么写
2014/01/07 职场文书
校园活动策划书范文
2014/01/10 职场文书
销售经理工作检讨书
2015/02/19 职场文书
详解JavaScript中Arguments对象用途
2021/08/30 Javascript
Python可视化学习之matplotlib内置单颜色
2022/02/24 Python
Python万能模板案例之matplotlib绘制甘特图
2022/04/13 Python