鱼C论坛

 找回密码
 立即注册
查看: 4180|回复: 8

[技术交流] python 中常用的爬虫模块——有错误的地方请大家指正

[复制链接]
发表于 2019-8-12 22:05:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 wyft5t5 于 2019-8-12 22:10 编辑

1、urllib —— 这其实是一个包,里边有四个模块,只有一个比较常用,安装方法 pip install urllib

2、下边是编码举例:
——————————————————————————————————————————————————————————
import urllib.request as a # 导入这个比较常用的模块,模块里就一个方法(函数)比较常用
b=a.urlopen("https://fishc.com.cn/forum.php")#通过这个方法打开,读取到网页路径,实现对目标url的访问
c=b.read()#读取网页的内容,此时读取到的网页是以utf-8编码的bytes对象,一般看不懂
print (c)
print (type(c))#此时格式:<class 'bytes'>

d=c.decode("utf-8","ignore")
# 将其解码,变成unicode格式的编码,我们可以看懂
# 这里有一个需要注意的问题很多网页的编码不是utf-8的,使用ignore可以忽略其他的编码格式
# 比如我们这个网页的编码就是 charset=gbk,此时我们可以看到网页能打印出来,但是所有的中文都变成了乱码
# 所以我们这个定义的正确方法是d=c.decode("gbk","ignore")
# 注意:不能写成 d=c.decode("utf-8","gbk","ignore") ,"utf-8"和"gbk"不能同时使用

print (d)
print (type(d))#此时格式:<class 'str'>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-8-12 22:08:47 | 显示全部楼层
本帖最后由 wyft5t5 于 2019-8-12 22:24 编辑

上边的例子,我想将c里边的内容遍历出来,所以做了如下操作:
import urllib.request as a
b=a.urlopen("https://fishc.com.cn/forum.php")
c=b.read()
for s in c:
    print (s)
print (type(s))

但是打印的结果:
60
33
68
79
67
……
47
104
116
109
108
62
<class 'int'>

遍历出来的 S 为啥会是一堆数字啊???是每一个字母,符号所代表的ASKII码吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-12 22:26:53 | 显示全部楼层
我想让爬取到的网页,自动判断一次,看看是UTF-8 , 还是GBK。然后分别套用不同的 decode 参数,该怎么处理呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2019-8-12 22:40:01 | 显示全部楼层
本帖最后由 wyft5t5 于 2019-8-12 22:42 编辑

将爬取的数据导出到一个txt文本上
import urllib.request as a
b=a.urlopen("https://fishc.com.cn/forum.php")
c=b.read()
d=c.decode("gbk","ignore")
print (c)
print(type(c))#c的格式是<class 'bytes'>
with open("小甲鱼.txt",'wb') as f:
    f.write(c)
注意两件事:

1、将print (c)  得到的结果,跟f.write(c)对比会发现二者明显不同;
     f.write(c) 的结果跟 d=c.decode("gbk","ignore") 相同

2、f.write(d) 会报错,经过.decode转变后无法导出到文件,不知道为啥
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-13 21:41:49 | 显示全部楼层
from urllib.parse import urlencode#将中文解码,正常在爬取时,无法识别中文

from urllib.parse import urlencode#将中文解码,正常在爬取时,无法识别中文
def book(a,b):
    a=a.rstrip()#.rstrip()——去掉右边的空格
    c={"keyword":b}#将b包装成一个字典
    d=(a+"search.php?")+urlencode(c)#urlencode将字典里的值解码成一个计算机识别的格式,人识别不了
    return d

x=input("请输入网址:")
y=input("请输入书名:")
z=book(x,y)
print(z)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-14 20:14:36 | 显示全部楼层
本帖最后由 wyft5t5 于 2019-8-14 20:52 编辑

requests模块是用于第一步获取HTML页面信息; requests库用于爬取HTML页面,提交网络请求,基于urllib,但比urllib更方便;

requests.get():
获取HTML网页的主要方法,对应于HTTP的GET

https://www.cnblogs.com/ranxf/p/7808537.html
____________________________________________________________________

用pip install requests 命令安装 requests模块时,没有安装成功。

可以用一下清华镜像
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests

____________________________________________________________________
import requests
a = requests.get("https://movie.douban.com/top250")
b=a.content
c=a.text
print(a)#结果是<Response [200]>
print(type(a))#结果是<class 'requests.models.Response'>
print (b)#结果是给电脑看的编码
print(type(b))#结果是<class 'bytes'>
print (c)#结果是网站的完整编码,给人看的
print(type(c))#结果是<class 'str'>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-14 21:36:26 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-17 19:07:21 | 显示全部楼层
urllib.request 和 requests对比
建议使用requests

https://blog.csdn.net/qq_38783948/article/details/88239109
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-16 10:29:12 | 显示全部楼层
学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-24 15:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表