记一次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网络编程学习笔记(10):webpy框架
Jun 09 Python
在Django中管理Users和Permissions以及Groups的方法
Jul 23 Python
PyQt5每天必学之日历控件QCalendarWidget
Apr 19 Python
python实现排序算法解析
Sep 08 Python
Python爬虫小技巧之伪造随机的User-Agent
Sep 13 Python
python爬虫超时的处理的实例
Dec 19 Python
Python实现word2Vec model过程解析
Dec 16 Python
Django自定义全局403、404、500错误页面的示例代码
Mar 08 Python
keras .h5转移动端的.tflite文件实现方式
May 25 Python
Manjaro、pip、conda更换国内源的方法
Nov 17 Python
python安装mysql的依赖包mysql-python操作
Jan 01 Python
python openpyxl模块的使用详解
Feb 25 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结合Jquery和ajax实现瀑布流特效
2016/01/07 PHP
CentOS7编译安装php7.1的教程详解
2019/04/18 PHP
php 比较获取两个数组相同和不同元素的例子(交集和差集)
2019/10/18 PHP
线路分流自动跳转代码;希望对大家有用!
2006/12/02 Javascript
javascript与CSS复习(《精通javascript》)
2010/06/29 Javascript
使用jQuery实现dropdownlist的联动效果(sharepoint 2007)
2011/03/30 Javascript
jQuery 对Select的操作备忘记录
2011/07/04 Javascript
js Function类型
2011/12/04 Javascript
jQuery如何实现点击页面获得当前点击元素的id或其他信息
2014/01/09 Javascript
利用imgareaselect辅助后台实现图片上传裁剪
2017/03/02 Javascript
Bootstrap表单简单实现代码
2017/03/06 Javascript
详解如何使用PM2将Node.js的集群变得更加容易
2017/11/15 Javascript
详解angular如何调用HTML字符串的方法
2018/06/30 Javascript
解决vue router组件状态刷新消失的问题
2018/08/01 Javascript
原生JS封装_new函数实现new关键字的功能
2018/08/12 Javascript
[01:28]2014DOTA2国际邀请赛中国区预选赛四大豪门直升机抵达会场
2014/05/24 DOTA
在Python的Bottle框架中使用微信API的示例
2015/04/23 Python
详解python3中zipfile模块用法
2018/06/18 Python
python读取目录下所有的jpg文件,并显示第一张图片的示例
2019/06/13 Python
Python 线程池用法简单示例
2019/10/02 Python
python做接口测试的必要性
2019/11/20 Python
Python面向对象之多态原理与用法案例分析
2019/12/30 Python
PyTorch使用cpu加载模型运算方式
2020/01/13 Python
Jupyter notebook 启动闪退问题的解决
2020/04/13 Python
python输入一个水仙花数(三位数) 输出百位十位个位实例
2020/05/03 Python
python 5个顶级异步框架推荐
2020/09/09 Python
YOOX美国官方网站:全球著名的多品牌时尚网络概念店
2016/09/11 全球购物
医院后勤自我鉴定
2013/10/13 职场文书
公司领导推荐信
2013/11/12 职场文书
教学器材管理制度
2014/01/26 职场文书
大四优秀党员个人民主评议
2014/09/19 职场文书
2015年度女工工作总结
2015/10/22 职场文书
读《解忧杂货店》有感:请相信一切都是最好的安排
2019/11/07 职场文书
Go缓冲channel和非缓冲channel的区别说明
2021/04/25 Golang
详解python的内存分配机制
2021/05/10 Python
「Manga Time Kirara MAX」2022年5月号封面公开
2022/03/21 日漫