【爬虫Practice】学习过程中遇到的问题

1. 无法连接至pypi开源网站

记录:起初无法通过pip install requests下载因为python的开源网站被墙了翻不过去,所以添加了一个安装包;

解决方法:也可以使用其他开源镜像网站,比如清华、阿里。

$ pip install pywinauto -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

2. SSLError: wrong version number

报错信息:在写好爬虫脚本后就出现了以下

requests.exceptions.SSLError: HTTPSConnectionPool(host='www.sogou.com', port=443): Max retries exceeded with url: /web?querry=%E5%91%A8%E6%9D%B0%E4%BC%A6 (Caused by SSLError(SSLError(1, '[SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1076)')))

解决方法

关闭代理服务器,在登录搜狗浏览器时,我是随机启动sidecar加速器。

❓TODO:服务代理器会对URL访问有什么影响?

3. UnicodeEncodeError

报错信息:输入一个页面带汉字的网址后,爬取页面显示打印处出错

UnicodeEncodeError: 'gbk' codec can't encode character '\xbb' in position 103672: illegal multibyte sequence

报错原因:

使用utf-8遇见中文时会出现乱码,应更改为gb18030.
1.UTF-8:即国际通用字符编码,该编码方式囊括了世界各个国家及地区使用的字符集,尤其是对于英文字母的表示方法仅占用一个字节,很好的支持了欧美等国家的需要。优点:为了统一世界上各种编码而设计,通用性强。缺点:为了兼顾世界所有语言的字符,必须采用多位给字符编号,例如中文字符采用3字节编码方式,而gb18030采用2字节。
2.gb18030:是新出的国家标准。这个标准由国家强制执行(也是为了保证中国信息业的地位,以及争取一定的主动权),所以所有在中国大陆销售的操作系统必须支持gb18030。现在的Gb18030不仅包含了简体和繁体汉字,支持中国少数名族文字,还包含了日韩等国的象形文字。优点:兼容性好,与以前的国标码都兼容。缺点:对英文字母需要2个字节的编码。

解决方法:

import io
import sys
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='gb18030')

4. VS Code OUTPUT里无法输入

解决方法:

# 1.settings
# 2.搜索 run in terminal
# 3.在Run In Terminal前面打钩即可
# 4.然后程序就会在终端运行并可以输入

5. 无法加载文件 E:\SpiderPractice\venv\Scripts\Activate.ps1

报错信息:

& : 无法加载文件 E:\SpiderPractice\venv\Scripts\Activate.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170 中的about_Execution_Policies 

报错原因:

win10默认的执行策略是不载入任何配置文件,不运行任何脚本。

解决方法:

$ get-executionpolicy #查看策略权限,
$ Set-ExecutionPolicy -Scope CurrentUser RemoteSigned #修改策略

参考链接:CSDN

6. 伪造User-Agent

报错信息:在获取豆瓣高分电影时IP被封

# IP请求次数过多 请登录豆瓣

解决方法:获取伪造UA的库

$ pip install fake-useragent   #终端输入的pip install直接下载到当前文件夹 要复制到c盘的sites-pakage下面

from fake_useragent import UserAgent  #不然这里会报红
ua = UserAgent()
ua.random

6. FakeUserAgentError

报错信息:最前面的信息也是有用的,每个错误都会报出详细的类型,虽然错误类型可能一样,但错误原因不一定都相同,解决问题的时候还是要看清别人解决方案解决的是什么问题,不要盲目尝试浪费时间。对症下药。

Error occurred during loading data. Trying to use cache server https://fake-useragent.herokuapp.com/browsers/0.1.11
...
raise FakeUserAgentError('Maximum amount of retries reached')
fake_useragent.errors.FakeUserAgentError: Maximum amount of retries reached

解决方案:

# 1. ctrl+click 信息中的网址:https://fake-useragent.herokuapp.com/browsers/0.1.11
# 2. 获取到页面信息,保存到当前python的临时存储路径中,查看路径方法:
import tempfile
print(tempfile.gettempdir())
# 3. 命名为fake_useragent_0.1.11.json

参考链接:CSDN 解决FakeUserAgentError

7. BeautifulSoup中文乱码

原代码

page_text = requests.get(url=get_url, headers=headers).text
soup = BeautifulSoup(page_text, 'lxml')

解决方法:将text换成content 就能解决乱码。当然还有一些其他方式。

page_text = requests.get(url=get_url, headers=headers).content
soup = BeautifulSoup(page_text, 'lxml')

8. lxml.etree.XMLSyntaxError

报错信息:

lxml.etree.XMLSyntaxError: Specification mandates value for attribute itemscope, line 2, column 27

报错原因:

html代码书写不规范,不符合xml解析器的使用规范

解决方法:

parser = etree.HTMLParser(encoding='utf-8')
tree = etree.parse('pagecontent.html', parser=parser)

9. Running setup.py install for pycrypto … error

报错信息:在执行安装pycrypto失败

Running setup.py install for pycrypto ... error
ERROR: Command errored out with exit status 1:

解决方法

pip install pycryptodome

10. TypeError: string indices must be integers

报错信息:用json按key访问时出现问题, 原因是text获取的是字符串不是json

print(response_json['current'])
TypeError: string indices must be integers

解决方法:

#主动加载成json格式
response = requests.post(url=post_url, data=data, headers=headers).text
response_json = json.loads(response)
response_list = response_json['list']
#直接以json格式获取
response = requests.post(url=post_url, data=data, headers=headers).json()
print(response['list'])

11. 写进csv格式每个字符都会后面加一个逗号

原代码:writerow接收元组,如果传进去的是一个字符串,一个字符串也是一堆字符串,每个字符都会加 ,

for row in response['list']:
    info = row['prodName']+row['avgPrice']+row['place']+row['unitInfo']
    csvwriter.writerow(info)

解决方法:换成元组传进去

for row in response['list']:
    info = (row['prodName'], row['avgPrice'], row['place'], row['unitInfo'])
    csvwriter.writerow(info)

12. 写进csv每行都会多一个空行

**解决方法:**加入newline=’ ’

f = open('vegetablesPrice.csv', mode='w', encoding="utf-8", newline='')

猜你喜欢

转载自blog.csdn.net/lily_i/article/details/121880328