事情是这样的, 今天想试一下python写爬虫, 结果踩了一堆坑, 但是又觉得很有意思, 就把踩坑的过程记录下来
首先是在菜鸟教程(runoob)的python爬虫教程抄了下面这段代码 (www.runoob.com/w3cnote/pyt…):
三、urllib2 实现下载网页的三种方式
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import cookielib
import urllib2
url = "http://www.baidu.com"
response1 = urllib2.urlopen(url)
print "第一种方法"
#获取状态码,200表示成功
print response1.getcode()
#获取网页内容的长度
print len(response1.read())
print "第二种方法"
request = urllib2.Request(url)
#模拟Mozilla浏览器进行爬虫
request.add_header("user-agent","Mozilla/5.0")
response2 = urllib2.urlopen(request)
print response2.getcode()
print len(response2.read())
print "第三种方法"
cookie = cookielib.CookieJar()
#加入urllib2处理cookie的能力
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
urllib2.install_opener(opener)
response3 = urllib2.urlopen(url)
print response3.getcode()
print len(response3.read())
print cookie
代码拷贝到vscode出现报错 提示如下报错
发现是print函数的参数要加括号包裹
print("第一种方法")
print(response1.getcode())
print(len(response1.read()))
然后解决cookielib库的警告问题
尝试安装cookielib, 结果pip3 install cookielib 报错
百度到csdn 说的是引入包的方式错误(blog.csdn.net/weixin_4354…)
于是修改引入cookielib的方式:
还是报错,  ̄□ ̄||, 继续百度, 找了一圈, 发现如下2个很有意思的回答: (blog.csdn.net/weixin_4559…) (blog.csdn.net/weixin_4098…)
我真的是麻了, 因为我安装的是3.8, 不过参考第一篇文章还是成功引入了cookie模块
相信大家也看出来了, 菜鸟教程的python系列教程, 基本都是基于python2写的, 这个网站还是比较"古老"了, 现在想要使用较新的开发环境写这些教程, 会遇到各种各样的问题
继续解决urllib2库的问题:
参考这个很容易解决(blog.csdn.net/qq_41595021…)
解决所有警告和报错之后的代码如下:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# import http.cookielib
from http import cookiejar
cookie = cookiejar.CookieJar()
# import urllib2
import urllib.request
urllib2 = urllib.request
url = "http://www.baidu.com"
response1 = urllib2.urlopen(url)
print("第一种方法")
#获取状态码,200表示成功
print(response1.getcode())
#获取网页内容的长度
print(len(response1.read()))
print("第二种方法")
request = urllib2.Request(url)
#模拟Mozilla浏览器进行爬虫
request.add_header("user-agent","Mozilla/5.0")
response2 = urllib2.urlopen(request)
print(response2.getcode())
print(len(response2.read()))
print("第三种方法")
# cookie = cookielib.CookieJar() # 上面创建了cookie
#加入urllib2处理cookie的能力
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
urllib2.install_opener(opener)
response3 = urllib2.urlopen(url)
print(response3.getcode())
print(len(response3.read()))
print(cookie)
成功运行
那么, 接下来我想打印response的文本如何做到呢? 百度python response
发现这篇文章:(blog.csdn.net/weixin_3625…)
原来直接response.text就可以打印了, 我试试看:
结果很明显, 继续踩坑
继续百度 python response.text
出现如下文章, 和上面那一篇只能说....非常相似(blog.csdn.net/qq_31362767…)
仔细对比之后发现, NM的这才是原文吧??? 真就照着抄呗😂
这事儿, 先翻篇, 继续研究response的问题
搜索python response基本上都表示response.text是存在的, 按照我的编程经验来说, 也应该是存在text属性或者函数的, 可是就是拿不到response1的text, 于是我就想, 难不成是url的问题?
打开浏览器控制台发现: http的百度被307重定向到了https的百度, 而http的请求也没有响应结果....
得了, 请求根本就没有返回响应体
那么我尝试打印response1.headers看看能不能得到响应头:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# import http.cookielib
from http import cookiejar
cookie = cookiejar.CookieJar()
# import urllib2
import urllib.request
urllib2 = urllib.request
url = "http://www.baidu.com"
response1 = urllib2.urlopen(url)
print("第一种方法")
# response1.encoding="utf-8"
# print(response1.text)
print(response1.headers)
#获取状态码,200表示成功
print(response1.getcode())
#获取网页内容的长度
print(len(response1.read()))
运行结果:
是有结果的! 看来没错, 是请求地址没有返回正文导致的, 请求本身是成功了的
于是我想要试试直接请求https: (www.baidu.com)
我去, 这一长串报错直接给我干懵了😳, 不过学习嘛, 遇到坑是正常的, 继续学习(百度)
参考这2篇文章修改新的代码:
Python3爬虫写法: (www.cnblogs.com/mmykdbc/p/7…)
取消SSL验证: (blog.csdn.net/tt75281920/…)
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# import request
import urllib.request
request = urllib.request
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
url = "https://www.baidu.com"
response1 = request.urlopen(url).read()
response1 = response1.decode("utf-8")
print(response1)
运行结果:
这又是什么情况....咋又吧https重定向回http了呢? 我猜测可能是因为取消了SSL验证导致的, 不过我是python新手确实不了解这些, 只是猜测, 这部分应该需要对请求原文有一定熟悉度才能理清楚吧
于是我又用新的写法尝试请求(www.baidu.com)
果然是成功的, 最后试试其他url的效果
最后, 还是不参考菜鸟教程的学习了, 上小电视大学找python的教程了😂