pyspider遇到中文域名的坑

pyspider遇到中文域名的坑

经常使用使用pyspider爬取一些网站,但是在爬哈佛商业周刊的时候遇到了网页命名不规范的问题,导致出现一些问题:

1.域名包括http和https

网站在很多年的历程中,从http转到了https,导致遇到部分https的网站,爬取不成功.
如下:

for each in response.doc('a[href^="http"]').items():

该方法经过实际测试,只能获取http开头的网站,并不能获取https的网站.虽然按照正则表达式的逻辑来说应该是支持的,但事实不支持.
最终换成如下:

for each in response.doc('a[href^="htt"]').items():

完美解决.

2.域名包括中文

事实上,域名包括中文的网站很常见,之前也并没有出现过问题,主要是以下几类:
1. 域名中间包括中文
例如:http://exmaple.com/知识工具/index.html
这类网站在解析的过程中会自动转化编码以便能够传递和访问.
2. 域名最后包括中文但以/结尾
例如:http://exmaple.com/知识工具/
这类域名同第一种一样可以解决.
3. 域名最后以中文结尾
例如:http://exmaple.com/知识工具
虽然2和3的差异很小,但这决定了pyspider是否能够爬取成功,这类域名在第一次获取到后会自动转化编码,但再次访问时,再次转化了编码,导致无法访问.

最终的解决方法时,对域名进行轮询并使用正则匹配,当匹配到想要的域名中包括此类域名时,增加一次匹配并修改域名(增加/)

for each in response.doc('a[href^="htt"]').items():
            print("前"+each.attr.href)
            if re.match('https?://www.hbrchina.org/',each.attr.href):
                print("后"+each.attr.href)
                if re.match('https?://www.hbrchina.org/[\u4e00-\u9fa5\u3040-\u309f\u30a0-\u30ff]+$',each.attr.href):
                    print("2前"+each.attr.href)
                    each.attr.href = each.attr.href + "/"
                    print("2后"+each.attr.href)
                self.crawl(each.attr.href ,callback=self.detail_page)

这样在第一次配到域名后,第二次匹配到以中文结尾的域名,并将域名最后增加/.

留下评论