2022年 11月 9日

Python 爬虫 之 爬虫的一些基本知识和基本操作(爬取视频、图片、获取网页源码等)整理

 

 

Python 爬虫 之 爬虫的一些基本知识和基本操作(爬取视频、图片、获取网页源码等)整理

 

目录

Python 爬虫 之 爬虫的一些基本知识和基本操作(爬取视频、图片、获取网页源码等)整理

一、简单介绍

二、文件头的说明为什么要伪装浏览器

三、Anacoda 环境的创建 Python 环境

四、Pycharm 使用 Anacoda 创建的 Python 环境进行编程

五、 Python 访问网页,并且下载保存网页到本地

六、Python 访问网页,并且下载保存网页资源图片

七、Python 访问网页,并且下载保存网页视频到本地

八、robots.txt 查看网页 爬虫是否允许

九、 Post 请求网页的方法 (带上密码账号进行模拟账号登录)

十、带 cookie 访问网址的方法(可以模拟登陆(前提 cookie 别过期))


 

一、简单介绍

Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。Python是一种解释型脚本语言,可以应用于以下领域: Web 和 Internet开发、科学计算和统计、人工智能、教育、桌面界面开发、软件开发、后端开发、网络爬虫。

爬虫:一段自动抓取互联网信息的程序,从互联网上抓取对于我们有价值的信息。


爬虫的网页请求:

网页请求的过程分为两个环节:

1、Request (请求):每一个展示在用户面前的网页都必须经过这一步,也就是向服务器发送访问请求。

2、Response(响应):服务器在接收到用户的请求后,会验证请求的有效性,然后向用户(客户端)发送响应的内容,客户端接收服务器响应的内容,将内容展示出来,就是我们所熟悉的网页请求


 

         网页请求的方式也分为两种:

1、GET:最常见的方式,一般用于获取或者查询资源信息,也是大多数网站使用的方式,响应速度快。

2、POST:相比 GET 方式,多了以表单形式上传参数的功能,因此除查询信息外,还可以修改信息。

 

网页一般由三部分组成,分别是 HTML(超文本标记语言)、CSS(层叠样式表)和 JScript(活动脚本语言)

    HTML :

HTML 是整个网页的结构,相当于整个网站的框架。带“<”、“>”符号的都是属于 HTML 的标签,并且标签都是成对出现

  1. 常见的标签如下:
  2. <html>..</html> 表示标记中间的元素是网页
  3. <body>..</body> 表示用户可见的内容
  4. <div>..</div> 表示框架
  5. <p>..</p> 表示段落
  6. <li>..</li>表示列表
  7. <img>..</img>表示图片
  8. <h1>..</h1>表示标题
  9. <a href="">..</a>表示超链接

 

CSS:

CSS 表示样式,图 1 中第 13 行<style type="text/css">表示下面引用一个 CSS,在 CSS 中定义了外观。

JScript:

JScript 表示功能。交互的内容和各种特效都在 JScript 中,JScript 描述了网站中的各种功能。

