深圳python爬虫培训南山科技园钽电容回收_记一次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条租房信息,为下一步进行数据分析做准备。

其中单条信息:

以上就是记一次python 爬虫爬取深圳租房信息的过程及遇到的问题的详细内容,更多关于python 爬虫的资料请关注脚本之家其它相关文章!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值