python爬虫解决网页重定向问题

在使用Python2.7+requests进行爬虫开发时,遇到网页重定向问题,包括服务器端重定向(301、302状态码)、meta refresh重定向和JavaScript重定向。对于服务器端重定向,requests库通常能自动处理;meta refresh需要在代码中解析HTML,寻找<meta>标签以执行重定向;js重定向则需解析并执行JavaScript,较为复杂。正确处理这些重定向能确保爬虫获取到目标网页的准确内容。

笔者使用python2.7+requests编写爬虫,以下问题针对此情况讨论。

笔者编写的搜索引擎爬虫在爬取页面时遇到了网页被重定向的情况,所谓重定向(Redirect)就是通过各种方法(本文提到的为3种)将各种网络请求重新转到其它位置(URL)。每个网站主页是网站资源的入口,当重定向发生在网站主页时,如果不能正确处理就很有可能会错失这整个网站的内容。

笔者编写的爬虫在爬取网页时遇到了三种重定向的情况。


1.服务器端重定向,在服务器端完成,一般来说爬虫可以自适应,是不需要特别处理的,如响应代码301(永久重定向)、302(暂时重定向)等。具体来说,可以通过requests请求得到的response对象中的url、status_code两个属性来判断。当status_code为301、302或其他代表重定向的代码时,表示原请求被重定向;当response对象的url属性与发送请求时的链接不一致时,也说明了原请求被重定向且已经自动处理。


2.meta refresh,即网页中的<meta>标签声明了网页重定向的链接,这种重定向由浏览器完成,需要编写代码进行处理。例如,某一重定向如下面的html代码第三行中的注释所示,浏览器能够自动跳转,但爬虫只能得到跳转前的页面,不能自动跳转。

<html>
<head>
<meta http-equiv="refresh" content="0.1;url=http://www.redirectedtoxxx.com/"><!--本网页会在0.1秒内refresh为url所指的网页-->
</head>
</html>
解决办法是通过得到跳转前的页面源码,从中提取出重定向url信息(上述代码第三行中的url属性值)。一个具体的操作:①使用xpath('//meta[@http-equiv="refresh" and @content]/@content')提取出content的值 ②使用正则表达式提取出重定向的url值。

### 重定向类型及处理方式 网页重定向是指浏览器或服务器将请求从一个URL自动转到另一个URL的过程。在爬虫开发中,常见的重定向类型主要包括以下三种: 1. **服务器端重定向** 服务器端重定向通常通过HTTP状态码(如301、302)来实现,该类重定向由服务器发起,客户端(如浏览器)根据响应码自动处理跳转。对于爬虫而言,大多数情况下可以通过请求库(如`requests`)自动处理这类重定向。例如,`requests`库在接收到301或302响应码时会自动跟随重定向,并将最终的URL记录在`response.url`属性中。因此,可以通过比较请求的初始URL与`response.url`是否一致来判断是否发生了重定向。 ```python import requests response = requests.get("http://example.com") if response.status_code in [301, 302]: print("重定向后的URL:", response.url) ``` 2. **Meta Refresh重定向** 这种类型的重定向是通过HTML页面中的`<meta>`标签实现的,例如`<meta http-equiv="refresh" content="0;url=http://new-url.com">`。由于这种重定向是由浏览器在客户端处理的,普通的HTTP请求库(如`requests`)无法自动跟随跳转,因此需要手动解析页面内容并提取重定向URL。可以使用`BeautifulSoup`或`lxml`结合XPath或正则表达式来提取目标URL。 ```python from lxml import html tree = html.fromstring(response.text) meta_refresh = tree.xpath('//meta[@http-equiv="refresh"]/@content') if meta_refresh: redirect_url = meta_refresh[0].split("url=")[-1] print("Meta Refresh重定向URL:", redirect_url) ``` 3. **JavaScript重定向** JavaScript重定向通常通过`window.location`或`document.location`等方法实现,例如`window.location.href = "http://new-url.com"`。由于JavaScript的执行环境复杂且多变,普通的HTTP请求库无法处理此类重定向解决这类问题的常见方法是使用无头浏览器(如Selenium配合PhantomJS或Chrome Headless模式)来模拟浏览器行为,从而正确加载页面并完成重定向。 ```python from selenium import webdriver options = webdriver.ChromeOptions() options.add_argument('--headless') # 无头模式 driver = webdriver.Chrome(options=options) driver.get("http://example.com") print("JavaScript重定向后的URL:", driver.current_url) ``` ### 处理重定向的综合策略 在实际的爬虫开发中,建议采用以下策略来全面处理重定向问题: - **自动处理服务器端重定向**:使用`requests`库时,可以通过设置`allow_redirects=True`参数来自动处理301、302等服务器端重定向。 - **解析Meta Refresh标签**:在接收到HTML响应后,检查是否存在`<meta>`标签中的`refresh`指令,并从中提取目标URL。 - **使用无头浏览器处理JavaScript重定向**:对于依赖JavaScript跳转的页面,使用Selenium等工具模拟浏览器行为,确保能够正确加载最终页面。 ### 重定向处理的注意事项 - **重定向链**:在某些情况下,重定向可能不是单一的,而是形成一个链式结构(例如A → B → C)。因此,建议在处理重定向时记录完整的跳转路径,以便进行调试和分析。 - **超时与循环重定向**:为了避免无限循环或长时间等待,应为重定向设置合理的超时限制,并在检测到重复的URL时终止请求。 - **用户代理与请求头**:某些网站可能会根据请求头中的`User-Agent`字段来决定是否返回重定向响应。因此,在发送请求时,建议模拟浏览器的请求头,以提高爬虫的成功率。 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值