首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

Python入门网络爬虫之精华版

后端 2.03MB 19 需要积分: 1
立即下载

资源介绍:

Python学习网络爬虫主要分3个大的版块:抓取,分析,存储 简单来说这段过程发生了以下四个步骤: 查找域名对应的IP地址。 向IP对应的服务器发送请求。 服务器响应请求,发回网页内容。 浏览器解析网页内容。 网络爬虫要做的,简单来说,就是实现浏览器的功能。通过指定url,直接返回给用户所需要的数据,而不需要一步步人工去操纵浏览器获取。
# [Python入门网络爬虫之精华版](https://github.com/lining0806/PythonSpiderNotes) *** Python学习网络爬虫主要分3个大的版块:**抓取**,**分析**,**存储** 另外,比较常用的爬虫框架[Scrapy](http://scrapy.org/),这里最后也详细介绍一下。 首先列举一下本人总结的相关文章,这些覆盖了入门网络爬虫需要的基本概念和技巧:[宁哥的小站-网络爬虫](http://www.lining0806.com/category/spider/) *** 当我们在浏览器中输入一个url后回车,后台会发生什么?比如说你输入[http://www.lining0806.com/](http://www.lining0806.com/),你就会看到宁哥的小站首页。 简单来说这段过程发生了以下四个步骤: * 查找域名对应的IP地址。 * 向IP对应的服务器发送请求。 * 服务器响应请求,发回网页内容。 * 浏览器解析网页内容。 网络爬虫要做的,简单来说,就是实现浏览器的功能。通过指定url,直接返回给用户所需要的数据,而不需要一步步人工去操纵浏览器获取。 ## 抓取 这一步,你要明确要得到的内容是什么?是HTML源码,还是Json格式的字符串等。 #### 1. 最基本的抓取 抓取大多数情况属于get请求,即直接从对方服务器上获取数据。 首先,Python中自带urllib及urllib2这两个模块,基本上能满足一般的页面抓取。另外,[requests](https://github.com/kennethreitz/requests)也是非常有用的包,与此类似的,还有[httplib2](https://github.com/jcgregorio/httplib2)等等。 ``` Requests: import requests response = requests.get(url) content = requests.get(url).content print "response headers:", response.headers print "content:", content Urllib2: import urllib2 response = urllib2.urlopen(url) content = urllib2.urlopen(url).read() print "response headers:", response.headers print "content:", content Httplib2: import httplib2 http = httplib2.Http() response_headers, content = http.request(url, 'GET') print "response headers:", response_headers print "content:", content ``` 此外,对于带有查询字段的url,get请求一般会将来请求的数据附在url之后,以?分割url和传输数据,多个参数用&连接。 ``` data = {'data1':'XXXXX', 'data2':'XXXXX'} Requests:data为dict,json import requests response = requests.get(url=url, params=data) Urllib2:data为string import urllib, urllib2 data = urllib.urlencode(data) full_url = url+'?'+data response = urllib2.urlopen(full_url) ``` 相关参考:[网易新闻排行榜抓取回顾](http://www.lining0806.com/%E7%BD%91%E6%98%93%E6%96%B0%E9%97%BB%E6%8E%92%E8%A1%8C%E6%A6%9C%E6%8A%93%E5%8F%96%E5%9B%9E%E9%A1%BE/) 参考项目:[网络爬虫之最基本的爬虫:爬取网易新闻排行榜](https://github.com/lining0806/PythonSpiderNotes/blob/master/NewsSpider) ### 2. 对于登陆情况的处理 **2.1 使用表单登陆** 这种情况属于post请求,即先向服务器发送表单数据,服务器再将返回的cookie存入本地。 ``` data = {'data1':'XXXXX', 'data2':'XXXXX'} Requests:data为dict,json import requests response = requests.post(url=url, data=data) Urllib2:data为string import urllib, urllib2 data = urllib.urlencode(data) req = urllib2.Request(url=url, data=data) response = urllib2.urlopen(req) ``` **2.2 使用cookie登陆** 使用cookie登陆,服务器会认为你是一个已登陆的用户,所以就会返回给你一个已登陆的内容。因此,需要验证码的情况可以使用带验证码登陆的cookie解决。 ``` import requests requests_session = requests.session() response = requests_session.post(url=url_login, data=data) ``` 若存在验证码,此时采用response = requests_session.post(url=url_login, data=data)是不行的,做法应该如下: ``` response_captcha = requests_session.get(url=url_login, cookies=cookies) response1 = requests.get(url_login) # 未登陆 response2 = requests_session.get(url_login) # 已登陆,因为之前拿到了Response Cookie! response3 = requests_session.get(url_results) # 已登陆,因为之前拿到了Response Cookie! ``` 相关参考:[网络爬虫-验证码登陆](http://www.lining0806.com/6-%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB-%E9%AA%8C%E8%AF%81%E7%A0%81%E7%99%BB%E9%99%86/) 参考项目:[网络爬虫之用户名密码及验证码登陆:爬取知乎网站](https://github.com/lining0806/PythonSpiderNotes/blob/master/ZhihuSpider) ### 3. 对于反爬虫机制的处理 **3.1 使用代理** 适用情况:限制IP地址情况,也可解决由于“频繁点击”而需要输入验证码登陆的情况。 这种情况最好的办法就是维护一个代理IP池,网上有很多免费的代理IP,良莠不齐,可以通过筛选找到能用的。对于“频繁点击”的情况,我们还可以通过限制爬虫访问网站的频率来避免被网站禁掉。 ``` proxies = {'http':'http://XX.XX.XX.XX:XXXX'} Requests: import requests response = requests.get(url=url, proxies=proxies) Urllib2: import urllib2 proxy_support = urllib2.ProxyHandler(proxies) opener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler) urllib2.install_opener(opener) # 安装opener,此后调用urlopen()时都会使用安装过的opener对象 response = urllib2.urlopen(url) ``` **3.2 时间设置** 适用情况:限制频率情况。 Requests,Urllib2都可以使用time库的sleep()函数: ``` import time time.sleep(1) ``` **3.3 伪装成浏览器,或者反“反盗链”** 有些网站会检查你是不是真的浏览器访问,还是机器自动访问的。这种情况,加上User-Agent,表明你是浏览器访问即可。有时还会检查是否带Referer信息还会检查你的Referer是否合法,一般再加上Referer。 ``` headers = {'User-Agent':'XXXXX'} # 伪装成浏览器访问,适用于拒绝爬虫的网站 headers = {'Referer':'XXXXX'} headers = {'User-Agent':'XXXXX', 'Referer':'XXXXX'} Requests: response = requests.get(url=url, headers=headers) Urllib2: import urllib, urllib2 req = urllib2.Request(url=url, headers=headers) response = urllib2.urlopen(req) ``` ### 4. 对于断线重连 不多说。 ``` def multi_session(session, *arg): retryTimes = 20 while retryTimes>0: try: return session.post(*arg) except: print '.', retryTimes -= 1 ``` 或者 ``` def multi_open(opener, *arg): retryTimes = 20 while retryTimes>0: try: return opener.open(*arg) except: print '.', retryTimes -= 1 ``` 这样我们就可以使用multi_session或multi_open对爬虫抓取的session或opener进行保持。 ### 5. 多进程抓取 这里针对[华尔街见闻](http://live.wallstreetcn.com/ )进行并行抓取的实验对比:[Python多进程抓取](https://github.com/lining0806/PythonSpiderNotes/blob/master/Spider_Python) 与 [Java单线程和多线程抓取](https://github.com/lining0806/PythonSpiderNotes/blob/master/Spider_Java) 相关参考:[关于Python和Java的多进程多线程计算方法对比](http://www.lining0806.com/%E5%85%B3%E4%BA%8Epython%E5%92%8Cjava%E7%9A%84%E5%A4%9A%E8%BF%9B%E7%A8%8B%E5%A4%9A%E7%BA%BF%E7%A8%8B%E8%AE%A1%E7%AE%97%E6%96%B9%E6%B3%95%E5%AF%B9%E6%AF%94/) ### 6. 对于Ajax请求的处理 对于“加载更多”情况,使用Ajax来传输很多数据。 它的工作原理是:从网页的url加载网页的源代码之后,会在浏览器里执行JavaScript程序。这些程序会加载更多的内容,“填充”到网页里。这就是为什么如果你直接去爬网页本身的url,你会找不到页面的实际内容。 这里,若使用Google Chrome分析”请求“对应的链接(方法:右键→审查元素→Network→清空,点击”加载更多“,出现对应的GET链接寻找Type为text/html的,点击,查看get参数或者复制Request URL),循环过程。 * �

