将您重定向的次数过多什么意思_爬虫实例(二)房天下重定向问题解决

目标网站:https://www.fang.com/SoufunFamily.htm

目标数据:房天下新房/二手房/租房信息

爬虫过程:

打开chrome,打开F12,进入目标网址。

发现进入了城市列表页,看看抓包情况,ok,找到了城市列表(这里注意,很多时候我们可以直接使用re/css/xpath提取页面信息,但是抓包总是比获取页面信息快的)。

f1c4d12ad12a46cab157d85a1b8dc43e.png
city_list json


看下请求参数,没有加密部分,第一步完成。

接下来,随便点几个城市进去,点进去之后,找新房/二手房/租房的url规律。很明显,新房url:城市缩写.http://newhouse.fang.com 二手房:城市缩写.http://esf.fang.com 租房:城市缩写.http://zu.fang.com

那我们在上面城市列表中随便找几个城市放进去试试:北京: bj.newhouse.fang.com 上海: sh.newhouse.fang.com 天津: tj.newhouse.fang.com 深圳: sz.newhouse.fang.com

发现一个问题,其他城市都能正常访问,只有北京打不开,我们到网页上看看北京的真实地址,原来北京没有bj的前缀,直接http://newhouse.fang.com。ok,url规律寻找完毕。

打开广州地区新房后,我们直达尾页,发现刚好到了30页。遇到这种整数,我们就需要考虑这三十页是不是完整的数据,是否需要添加筛选条件来获得完整的网站数据。怎么判断呢?打开北京新房尾页,上海新房尾页,深圳新房尾页,发现有些到了30多页,也就是说这三十多页数据已经是完整的了,我们可以直接爬取数据而不用筛选条件。

下一步解析获取数据,主要包括:下一页的获取、详情页的获取、详情数据的提取。

以scrapy语法为例来提取内容。我们可以看到,上一页和下一页都是class为next的a标签,在每个城市的首页,下一页的链接可以通过

response.css('.next::attr(href)').extract_first

来获取,之后的都需要extract[1]来获得,而到了尾页,我们就不必获取链接(获取也行,去重会过滤链接)。详情页链接提取为

css('.nlcd_name a::attr(href)')

ok,url提取完毕。

进入详情页后,便可以对房源的各信息进行爬虫,此页面并没有什么反爬,此处不再多说。

接下来说说二手房,我们注意到二手房数据只显示一百页,而实际数据是远远多于一百页的,因此需要筛选条件(即选择价格/所在区域/房室规模后获取数据)。

我们来简单看一下条件筛选

跳转...​sh.esf.fang.com

先看看上面的网页,这是随便点了几个条件筛选后的上海二手房链接,我们用requests获取页面后看看它的页面源码,发现数据并不在源码当中,但是从chrome的抓包上来看,数据确实是在页面写着的。仔细观察后发现,原来chrome中的链接和我们点击的这个链接并不一样,后面多了一些参数。让我们仔细看下requests获取的页面的源码,发现了这个。

8cfa3bedba8d0a46e86886ca9e36a1da.png
此页面自动跳转

我们用requests获取重定向的url,看看页面源码,毫无疑问数据都在,现在来个demo测试一下。

import 

31095d65bb43b913c5e4a61b79ddb0be.png
demo输出结果

ok,正确结果get。

然后看二手房的详情页,我们发现又是重定向,这次由于新开了一个窗口,使用chrome不能成功抓包。我们借助fiddler来看看:

437b996e37d467b40e5b8644b43e9318.png
fiddler抓包情况

请求了https://sh.esf.fang.com/chushou/3_364603044.htm后,它会先跳转到http://search.fang.com/captcha-221baca614a0043b3b/redirect?h=https://sh.esf.fang.com/chushou/3_364603044.htm?channel=2,2&psid=1_10_89这个链接,接着再跳转到https://sh.esf.fang.com/chushou/3_364603044.htm?channel=2,2&psid=1_10_89&_rfss=2c&rfss=1-221baca614a0043b3b-2c这个链接,而详情内容就在最后一个链接中,我们先把https://sh.esf.fang.com/chushou/3_364603044.htm源码用requests下载下来方便阅读,接下面看看这个页面源码:

f4e90cc7cfd43549a7ffef8215951bae.png
房屋详情页第一个script代码部分

可以看到,这是一个提交表单的js函数,没什么好说的。可是接下来往下看,我们发现,t4 +'?'+ t3不就是详情页的真实url吗?我们用re提取t3,试着获得最后的数据。

import requests 
import re 
from lxml import etree  

start_url = 'https://sh.esf.fang.com/chushou/3_364603044.htm'  
html = requests.get(start_url).text 
# re提取url参数部分,并拼接出url 
real_url = start_url + '?' + re.findall(r't3='(.*?)'', html)[0] 
print('real_url:', real_url) 
response = requests.get(real_url).text 
# xpath提取标题 
title = etree.HTML(response).xpath('//h1[@class="title floatl"]/text()')[0] 
print('title:', title) 

769730e1d3188302e1b73fa4a542d53d.png
最终数据

获取成功,二手房搞定!

接下来看看租房,数据直接在网页中就能获取,也没有什么额外的反爬手段,这里不再多说。

下一步,异步请求试试面对大量请求时房天下的处理方法。

from gevent import monkey 
monkey.patch_all()  

import gevent 
from lxml import etree 
import requests  

def get_title(url): 
    response = requests.get(url) 
    print(response.status_code) 
    title = etree.HTML(response.text).xpath('//h1[@class="title floatl"]/text()')[0] 
    print(title)  

url = 'https://sh.esf.fang.com/chushou/3_364603044.htm?_rfss=ee&rfss=1-93a54c3111a580bc5c-ee' 
gevent.joinall([gevent.spawn(get_title, url) for i in range(5000)])    

跑了之后发现,5000次任务全是正常返回,没有神马幺蛾子?对于短时间大量请求房天下居然没有任何反制措施?!没有验证码没有封ip,什么都没有?!!好吧,END!

补充:哈哈,其实之前是有的,之前的房天下是直接重定向(即301 302),根据重定向次数返回图形验证码与封ip。不知道什么时候改了,现在变成返回200,在js中改变location.href来实现重定向,个人就测试了5000次任务,没有ip和验证码问题。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值