批量抓取网站标题

需求

之前在文章关于PAC自动代理和ios翻墙中提供过一个翻墙域名列表,这个列表是从网上搜集的,共有三千多个,其中的有效性并未分析,于是计划分别用两台服务器,一台在国内一台在国外分别爬取这些域名的网站标题。一是确定哪些网站不需要翻墙就可以访问,二是大致了解一下这些需翻墙网站的内容和性质。

域名列表可见这里

背景

这是第一个练手的python小程序。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#!/usr/bin/python
# -*- coding: utf-8 -*-
import urllib2
from BeautifulSoup import BeautifulSoup
ONLYSHOWSUCCESS=False
def failure(total,DOMAIN,ErrorFile,errstr):
if not ONLYSHOWSUCCESS :
print '%-4i\t%-20s\t%s' %(total,DOMAIN,errstr)
ErrorFile.writelines('%-4i\t%-20s\t%s\n' %(total,DOMAIN,errstr))
def successprocess(total,DOMAIN,TITLE,SuccessFile,errstr):
print '%-4i\t%-20s\t%s' %(total,DOMAIN,TITLE)
try :
SuccessFile.writelines('%-4i\t%-20s\t%s\n' %(total,DOMAIN,TITLE.encode('utf-8')))
except AttributeError:
print errstr
SuccessFile.writelines('%-4i\t%-20s\t%s\n' %(total,DOMAIN,errstr))
def main():
InputFile=open('domain','rU')
SuccessFile=open('success.log','w+')
ErrorFile=open('error.log','w+')
total=0
success=0
fail=0
for line in InputFile :
total+=1
DOMAIN=line[1:-5]
TRYWWW=False
try :
url='http://'+DOMAIN
html=urllib2.urlopen(url,timeout=2).read()
except :
TRYWWW=True
try :
url='http://www.'+DOMAIN
html=urllib2.urlopen(url,timeout=2).read()
except :
failure(total,DOMAIN,ErrorFile,'[Fail-1:Connect Error]')
fail+=1
continue
try :
soup=BeautifulSoup(html)
TITLE=soup.title.string
except AttributeError:
if TRYWWW==True :
failure(total,DOMAIN,ErrorFile,'[Fail-2:No Title]')
fail+=1
try :
url='http://www.'+DOMAIN
html=urllib2.urlopen(url,timeout=2).read()
except :
failure(total,DOMAIN,ErrorFile,'[Fail-3:Connect Error]')
fail+=1
try :
soup=BeautifulSoup(html)
TITLE=soup.title.string
except AttributeError:
failure(total,DOMAIN,ErrorFile,'[Fail-4:No Title]')
fail+=1
except :
failure(total,DOMAIN,ErrorFile,'[Fail-5:BeautifulSoup Error]')
fail+=1
else :
successprocess(total,DOMAIN,TITLE,SuccessFile,'[Fail-6:Write Error]')
success+=1
except :
failure(total,DOMAIN,ErrorFile,'[Fail-7:BeautifulSoup Error]')
fail+=1
else :
successprocess(total,DOMAIN,TITLE,SuccessFile,'[Fail-8:Write Error]')
success+=1
InputFile.close()
SuccessFile.close()
ErrorFile.close()
print '----------\nTotal=%i\nSuccess=%i\nFail=%i' %(total,success,fail)
if __name__ == '__main__' :
main()

简述

使用BeautifulSoup来解析html,所以运行程序前需要使用pip install beautifulsoup来安装该模块。
逻辑可能略显混乱。

  • 因为域名列表中很多都是一级域名,所以首先尝试直接请求该域名,如果成功,则进入下一步;如果出错则请求加上www的域名,失败则解析下一个域名;
  • 使用beautifulsoup来解析html文件,成功解析到title则一次处理成功,失败则进入下一步;
  • 如果是没有解析到title这个tag,则检查是否请求的是加上www的域名,如果是,则按照失败处理,继续解析下一个域名,如果不是则请求加上www的域名。其它异常,都按失败处理。

测试

domain file

使用如下domain文件来测试

1
2
3
4
5
6
7
8
9
10
"baidu.com":1,
"apple.com":1,
"sina.com":1,
"qq.com":1,
"360.com":1,
"11wefwfe.com":1,
"google.com":1,
"tyr.gift":1,
"tyrttttt.gift":1,
"www.vip.com":1,

terminal output

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ python resolve-domain.py
1 baidu.com 百度一下,你就知道
2 apple.com Apple
3 sina.com Request Rejected
4 qq.com ÌÚѶÊ×Ò³
5 360.com 360公司官网 - 360安全软件 - 360智能硬件 - 360智能家居 - 360企业服务
6 11wefwfe.com [Fail-1:Connect Error]
7 google.com [Fail-1:Connect Error]
8 tyr.gift TyrChen's Notes
9 tyrttttt.gift [Fail-1:Connect Error]
10 www.vip.com 唯品会(原Vipshop.com)特卖会:一家专门做特卖的网站_确保正品_确保低价_货到付款
----------
Total=10
Success=7
Fail=3

success.log

1
2
3
4
5
6
7
1 baidu.com 百度一下,你就知道
2 apple.com Apple
3 sina.com Request Rejected
4 qq.com ÌÚѶÊ×Ò³
5 360.com 360公司官网 - 360安全软件 - 360智能硬件 - 360智能家居 - 360企业服务
8 tyr.gift TyrChen's Notes
10 www.vip.com 唯品会(原Vipshop.com)特卖会:一家专门做特卖的网站_确保正品_确保低价_货到付款

error.log

1
2
3
6 11wefwfe.com [Fail-1:Connect Error]
7 google.com [Fail-1:Connect Error]
9 tyrttttt.gift [Fail-1:Connect Error]

最终,国内可以直连的域名在这,之前的pac国外解析的数据title在这

如果您觉得这篇文章对您有帮助,不妨支持我一下!