爬虫-访问网站数据并保存在对应文件

题目:访问网址读取数据并保存在对应的文本文件里

我的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
'''此脚本通过读取urls.txt上的网站的信息,并保存在对应的文本文件里。'''
import urllib.request as ur
import chardet as ch

def main():
with open('urls.txt') as file:
urls = file.readlines()#分行读取
n = 0
for url in urls:
sources = ur.urlopen(url).read()
code = ch.detect(sources)['encoding']#检测网站的编码方式
html = sources.decode(code)#对网站信息进行相应的解码,decode默认的是encoding = 'utf-8'的编码
n += 1
filename = ''.join(['file_', str(n), '.txt'])#生成对应的文件
with open(filename, 'w', encoding = code) as nfile:#再用相应的编码写入对应的文件,encoding默认的编码是utf-8
nfile.write(html)

if __name__ == '__main__':
main()

老师的代码:

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
'''读取网站信息并保存在对应的文件里。老师的方法与我的相似,不同之处,读取网站信息时使用了分割换行符的方法'''
import urllib.request
import chardet

def main():
i = 0

with open("urls.txt", "r") as f:
# 读取待访问的网址
# 由于urls.txt每一行一个URL
# 所以按换行符'\n'分割
urls = f.read().splitlines()

for each_url in urls:
response = urllib.request.urlopen(each_url)
html = response.read()

# 识别网页编码
encode = chardet.detect(html)['encoding']
if encode == 'GB2312':
encode = 'GBK'

i += 1
filename = "url_%d.txt" % i #老师用了格式化,我用了join的方法

with open(filename, "w", encoding=encode) as each_file:
each_file.write(html.decode(encode, "ignore")) #decode的第二个参数。对于有些字符的特殊编码方式,我们可以通过这个方式进行忽略,详细请参考后面链接。

if __name__ == "__main__":
main()

以下内容参考:Python中解码decode()与编码encode()与错误处理UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0xab

使用python的时候经常会遇到文本的编码与解码问题,其中很常见的一种解码错误如题目所示,下面介绍该错误的解决方法,将‘gbk’换成‘utf-8’也适用。
(1)、首先在打开文本的时候,设置其编码格式,如:open(‘1.txt’,encoding=’gbk’);
(2)、若(1)不能解决,可能是文本中出现的一些特殊符号超出了gbk的编码范围,可以选择编码范围更广的‘gb18030’,如:open(‘1.txt’,encoding=’gb18030’);
(3)、若(2)仍不能解决,说明文中出现了连‘gb18030’也无法编码的字符,可以使用‘ignore’属性进行忽略,如:open(‘1.txt’,encoding=’gb18030’,errors=‘ignore’);

(4)、还有一种常见解决方法为open(‘1.txt’).read().decode(‘gb18030’,’ignore’

总结:

  1. 复习了文件的读取与写入
  2. decode 与 encode 的应用
  3. urllib 与 chardet的应用