记一次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的列表中利用remove()方法删除元素的教程
May 21 Python
Python编码爬坑指南(必看)
Jun 10 Python
浅谈django model的get和filter方法的区别(必看篇)
May 23 Python
关于Python如何避免循环导入问题详解
Sep 14 Python
pandas数据框,统计某列数据对应的个数方法
Apr 11 Python
Pandas 数据处理,数据清洗详解
Jul 10 Python
Django REST framework 如何实现内置访问频率控制
Jul 23 Python
如何使用Flask-Migrate拓展数据库表结构
Jul 24 Python
解决pandas展示数据输出时列名不能对齐的问题
Nov 18 Python
Python更换pip源方法过程解析
May 19 Python
Python Tricks 使用 pywinrm 远程控制 Windows 主机的方法
Jul 21 Python
一些关于python 装饰器的个人理解
Aug 31 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
?繁体转换的class
2006/10/09 PHP
删除html标签得到纯文本可处理嵌套的标签
2014/04/28 PHP
初识ThinkPHP控制器
2016/04/07 PHP
thinkphp中U方法按路由规则生成url的方法
2018/03/12 PHP
PHP实现关键字搜索后描红功能示例
2019/07/03 PHP
javascript与CSS复习(三)
2010/06/29 Javascript
浅析jQuery的链式调用之each函数
2010/12/03 Javascript
js实现右下角可关闭最小化div(可用于展示推荐内容)
2013/06/24 Javascript
js检验密码强度(低中高)附图
2014/06/05 Javascript
解决自定义$(id)的方法与jquery选择器$冲突的问题
2014/06/14 Javascript
基于jQuery实现的旋转彩圈实例
2015/06/26 Javascript
bootstrap网页框架的使用方法
2016/05/10 Javascript
简单总结JavaScript中的String字符串类型
2016/05/26 Javascript
微信小程序网络请求wx.request详解及实例
2017/05/18 Javascript
JAVA面试题 static关键字详解
2019/07/16 Javascript
JavaScript实现图片上传并预览并提交ajax
2019/09/30 Javascript
python 转换 Javascript %u 字符串为python unicode的代码
2016/09/06 Python
让python 3支持mysqldb的解决方法
2017/02/14 Python
django请求返回不同的类型图片json,xml,html的实例
2018/05/22 Python
基于python进行桶排序与基数排序的总结
2018/05/29 Python
Python脚本完成post接口测试的实例
2018/12/17 Python
python3去掉string中的标点符号方法
2019/01/22 Python
Django 拆分model和view的实现方法
2019/08/16 Python
浅谈Django QuerySet对象(模型.objects)的常用方法
2020/03/28 Python
中药专业大学生医药工作求职信
2013/10/25 职场文书
夜大毕业生自我鉴定
2013/10/31 职场文书
师范生的个人求职信范文
2014/01/04 职场文书
施工班组长岗位职责
2014/01/05 职场文书
开学寄语大全
2014/04/08 职场文书
意向书范本
2014/07/29 职场文书
2014年连锁店圣诞节活动方案
2014/12/09 职场文书
有关信念的名言语录集锦
2019/12/06 职场文书
浅谈node.js中间件有哪些类型
2021/04/29 Javascript
浅谈Python 中的复数问题
2021/05/19 Python
利用Pycharm连接服务器的全过程记录
2021/07/01 Python
Vue3如何理解ref toRef和toRefs的区别
2022/02/18 Vue.js