记一次python 爬虫爬取深圳租房信息的过程及遇到的问题
作者:不迁徙候鸟 发布时间:2022-03-22 02:09:02
标签:python,爬虫,租房信息,深圳
为了分析深圳市所有长租、短租公寓的信息,爬取了某租房公寓网站上深圳区域所有在租公寓信息,以下记录了爬取过程以及爬取过程中遇到的问题:
爬取代码:
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报错:
上图中显示markup为None情况下报错,点击蓝色"F:\ProgramFiles\anaconda3\lib\site-packages\bs4\__init__.py"发现markup为room_html,即部分room_html出现None情况。要解决这个问题,必须让代码跳过room_html is None的情况,因此添加 if 语句解决了这个问题。
最终成功爬取某租房公寓深圳市258页共4755条租房信息,为下一步进行数据分析做准备。
其中单条信息:
来源:https://www.cnblogs.com/chang2021/p/14021768.html


猜你喜欢
- 一、要求 1 创建数据表 CREATE TABLE [dbo].[StuScore]( [stuid] [int] NOT NULL, [s
- 基本开发环境· Python 3.6· Pycharm需要导入的库目标网页分析网站是静态网站,没有加密,可以直接爬取整体思路:1、先在列表页
- 由于python内部的变量其实都是reference,而Tensorflow实现的时候也没有意义去判断输出是否是同一变量名,从而判定是否要新
- 地图现在太常见了,几乎每天在地铁上都能看到卖地图的小贩,”09年新版北京旅游交通图,1块钱一份”,买的人多半是外地来旅游的,这些人需要地图来
- 由于工作需要在一大堆日志里面提取相应的一些固定字符,如果单纯靠手工取提取,数据量大,劳心劳力,于是自然而然想到了用Python做一个对应的提
- 本文实例讲述了Python二叉搜索树与双向链表实现方法。分享给大家供大家参考,具体如下:# encoding=utf8''&
- 本文实例讲述了Python使用multiprocessing创建进程的方法。分享给大家供大家参考。具体分析如下:进程可以通过调用multip
- 导语昨晚玩起了小时候玩的游戏“吃豆豆”,但是我发现,一局游戏三条命,我根本不能吃完所有的豆豆,总是被
- WebSocketWebSocket说明WebSocket 是全双工网络通信通信协议,实现了客户端和服务器的平等对话,任何一方都可以主动发送
- 这篇文章主要介绍了基于Python执行dos命令并获取输出的结果,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- 这篇文章主要介绍了Python文本处理简单易懂方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 1.前期准备1.打开Terminal终端,执行以下命令,将项目所需要的依赖包,都记录到一个文件内备用。pip freeze >requ
- 创建项目scrapy startproject zhaoping创建爬虫cd zhaopingscrapy genspider hr zha
- 一、python运算时精度问题1.运行时精度问题在Python中(其他语言中也存在这个问题,这是计算机采用二进制导致的),有时候由于二进制和
- 编写 models.py 文件from django.db import models# Create your models here.c
- 记录训练过程中的每一步的loss变化 if verbose and step % verbose == 0: sys.stdout.writ
- 1、Export/Import的用处 Oracle Export/Import工具用于在数据库之间传递数据。 Export从数据库中导出数据
- 前言众所周知vue中使用路由的方式设置url参数,但是这种方式必须要在路径中附带参数,而且这个参数是需要在vue的路由中提前设置好的。相对来
- 本文实例讲述了Python实现统计给定列表中指定数字出现次数的方法。分享给大家供大家参考,具体如下:直接看实现:#!usr/bin/env
- 1. 页面在手机端不能上下滑动,在PC端浏览器正常滑动说明:在设置了overflow:auto;属性的前提下,H5页面在PC端浏览器里展示可