资源文件列表:

88.zip 大约有98个文件
  1. 88/
  2. 88/Captcha1/
  3. 88/Captcha1/!Test.bat 50B
  4. 88/Captcha1/ReadMe.md 1.31KB
  5. 88/Captcha1/convert.exe 198KB
  6. 88/Captcha1/pic/
  7. 88/Captcha1/pic/fnord.tif 1.38KB
  8. 88/Captcha1/pic/get_price_img.png 2.76KB
  9. 88/Captcha1/pic/get_price_img1.png 2.9KB
  10. 88/Captcha1/pic/get_price_img1_binary.png 352B
  11. 88/Captcha1/pic/get_price_img2.png 2.8KB
  12. 88/Captcha1/pic/get_price_img2_binary.png 352B
  13. 88/Captcha1/pic/get_price_img_binary.png 355B
  14. 88/Captcha1/pic/get_random.jpg 17.23KB
  15. 88/Captcha1/pic/get_random1.jpg 17.23KB
  16. 88/Captcha1/pic/get_random1_binary.png 684B
  17. 88/Captcha1/pic/get_random1_binary_midu.png 408B
  18. 88/Captcha1/pic/get_random1_binary_midu_pro1.png 371B
  19. 88/Captcha1/pic/get_random2.jpg 17.23KB
  20. 88/Captcha1/pic/get_random2_binary.png 675B
  21. 88/Captcha1/pic/get_random2_binary_midu.png 429B
  22. 88/Captcha1/pic/get_random2_binary_midu_pro1.png 377B
  23. 88/Captcha1/pic/get_random_binary.png 701B
  24. 88/Captcha1/pic/get_random_binary_midu.png 396B
  25. 88/Captcha1/pic/get_random_binary_midu_pro1.png 351B
  26. 88/Captcha1/pytesser_pro/
  27. 88/Captcha1/pytesser_pro/__init__.py
  28. 88/Captcha1/pytesser_pro/errors.py 424B
  29. 88/Captcha1/pytesser_pro/pytesser_pro.py 2.69KB
  30. 88/Captcha1/pytesser_pro/util.py 669B
  31. 88/Captcha1/tess_test.py 6.99KB
  32. 88/Captcha1/tesseract.exe 1.9MB
  33. 88/NewsSpider/
  34. 88/NewsSpider/NewsSpider.py 2.08KB
  35. 88/NewsSpider/ReadMe.md 316B
  36. 88/QunarSpider/
  37. 88/QunarSpider/QunarSpider.py 4.78KB
  38. 88/QunarSpider/ReadMe.md 279B
  39. 88/ReadMe.md 12.19KB
  40. 88/Spider_Java/
  41. 88/Spider_Java/README.md 141B
  42. 88/Spider_Java/Spider_Java1/
  43. 88/Spider_Java/Spider_Java1/.classpath 300B
  44. 88/Spider_Java/Spider_Java1/.project 365B
  45. 88/Spider_Java/Spider_Java1/bin/
  46. 88/Spider_Java/Spider_Java1/bin/synchronizetest/
  47. 88/Spider_Java/Spider_Java1/bin/synchronizetest/Booth.class 1.58KB
  48. 88/Spider_Java/Spider_Java1/bin/synchronizetest/Reservoir.class 476B
  49. 88/Spider_Java/Spider_Java1/bin/synchronizetest/Test.class 674B
  50. 88/Spider_Java/Spider_Java1/bin/wallstreetcnsave/
  51. 88/Spider_Java/Spider_Java1/bin/wallstreetcnsave/WallstreetcnSaveTest.class 9.31KB
  52. 88/Spider_Java/Spider_Java1/lib/
  53. 88/Spider_Java/Spider_Java1/lib/mongo-java-driver-2.13.0-rc1.jar 590.21KB
  54. 88/Spider_Java/Spider_Java1/src/
  55. 88/Spider_Java/Spider_Java1/src/synchronizetest/
  56. 88/Spider_Java/Spider_Java1/src/synchronizetest/Test.java 1.7KB
  57. 88/Spider_Java/Spider_Java1/src/wallstreetcnsave/
  58. 88/Spider_Java/Spider_Java1/src/wallstreetcnsave/WallstreetcnSaveTest.java 7.2KB
  59. 88/Spider_Java/Spider_Java2/
  60. 88/Spider_Java/Spider_Java2/.classpath 300B
  61. 88/Spider_Java/Spider_Java2/.project 382B
  62. 88/Spider_Java/Spider_Java2/bin/
  63. 88/Spider_Java/Spider_Java2/bin/synchronizetest/
  64. 88/Spider_Java/Spider_Java2/bin/synchronizetest/Booth.class 1.58KB
  65. 88/Spider_Java/Spider_Java2/bin/synchronizetest/Reservoir.class 476B
  66. 88/Spider_Java/Spider_Java2/bin/synchronizetest/Test.class 674B
  67. 88/Spider_Java/Spider_Java2/bin/wallstreetcnsave/
  68. 88/Spider_Java/Spider_Java2/bin/wallstreetcnsave/GetrequestUrl.class 1.04KB
  69. 88/Spider_Java/Spider_Java2/bin/wallstreetcnsave/WallstreetcnSave.class 9.95KB
  70. 88/Spider_Java/Spider_Java2/bin/wallstreetcnsave/WallstreetcnSaveTest.class 893B
  71. 88/Spider_Java/Spider_Java2/lib/
  72. 88/Spider_Java/Spider_Java2/lib/mongo-java-driver-2.13.0-rc1.jar 590.21KB
  73. 88/Spider_Java/Spider_Java2/src/
  74. 88/Spider_Java/Spider_Java2/src/synchronizetest/
  75. 88/Spider_Java/Spider_Java2/src/synchronizetest/Test.java 1.78KB
  76. 88/Spider_Java/Spider_Java2/src/wallstreetcnsave/
  77. 88/Spider_Java/Spider_Java2/src/wallstreetcnsave/WallstreetcnSaveTest.java 10.38KB
  78. 88/Spider_Python/
  79. 88/Spider_Python/README.md 100B
  80. 88/Spider_Python/WallstreetcnSaveTest.py 5.53KB
  81. 88/WechatSearchProjects/
  82. 88/WechatSearchProjects/README.md 326B
  83. 88/WechatSearchProjects/Spider_Main.py 775B
  84. 88/WechatSearchProjects/WechatSearchTest.py 3.72KB
  85. 88/WechatSearchProjects/Wechatproject/
  86. 88/WechatSearchProjects/Wechatproject/Wechatproject/
  87. 88/WechatSearchProjects/Wechatproject/Wechatproject/__init__.py
  88. 88/WechatSearchProjects/Wechatproject/Wechatproject/items.py 335B
  89. 88/WechatSearchProjects/Wechatproject/Wechatproject/pipelines.py 3.55KB
  90. 88/WechatSearchProjects/Wechatproject/Wechatproject/settings.py 868B
  91. 88/WechatSearchProjects/Wechatproject/Wechatproject/spiders/
  92. 88/WechatSearchProjects/Wechatproject/Wechatproject/spiders/__init__.py 161B
  93. 88/WechatSearchProjects/Wechatproject/Wechatproject/spiders/spider.py 3.07KB
  94. 88/WechatSearchProjects/Wechatproject/scrapy.cfg 268B
  95. 88/ZhihuSpider/
  96. 88/ZhihuSpider/ReadMe.md 481B
  97. 88/ZhihuSpider/ZhihuSpider.py 2.1KB
  98. 88/ZhihuSpider/config.ini 153B