Response 一些状态返回代码说明:

  1. http状态返回代码 1xx(临时响应)
  2. 表示临时响应并需要请求者继续执行操作的状态代码。
  3. http状态返回代码代码 说明
  4. 100 (继续) 请求者应当继续提出请求。服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。
  5. 101 (切换协议)请求者已要求服务器切换协议,服务器已确认并准备切换。
  6. http状态返回代码 2xx(成功)
  7. 表示成功处理了请求的状态代码。
  8. http状态返回代码代码 说明
  9. 200 (成功) 服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页。
  10. 201 (已创建) 请求成功并且服务器创建了新的资源。
  11. 202 (已接受) 服务器已接受请求,但尚未处理。
  12. 203 (非授权信息) 服务器已成功处理了请求,但返回的信息可能来自另一来源。
  13. 204 (无内容) 服务器成功处理了请求,但没有返回任何内容。
  14. 205 (重置内容)服务器成功处理了请求,但没有返回任何内容。
  15. 206 (部分内容) 服务器成功处理了部分 GET 请求。
  16. http状态返回代码 3xx(重定向)
  17. 表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向。
  18. http状态返回代码代码 说明
  19. 300 (多种选择) 针对请求,服务器可执行多种操作。 服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。
  20. 301 (永久移动) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
  21. 302 (临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
  22. 303 (查看其他位置) 请求者应当对不同的位置使用单独的GET 请求来检索响应时,服务器返回此代码。
  23. 304 (未修改)自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。
  24. 305 (使用代理) 请求者只能使用代理访问请求的网页。如果服务器返回此响应,还表示请求者应使用代理。
  25. 307 (临时重定向) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
  26. http状态返回代码4xx(请求错误)
  27. 这些状态代码表示请求可能出错,妨碍了服务器的处理。
  28. http状态返回代码代码 说明
  29. 400 (错误请求) 服务器不理解请求的语法。
  30. 401 (未授权) 请求要求身份验证。对于需要登录的网页,服务器可能返回此响应。
  31. 403 (禁止) 服务器拒绝请求。
  32. 404 (未找到) 服务器找不到请求的网页。
  33. 405 (方法禁用) 禁用请求中指定的方法。
  34. 406 (不接受)无法使用请求的内容特性响应请求的网页。
  35. 407 (需要代理授权) 此状态代码与401(未授权)类似,但指定请求者应当授权使用代理。
  36. 408 (请求超时) 服务器等候请求时发生超时。
  37. 409 (冲突) 服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息。
  38. 410 (已删除) 如果请求的资源已永久删除,服务器就会返回此响应。
  39. 411 (需要有效长度)服务器不接受不含有效内容长度标头字段的请求。
  40. 412 (未满足前提条件)服务器未满足请求者在请求中设置的其中一个前提条件。
  41. 413 (请求实体过大)服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。
  42. 414 (请求的 URI 过长) 请求的URI(通常为网址)过长,服务器无法处理。
  43. 415 (不支持的媒体类型)请求的格式不受请求页面的支持。
  44. 416 (请求范围不符合要求)如果页面无法提供请求的范围,则服务器会返回此状态代码。
  45. 417 (未满足期望值)服务器未满足"期望"请求标头字段的要求。
  46. http状态返回代码5xx(服务器错误)
  47. 这些状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错。
  48. http状态返回代码代码 说明
  49. 500 (服务器内部错误) 服务器遇到错误,无法完成请求。
  50. 501 (尚未实施) 服务器不具备完成请求的功能。例如,服务器无法识别请求方法时可能会返回此代码。
  51. 502 (错误网关)服务器作为网关或代理,从上游服务器收到无效响应。
  52. 503 (服务不可用)服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。
  53. 504 (网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求。
  54. 505 (HTTP 版本不受支持) 服务器不支持请求中所用的HTTP 协议版本。

 

二、文件头的说明为什么要伪装浏览器

(网址:http://httpbin.org/get)

1、一个正常浏览器浏览网页的文件头

 

2、编写python 代码访问浏览器的文件头

 

3、所以很多网页为了防止爬虫爬取网页,通常通过文件头,来阻止代码访问(非正常浏览器),所以我们需要,伪装我们代码访问网页

 

4、伪装之后,就能以浏览器的身份访问网页了(一般的反爬虫就会阻挡不了了)

 

三、Anacoda 环境的创建 Python 环境

(这篇博客有关于 Anacoda 的下载安装 :https://blog.csdn.net/u014361280/article/details/108333521)

1、打开 Anaconda

 

2、在 Environments 中 Create 创建一个 Python 环境

 

3、安装需要的模块(两种方法一种Anacoda (下载可能较慢,可能需要翻墙),一种 cmd 中(可设置国内代码,提高下载速度)),这里以 cmd 中说明

 

4、cmd 中激活 刚才创建的环境,添加Python国内镜像,安装对应的模块包

 

5、国内 python 的镜像使用说明

  1. 1、python pip使用国内镜像#
  2. 清华:https://pypi.tuna.tsinghua.edu.cn/simple
  3. 阿里云:http://mirrors.aliyun.com/pypi/simple/
  4. 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
  5. 华中理工大学:http://pypi.hustunique.com/
  6. 山东理工大学:http://pypi.sdutlinux.org/
  7. 豆瓣:http://pypi.douban.com/simple/
  8. note:新版ubuntu要求使用https源,要注意。
  9. 例如:pip3 install -i https://pypi.doubanio.com/simple/ 包名
  10. 2、临时使用:#
  11. 可以在使用pip的时候加参数-i https://pypi.tuna.tsinghua.edu.cn/simple
  12. 例如:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyspider,这样就会从清华这边的镜像去安装pyspider库。
  13. 3、永久修改,一劳永逸:#
  14. 1)Linux下,修改 ~/.pip/pip.conf (没有就创建一个文件夹及文件。文件夹要加“.”,表示是隐藏文件夹)
  15. 内容如下:
  16. [global]
  17. index-url = https://pypi.tuna.tsinghua.edu.cn/simple
  18. [install]
  19. trusted-host=mirrors.aliyun.com
  20. 2)windows下,直接在user目录中创建一个pip目录,再新建文件pip.ini。(例如:C:\Users\WQP\pip\pip.ini)内容同上。
  21. 引用:http://www.cnblogs.com/microman/p/6107879.html

 

四、Pycharm 使用 Anacoda 创建的 Python 环境进行编程

(Pycharm 的下载安装可参考:https://blog.csdn.net/u014361280/article/details/104188222)

1、双击 Pycharm ,打开 Pycharm

 

2、新建一个工程

 

3、设置环境为 Anacoda 中创建的环境

 

 

4、取个工程名,完成创建

 

五、 Python 访问网页,并且下载保存网页到本地

1、新建脚本,编写对应代码

 

2、运行脚本,下载保存

 

3、参考代码

  1. # 引入模块
  2. import requests
  3. def LoadHtmlWithUrl(htmlUrl, savaPath):
  4. """
  5. 爬取下载html文件
  6. :param videoUrl: 网页 Url
  7. :param savaPath: 文件保存路径
  8. :return:
  9. """
  10. # 伪装的文件头
  11. headers = {
  12. "User-Agent": "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0"
  13. }
  14. # html 获取
  15. # 如需要 verify=False 避免报错 ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed
  16. response = requests.get(htmlUrl, headers=headers)
  17. print(response.status_code)
  18. if response.status_code == 200:
  19. print("网页获取成功,开始下载:")
  20. # 打开文件,二进制形式进行保存文件
  21. with open(savaPath, "w") as file:
  22. file.write(response.content.decode("utf-8"))
  23. # file.write(response.text)
  24. print("保存成功")
  25. else:
  26. print("网页获取失败!!")
  27. if __name__ == "__main__" :
  28. htmlUrl = "https://www.baidu.com/"
  29. savePath = "./TestData/baidu.html"
  30. print("打算下载:"+htmlUrl)
  31. LoadHtmlWithUrl(htmlUrl, savePath)

 

六、Python 访问网页,并且下载保存网页资源图片

1、编写代码

 

2、运行脚本,下载保存

 

3、参考代码

  1. # 引入模块
  2. import requests
  3. def LoadImageWithImageUrl(imageUrl, savaPath):
  4. """
  5. 爬取下载 图片 文件
  6. :param videoUrl: 网页 Url
  7. :param savaPath: 文件保存路径
  8. :return:
  9. """
  10. # 伪装的文件头
  11. headers = {
  12. "User-Agent": "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0"
  13. }
  14. # Image 获取
  15. # 如需要 verify=False 避免报错 ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed
  16. response = requests.get(imageUrl, headers=headers, verify=False)
  17. print(response.status_code)
  18. if response.status_code == 200:
  19. print("网页获取成功,开始图片下载:")
  20. # 打开文件,二进制形式进行保存文件
  21. with open(savaPath, "wb") as file:
  22. file.write(response.content)
  23. print("保存成功")
  24. else:
  25. print("网页获取失败!!")
  26. if __name__ == "__main__" :
  27. imageUrl = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1599376570244&di=39b64e0516049e125f2fa1616a7b326c&imgtype=0&src=http%3A%2F%2Fimgsrc.baidu.com%2Fforum%2Fw%3D580%2Fsign%3Da4a644b4f503738dde4a0c2a831ab073%2F149159fa513d26974449334956fbb2fb4216d88d.jpg"
  28. savePath = "./TestData/TestImage.jpg"
  29. print("打算下载:"+imageUrl)
  30. LoadImageWithImageUrl(imageUrl, savePath)

 

七、Python 访问网页,并且下载保存网页视频到本地

1、编写脚本

 

2、运行脚本,下载保存

 

3、参考代码

  1. # 引进模块
  2. import requests
  3. def LoadVideoWithVideoUrl(videoUrl, savaPath):
  4. """
  5. 爬取下载视频文件
  6. :param videoUrl: 视频 Url
  7. :param savaPath: 视频保存路径
  8. :return:
  9. """
  10. # 伪装的文件头
  11. headers = {
  12. "User-Agent": "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0"
  13. }
  14. # 视频流获取
  15. # verify=False 避免报错 ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed
  16. response = requests.get(videoUrl, headers=headers, stream=True, verify=False)
  17. print(response.status_code)
  18. if response.status_code == 200:
  19. print("视频获取成功,开始下载视频:")
  20. # 打开文件,二进制形式进行保存文件
  21. with open(savaPath, "wb") as file:
  22. # 分段 1024 * 1024 * 5 缓存文件
  23. for j in response.iter_content(1024 * 1024 * 5):
  24. print("...")
  25. file.write(j)
  26. print("视频下载成功")
  27. else:
  28. print("视频获取失败!!")
  29. if __name__ == "__main__" :
  30. videoUrl = "https://v-cdn.zjol.com.cn/280123.mp4"
  31. # videoUrl = "http://vjs.zencdn.net/v/oceans.mp4"
  32. savePath = "./TestData/testLoadVideo.mp4"
  33. print("打算下载:"+videoUrl)
  34. LoadVideoWithVideoUrl(videoUrl, savePath)

 

八、robots.txt 查看网页 爬虫是否允许

1、robots.txt 是配置是否允许网络爬虫爬你的网页站点的文件

seo工作者应该不陌生,robots.txt文件是每一个搜索引擎蜘蛛到你的网站之后要寻找和访问的第一个文件,robots.txt是你对搜索引擎制定的一个如何索引你的网站的规则。通过该文件,搜索引擎就可以知道在你的网站中哪些文件是可以被索引的,哪些文件是被拒绝索引的,我们就可以很方便地控制搜索索引网站内容了。

robots.txt文件的作用:

1、屏蔽网站内的死链接。2、屏蔽搜索引擎蜘蛛抓取站点内重复内容和页面。3、阻止搜索引擎索引网站隐私性的内容。

因此建立robots.txt文件是很有必要的,网站中重复的内容、页面或者404信息过多,搜索引擎蜘蛛就会认为该网站价值较低,从而降低对该网站的“印象分”,这就是我们经常听到的“降低权重”,这样网站的排名就不好了。

robots.txt文件需要注意的最大问题是:必须放置在一个站点的根目录下,而且文件名必须全部小写。

robots.txt文件的基本语法只有两条,第一条是:User-agent,即搜索引擎蜘蛛的名称;第二条是:Disallow,即要拦截的部分。

2、使用方法: 网址/robots.txt

3、举例

 

九、 Post 请求网页的方法 (带上密码账号进行模拟账号登录)

1、使用 Post 方法,带上账号,密码,模拟登录这个网页

(https://www.woyaogexing.com/e/member/login/)

 

2、在网页上鼠标右键,点击审查元素(360浏览器),找到登录执行的action 为 doaction.php

 

3、执行一次登录后,审查元素-Network 监控下找到 doaction.php (请勾上 Preserver log,不然这信息可能被冲掉),即可找打登陆时候的 Post 网址

 

4、往下拉,即可找到 post 所携带的数据

 

5、编写代码,模拟登录,下面模拟登录的结果

 

6、关键代码

  1. # 引入模块
  2. import requests
  3. def PostFun(url, data):
  4. '''
  5. Post 带参数的请求
  6. :param url: 网址
  7. :param data: 数据
  8. :return: 返回网页
  9. '''
  10. # verify=False 不做 ssl 校验,避免这里报错
  11. rspHtml = requests.post(url, data=data, verify=False)
  12. return rspHtml
  13. if __name__=="__main__":
  14. data = {
  15. "ecmsfrom": "",
  16. "enews": "login",
  17. "tobind": "0",
  18. "useraccount": "你的账号",
  19. "password": "你的密码"
  20. }
  21. # 我要个性网 Post 登录(账号密码要正确,才能正确登陆)
  22. url = "https://www.woyaogexing.com/e/member/doaction.php"
  23. print(PostFun(url, data).text)

 

十、带 cookie 访问网址的方法(可以模拟登陆(前提 cookie 别过期))

Cookie的诞生

由于HTTP协议是无状态的,而服务器端的业务必须是要有状态的。Cookie诞生的最初目的是为了存储web中的状态信息,以方便服务器端使用。比如判断用户是否是第一次访问网站。目前最新的规范是RFC 6265,它是一个由浏览器服务器共同协作实现的规范。

 

Cookie的处理分为:

服务器像客户端发送cookie

浏览器将cookie保存

之后每次http请求浏览器都会将cookie发送给服务器端

 

发送cookie

服务器端像客户端发送Cookie是通过HTTP响应报文实现的,在Set-Cookie中设置需要像客户端发送的cookie

 

1、网页的 cookies

 

2、编写代码,使用 cookie 访问网址(模拟登录(前提 cookie 别过期))

 

3、关键代码

  1. # 引入模块
  2. import requests
  3. def GetFunWithCookies(url, cookies):
  4. '''
  5. 携带 cookies 进行 get 访问
  6. :param url:
  7. :param cookies:
  8. :return:
  9. '''
  10. # verify=False 不做 ssl 校验,避免这里报错
  11. return requests.get(url, cookies=cookies, verify=False)
  12. def TestCookies():
  13. '''
  14. 测试函数
  15. :return:
  16. '''
  17. cookies = {
  18. "__cfduid": "d5d1b0f74599a556282e07bda23c3128b1599550080",
  19. "__guid": "48016033.483883114264907200.1599550080878.4275",
  20. "BAIDU_SSP_lcr":"https://www.so.com/link?m:bkvL9D%2BLGY%2BI1xO3eylp5AddRvnK17pTqfyOZiUZUgIBnCXawjjzRVibRsnyKbXAQ%2BJpifsMaM86eNvxgEps%2BLfLovNJvycoNIZ49Z5FSvEPzPG2wiJ%2Bn7KgHdraNKh4RukR4TZXHWSv2yV4XjDkyKg%3D%3D",
  21. "Hm_lvt_a077b6b44aeefe3829d03416d9cb4ec3":"1599550082",
  22. "PHPSESSID": "r70rup3mvbiomm335i0vtqebk1",
  23. "__gads": "ID=1863ac2ebe3a9b7c-22b7c8bc5dc30091:T=1599552096:RT=1599552096:S=ALNI_Ma5FbMbmeCyegUTXmDRVHEwJE0P4Q",
  24. "Hm_lpvt_a077b6b44aeefe3829d03416d9cb4ec3": "1599553139",
  25. "gqbcemlusername": "wygx_71891",
  26. "gqbcemluserid": "1446972",
  27. "gqbcemlgroupid": "1",
  28. "gqbcemlrnd": "1yeG84WXt7F0gZlfonef",
  29. "gqbcemlauth": "4825ee2be14a5307bacf50bc190e5977",
  30. "monitor_count": "23"
  31. }
  32. url = "https://www.woyaogexing.com"
  33. html = GetFunWithCookies(url, cookies)
  34. print(html)
  35. print(html.content.decode("utf-8"))
  36. if __name__=="__main__":
  37. TestCookies()