搜索引擎爬虫在爬取页面时会遇到网页被重定向的情况,所谓重定向(Redirect)就是通过各种方法(本文提到的为3种)将各种网络请求重新转到其它位置(URL)。每个网站主页是网站资源的入口,当重定向发生在网站主页时,如果不能正确处理就很有可能会错失这整个网站的内容。
1、服务器端重定向,在服务器端完成,一般来说爬虫可以自适应,是不需要特别处理的,如响应代码301(永久重定向)、302(暂时重定向)等。具体来说,可以通过requests请求得到的response对象中的url、status_code两个属性来判断。当status_code为301、302或其他代表重定向的代码时,表示原请求被重定向;当response对象的url属性与发送请求时的链接不一致时,也说明了原请求被重定向且已经自动处理。
#请求重定向 #方法一 response.setStatus(302); response.setHeader("location", "/day06/index.jsp"); #方法二 response.sendRedirect("/day06/index.jsp");
scrapy shell 获取重定向页面
scrapy shell -s ROBOTSTXT_OBEY=False --no-redirect " fetch(response.headers['Location'])
2、meta refresh,即网页中的标签声明了网页重定向的链接,这种重定向由浏览器完成,需要编写代码进行处理。例如,某一重定向如下面的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值。
3、js 重定向,通过JavaScript代码形式进行重定向。如下面JavaScript代码
<script language=javascript>window.location.href='http://www.redirectedtoxxx.com'</script>
网页包含内容这种情况是最容易解决的,一般来讲基本上是静态网页已经写死的内容,或者动态网页,采用模板渲染,浏览器获取到HTML的时候已经是包含所有的关键信息,所以直接在网页上看到的内容都可以通过特定的HTML标签得到javascript代码加载内容,这种情况是由于虽然网页显示时,内容在HTML标签里面,但是其实是由于执行js代码加到标签里面的,所以这个时候内容在js代码里面的,而js的执行是在浏览器端的操作,所以用程序去请求网页地址的时候,得到的response是网页代码和js的代码,所以自己在浏览器端能看到内容,解析时由于js未执行,肯定找到指定HTML标签下内容肯定为空,这个时候的处理办法,一般来讲主要是要找到包含内容的js代码串,然后通过正则表达式获得相应的内容,而不是解析HTML标签。
更多Python相关技术文章,请访问Python教程栏目进行学习!
以上是python爬虫爬网页时遇到网页重定向怎么办的详细内容。更多信息请关注PHP中文网其他相关文章!