0评论
提交 加载更多评论
其他资源 智能车仿真软件racecar-master
bug汇总 报错controllers相关 sudo apt-get install ros-kinetic-controller-manager sudo apt-get install ros-kinetic-gazebo-ros-control sudo apt-get install ros-kinetic-effort-controllers sudo apt-get install ros-kinetic-joint-state-controller 报错driver_base相关 sudo apt-get install ros-kinetic-driver-base 报错rtabmap相关 sudo apt-get install ros-kinetic-rtabmap-ros 报错ackermann_msgs相关 sudo apt-get install ros-kinetic-ackermann-msgs 报错findline.cpp找不到opencv头文件 执行:locate OpenCVConfig.cmake得到你的opencv的路径
ACM-ICPC 备战指南
先决条件: 了解至少一种编程语言。(你必须能够有效地使用该语言。) 这个知识库的理念是将结构良好的内容分成几个部分,这样即使很忙也可以跟上。在这里,我们收集了我们认为可以很好地学习所提主题的资源。课程有不同的数据结构和算法。 预计一周所需时间为6-7小时。(在规定时间内完成课程) 基本使用指南: 使用此存储库取决于用户想要用它做什么。我们为那些想要在继续​​学习的同时慢慢掌握主题知识的人提供以下建议: 根据个人喜好,查看针对特定主题提供的书面或视频资源。查看尽可能多的资源,以更好地理解该主题。 不检查源代码,尝试自己复制算法或数据结构。 当遇到困难或完成时,请查看提供的源代码,并将其与您的代码进行比较,以查看可能的错误。尝试修复它。 当您对代码感到满意后,尝试解决给定的问题。 当您完成解决问题或在某个时候遇到困难时,请检查给出的解决方案并尝试理解您的错误或查看是否存在更好的方法。
Objective-C 的模拟对象
使用 OCMock – 简短版本 为实例和类方法创建存根 模拟对象代表真实对象。使用存根,我们可以指定调用方法时要返回的内容: // create a mock for the user defaults id userDefaultsMock = OCMClassMock([NSUserDefaults class]); // set it up to return a specific value when stringForKey: is called OCMStub([userDefaultsMock stringForKey:@"MyAppURLKey"]).andReturn(@"http://testurl"); // set it up to return the specified value no matter how the method is invoked OCMStub([userDefaultsMock stringForKey:[OCMArg any]]).andReturn(@"http://testurl");
Docker 官方镜像打包 PHP
简短版本:“简单标签”通常是一个单一平台(Windows 与 Linux),而“共享标签”是多个平台的组合(因此根据它们运行的​​平台可能会有很大不同的界面/行为,但总体上应该代表大致相同的东西)。 Dockerfile一些图像在“支持的标签和相应的链接”下分离了“简单标签”和“共享标签”部分。 “简单标记”是“单个”Linux 或 Windows 映像的实例。它通常是一个清单列表,可以包含为其他体系结构构建的相同映像;例如,mongo:4.0-xenial目前有amd64和 的映像arm64v8。Docker 守护程序负责为主机体系结构选择合适的映像。 “共享标签”是始终指向清单列表的标签,该清单列表包括所有各自映像架构中 Windows 和 Linux 映像的潜在多个版本的组合 - 在示例中mongo,4.0标签是一个共享标签,由(在撰写本文时)所有4.0-xenial、4.0-windowsservercore-ltsc2016、4.0-windowsservercore-1709和组成4.0-windowsservercore-1803。
Swift 高性能系统编程语言
Swift 是一种高性能系统编程语言。它具有简洁而现代的语法,可以无缝访问现有的 C 和 Objective-C 代码和框架,并且默认情况下是内存安全的。 尽管 Swift 受到 Objective-C 和许多其他语言的启发,但它本身并不是 C 语言的衍生语言。作为一门完整而独立的语言,Swift 将流控制、数据结构和函数等核心功能与对象、协议、闭包和泛型等高级结构打包在一起。Swift 拥抱模块,消除了对标头及其所包含的代码重复的需求。
Frontend Workshop from HTML/CSS/JS to TypeScript/React/Redux
Installing and opening the project Open VS Code and then press ctrl + ` (backtick, in top left corner of keyboard) to open the built-in terminal Use the cd (change directory) command to find an appropriate place for your code Type git clone https://github.com/Microsoft/frontend-bootcamp.git into the terminal to pull down a copy of the workshop code Type cd frontend-bootcamp to change your current directory to the bootcamp folder Type npm install to install all of the project dependencies Type
LeetCode算法题典
最全的LeetCode算法题典
微人事是一个前后端分离的人力资源管理系统,项目采用SpringBoot+Vue开发
快速部署 clone 项目到本地 git@github.com:lenve/vhr.git 数据库脚本使用 Flyway 管理,不需要手动导入数据库脚本,只需要提前在本地 MySQL 中创建一个空的数据库 vhr,并修改项目中关于数据的配置(resources 目录下的 application.properties 文件中)即可 提前准备好 Redis,在 项目的 application.properties 文件中,将 Redis 配置改为自己的 提前准备好 RabbitMQ,在项目的 application.properties 文件中将 RabbitMQ 的配置改为自己的(注意,RabbitMQ 需要分别修改 mailserver 和 vhrserver 的配置文件) 在 IntelliJ IDEA 中打开 vhr 项目,启动 mailserver 模块 运行 vhrserver 中的 vhr-web 模块 OK,至此,服务端就启动成功了,此时我们直接在地址栏输入 http://localhost:8081/index.html 即可访问我们的项目