【踩坑记录】菜鸟教程学习python爬虫遇到的一系列坑

49 阅读4分钟

事情是这样的, 今天想试一下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出现报错 提示如下报错

Snipaste_2023-04-06_09-42-31.png

发现是print函数的参数要加括号包裹

  print("第一种方法")
  print(response1.getcode())
  print(len(response1.read()))

然后解决cookielib库的警告问题

Snipaste_2023-04-06_09-57-43.png

尝试安装cookielib, 结果pip3 install cookielib 报错

Snipaste_2023-04-06_09-38-54.png

百度到csdn 说的是引入包的方式错误(blog.csdn.net/weixin_4354…)

于是修改引入cookielib的方式:

Snipaste_2023-04-06_10-00-00.png

还是报错,  ̄□ ̄||, 继续百度, 找了一圈, 发现如下2个很有意思的回答: (blog.csdn.net/weixin_4559…) (blog.csdn.net/weixin_4098…)

Snipaste_2023-04-06_10-02-58.png

我真的是麻了, 因为我安装的是3.8, 不过参考第一篇文章还是成功引入了cookie模块

Snipaste_2023-04-06_10-04-12.png

相信大家也看出来了, 菜鸟教程的python系列教程, 基本都是基于python2写的, 这个网站还是比较"古老"了, 现在想要使用较新的开发环境写这些教程, 会遇到各种各样的问题

继续解决urllib2库的问题:

Snipaste_2023-04-06_10-08-37.png

参考这个很容易解决(blog.csdn.net/qq_41595021…)

Snipaste_2023-04-06_10-11-26.png

解决所有警告和报错之后的代码如下:

  #!/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)

成功运行

Snipaste_2023-04-06_10-12-56.png

那么, 接下来我想打印response的文本如何做到呢? 百度python response

发现这篇文章:(blog.csdn.net/weixin_3625…)

原来直接response.text就可以打印了, 我试试看:

Snipaste_2023-04-06_10-35-52.png

结果很明显, 继续踩坑

继续百度 python response.text

出现如下文章, 和上面那一篇只能说....非常相似(blog.csdn.net/qq_31362767…)

仔细对比之后发现, NM的这才是原文吧??? 真就照着抄呗😂

Snipaste_2023-04-06_10-41-44.png

Snipaste_2023-04-06_10-43-12.png

这事儿, 先翻篇, 继续研究response的问题

搜索python response基本上都表示response.text是存在的, 按照我的编程经验来说, 也应该是存在text属性或者函数的, 可是就是拿不到response1的text, 于是我就想, 难不成是url的问题?

打开浏览器控制台发现: http的百度被307重定向到了https的百度, 而http的请求也没有响应结果....

Snipaste_2023-04-06_10-51-07.png

Snipaste_2023-04-06_10-53-19.png

得了, 请求根本就没有返回响应体

那么我尝试打印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()))

运行结果:

Snipaste_2023-04-06_10-57-53.png

是有结果的! 看来没错, 是请求地址没有返回正文导致的, 请求本身是成功了的

于是我想要试试直接请求https: (www.baidu.com)

Snipaste_2023-04-06_11-01-32.png

我去, 这一长串报错直接给我干懵了😳, 不过学习嘛, 遇到坑是正常的, 继续学习(百度)

参考这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)

运行结果:

Snipaste_2023-04-06_11-22-36.png

这又是什么情况....咋又吧https重定向回http了呢? 我猜测可能是因为取消了SSL验证导致的, 不过我是python新手确实不了解这些, 只是猜测, 这部分应该需要对请求原文有一定熟悉度才能理清楚吧

于是我又用新的写法尝试请求(www.baidu.com)

Snipaste_2023-04-06_13-52-16.png

果然是成功的, 最后试试其他url的效果

Snipaste_2023-04-06_11-24-26.png

Snipaste_2023-04-06_11-23-58.png

最后, 还是不参考菜鸟教程的学习了, 上小电视大学找python的教程了😂