数据库
首页 > 数据库> > 01-爬虫基础-download 和 MySQL 封装

01-爬虫基础-download 和 MySQL 封装

作者:互联网

你好,我是悦创。

本文,我们来讲解一些 Python 爬虫的基础,希望你能认真掌握。而且公众号:AI悦创,在离开一段之后将开启持续的周更爬虫教程,以及 JS 逆向。

如果要抢先阅读可以作者微信「注意:抢先阅读需要付费加入」,作者文章抢先阅读学习。需要爬虫零基础全套入门「注意不包含:JS 逆向、APP 逆向」但入门指的是入门涉及爬虫的大部分内容以及常用框架等等。

1. Python 爬虫基础

2. Web 基础概念

from urllib.parse import urlparse

url = 'https://www.google.com/search?q=url'

result = urlparse(url)

print(result)

# 输出:
ParseResult(scheme='https', netloc='www.google.com', path='/search', params='', query='q=url', fragment='')

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=由上面的代码,我们检测出来的是 utf-8 的,那很有可能是第一步识别的 Http 标头中的编码。所以,他就误认为是这样的编码。

收到响应时,请求会猜测访问Response.text 属性时用于解码响应的编码 。请求将首先检查HTTP标头中的编码,如果不存在,则将使用 chardet 尝试猜测编码。唯一的一次请求不会做到这一点,如果没有明确的字符集是存在于HTTP头**,并** 在 Content-Type 头中包含 text。在这种情况下, RFC 2616 指定默认字符集必须为 ISO-8859-1。在这种情况下,请求遵循规范。如果需要其他编码,则可以手动设置 Response.encoding 属性,或使用raw Response.content。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=这样我们得到的就不是乱码的了。所以,在我们之后写爬虫抓去包含中文的网站,尽量不要直接 r.text 这个变量,因为它有可能把这个编码理解错,输出得到这种乱码来。我们要的就是先使用 chardet 这个库来进行检测编码,然后我们再手动解码。

「实际操作:」

# 方法一:推荐
import requests
import chardet

url = 'https://www.baidu.com'
resopnse = requests.get(url)
# print(resopnse.text)
Capture_the_coding = chardet.detect(resopnse.content)['encoding']
# print(Capture_the_coding)
print(resopnse.content.decode(Capture_the_coding))
# 方法二:
import requests

url = 'https://www.baidu.com'
resopnse = requests.get(url)
resopnse.encoding = 'utf-8'
print(resopnse.text)
# 方法三:
import requests

url = 'https://www.baidu.com'
resopnse = requests.get(url)
resopnse.encoding = resopnse.apparent_encoding
print(resopnse.text)
# 方法四:
import requests

url = 'https://www.baidu.com'
resopnse = requests.get(url)
# print(resopnse.content.decode('utf8'))
print(resopnse.text.encode('utf8'))

「这里还是要再说一下这个 chardet 这个库,它还是有些小问题的。」我们知道中文的编码有很多种(  utf-8、gbk、gb2312、gb18030 等这种)为什么要说这个呢?「gb2312 < gbk < gb19030」

「那么 chardet 问题在哪呢?」这里 chardet.detect() 在 detect 的时候,detect 出来的时候,如果目标包含中文,如果是 gbk 的它返回的有可能是 gb2312 。所以,大家要认清它的关系。这样就导致了编解码的不一致,造成乱码。所以,我给大家介绍另外一个库,所以我们还有个变通的方法。这里,我们先用代码演示一下,看是不是会出现我上面 所说的问题:

import chardet
str1 = '跟悦创学编程'
str2 = '科技健康'
result = chardet.detect(str1.encode('gbk'))
result2 = chardet.detect(str2.encode('gbk'))
print(result)
print(result2)

运行结果:

{'encoding': 'TIS-620', 'confidence': 0.2248882575226022, 'language': 'Thai'}
{'encoding': 'ISO-8859-1', 'confidence': 0.73, 'language': ''}

这就表明它不是非常准确的,所以我们需要用到这个库:cchardet,直接使用如下命令安装即可:

pip3 install cchardet

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=安装之后,我们继续运行上面的代码,看运行结果如何:

import cchardet
str1 = '跟悦创学编程'
str2 = '科技健康'
result = cchardet.detect(str1.encode('gbk'))
result2 = cchardet.detect(str2.encode('gbk'))
print(result)
print(result2)

运行结果:

{'encoding': None, 'confidence': None}
{'encoding': 'WINDOWS-1252', 'confidence': 0.5}

我们可以看到,这运行的不是非常的准确,所以我个人推测这个和我们的一个字数有可能有关,我们可以多输入几个汉字,然后再次运行观察:

import cchardet
str1 = '跟悦创学编程,轻松又快乐!'
str2 = '科技健康每日运动'
result = cchardet.detect(str1.encode('gbk'))
result2 = cchardet.detect(str2.encode('gbk'))
print(result)
print(result2)

运行结果:

{'encoding': 'GB18030', 'confidence': 0.9259259700775146}
{'encoding': 'GB18030', 'confidence': 0.9900000095367432}

从结果可以看出,更加的准确了,我们再回到原来的上面的 chardet 的库,来运行试一试:

 

标签:编码,01,encoding,print,detect,chardet,MySQL,download,resopnse
来源: https://blog.51cto.com/aiyc/2895178