热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

资深程序员总结出完美Python爬虫基础,爬虫入门必备

往期好文推荐学习Python不需要程基础?0基础不用怕,从0到1轻松教你入门Python这篇文章给大家简单总结一下Python爬虫基础,

往期好文推荐
学习Python不需要程基础?

0基础不用怕,从0到1轻松教你入门Python
图片.png

这篇文章给大家简单总结一下Python爬虫基础,毕竟很多时候要自己爬数据。私信小编资料即可自动获取Python学习资料!视频教程以及各类PDF!

Python爬虫简介

爬虫是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。通过使用爬虫计算我们可以轻松快速的获取我们所需要的信息,python作为脚本语言可以通过少量的代码即可编写网络爬虫。在为大家介绍编写爬虫脚本的常用工具库之前先为大家介绍一些前端的基础知识。

基础知识

网页前端的三要素是HTML+CSS+Javascript,其中HTML中有网页大量的信息,因此爬虫主要是抓取和解析网页的HTML。

HTML是用来描述超文本的一门标记语言,我们日常中所看到的网页界面只不过是浏览器通过将特定格式的字符串进行解析使我们看到一个可视化的具有一定格式的界面,但是其实质上就是一堆格式化的字符串。我们爬虫所要提取的内容就是根据需求筛选出特定的目的信息。CSS也被称为样式文件,其作用就是规定显示的诸如边界颜色等格式。

Javascript作为一门脚本语言在网页前端起到的是逻辑控制的功能,比如动态的显示数据进行异步请求或者表单验证等等。

COOKIEs是服务器返回给浏览器的一组信息,目的是为了可以追踪识别用户。Session保存在服务器内存中用于跟踪会话,它和COOKIE的生存周期不一样,当会话结束后Session的生存周期就结束了,但是Cooikes有着更长的生存周期,因此我们经常通过保存COOKIEs使得我们的爬虫保存登录状态。

requests库

爬虫的策略有很多种,比较常用的就是使用requests爬取,然后交给BeautifulSoup库进行解析。这种策略可以抓取绝大部分的网页,但无法抓取js渲染的网页,因为Python只能通过HTTP请求获取到HTML、CSS、JS原始代码而已。

提交请求

HTTP请求类型有:GET、POST、PUT、DELETE、HEAD以及OPTIONS六种,我们一般会用到的只有GET和POST这两种。我们可以通过以下代码即可爬取网页的HTML


import requests



导入requests>>> response = requests.get(‘https://www.baidu.com’)

当然以上是最简单的网络请求,我们还可以通过params关键字传入更多的参数提交更复杂的请求


params = {‘wd’:‘requests’}
response = requests.get(‘https://www.baidu.com/s’,params = params)


如上所示实际上我们访问的URL为https://www.baidu.com/s?wd=requests,用浏览器打开这个网页你会发现我们在百度上搜索requests关键字,因为get方法是通过URL访问网页,get方法会把传给params的参数组装成新的url进行访问。

有些时候我们希望给我们的请求定制请求头,这是我们可以通过传入一个字典给headers参数即可,类似的,像是COOKIEs和proxy(代理服务器)等参数均是接受一个字典作为参数。


headers = {‘user-agent’: ‘my-app/0.0.1’}
response = requests.get(url, headers=headers)


除此以外,我们还可以传入timeout参数告诉 requests 在经过以 timeout 参数设定的秒数时间之后停止等待响应。

post方法主要用于提交网页表单,他通过传入data参数提交数据,例子如下


response = requests.post(url, data=data) #data为要提交的信息


Post方法使用起来比较复杂,首先你需要找到真正的请求服务器,并且根据它的请求主体编写请求。

响应内容

get和post方法返回response对象,它是网页的响应内容,并且我们可以根据它返回的内容用合适的方法对它进行解析。例如


response.text



解析为文本


response.content



解析为二进制


response.json()



解析为json格式

并且在解析为文本的时候我们还可以指定字符编码来解析,通常使用网页指定的编码


response.encoding = response.apparent_encoding


但是我们的请求不一定总会成功有些时候可能会出点差错,我们可以通过response.stauts_code获取服务器返回的状态码,状态码200为响应成功。如果网页没能正确的响应,我们可以response.raise_for_status()抛出异常。

BeautifulSoup

BeautifulSoup是一个用于解析网页的第三方库,它提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。并且它自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式。

现在Beautiful Soup已成为和lxml、html6lib一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。


from bs4 import BeautifulSoup>>> Soup = BeautifulSoup(“data”)


下表列出了主要的解析器,以及它们的优缺点:

推荐使用lxml作为解析器,因为效率更高. 在Python2.7.3之前的版本和Python3中3.2.2之前的版本,必须安装lxml或html5lib, 因为那些Python版本的标准库中内置的HTML解析方法不够稳定.

BeautifulSoup使用方法

由于我们只是使用BeautifulSoup对爬取的网页进行解析,因此我们只需掌握如何查找我们想要的内容即可,其中find_all是我们最常用的方法,我们通过传递不同的过滤器,使得find_all以不同的方式来查找我们想要的内容。例如以下代码查找文档中所有的标签并以列表的形式返回

Soup.find_all(‘b’)

有些时候我们并不希望完全匹配,这是我们可以使用正则表达式。我们使用以下的代码就可以匹配以b开头的表情

Soup.find_all(re.compile("^b"))

我们还可以传入一个函数进行查找,例如一下代码可以返回含有class但不含id属性的标签。

def has_class_but_no_id(tag):
return tag.has_attr('class') and not tag.has_attr('id')Soup.find_all(has_class_but_no_id)

更一般的,find_all()函数的参数如下

find_all( name , attrs , recursive , text , **kwargs )

name是标签的名字,kwargs可以传入描述标签的属性。例如一下代码查找了标签名为a,含有属性id且值为’link2’的标签。

soup.find_all('a',id='link2')

需要注意的是,class是python中的保留字,所以我们可以通过 class_ 参数搜索有指定CSS类名的tag。

我们还可以指定text参数按照标签的文本进行查找,并且在我们不需要全部结果的时候,我们可以通过设定limit参数限制返回的数量以减少搜索的时间。

如果你熟悉CSS选择器的话,你还可以使用Soup.select()方法。

Selenium+PhantomJS

Selenium是一个用于Web应用程序测试的工具,同时我们可以使用它来模拟真实浏览器对URL进行访问从而对网页进行爬取。Selenium的往往要配合PhantomJS使用,PhantomJS是一个无界面的,可脚本编程的WebKit浏览器引擎。Selenium+PhantomJS可以抓取那些使用JS加载数据的网页。你可以试着使用requests去抓取B站首页,你会发现,你抓取不到那些具体的视频名称及链接,但是我们可以通过以下代码抓取

from selenium import webdriverdriver = webdriver.PhantomJS()
driver.get('https://www.bilibili.com')
html = driver.page_source

在获取完全加载的网页源码后,你可以使用BeautifulSoup对网页进行进一步的解析。

有些时候网页的一些内容需要浏览器执行特定操作的时候才会更新。常刷微博的朋友应该知道,将滚动条拖到底部,浏览器才会继续刷出新的微博,我们可以让我们的浏览器执行一段脚本实现这么一种操作。

js="var q=document.documentElement.scrollTop=10000"driver.execute_script(js)

如果说有需要执行特定的点击或者输入操作的话,我们可以先查找这些元素再调用其他方法。Selenium提供了很多的方法用来选取元素,例如通过类名、id等属性等等,但最快速的方法是使用CSS选择器进行选取

driver.find_element_by_class_name()
# 通过类名 driver.find_element_by_id()
# 通过id driver.find_element_by_css_selector()
# 通过css选择器

具体的使用方法,可以在w3school查看

最后在爬取之前,我们需要配置我们的无头浏览器,否则很容易被服务器识别出机器人,

from selenium.webdriver.common.desired_capabilities import DesiredCapabilitiesdcap = dict(DesiredCapabilities.PHANTOMJS)dcap["phantomjs.page.settings.userAgent"] = user_agent
# user_agent太长就不打出来了,在浏览器>开发者工具>网络的具体请求中可以查到,dcap["phantomjs.pa

私信小编资料即可自动获取Python学习资料!视频教程以及各类PDF!


推荐阅读
  • 深入理解:AJAX学习指南
    本文详细探讨了AJAX的基本概念、工作原理及其在现代Web开发中的应用,旨在为初学者提供全面的学习资料。 ... [详细]
  • 本文介绍了.hbs文件作为Ember.js项目中的视图层,类似于HTML文件的功能,并详细讲解了如何在Ember.js应用中集成Bootstrap框架及其相关组件的方法。 ... [详细]
  • 本文探讨了如何通过优化 DOM 操作来提升 JavaScript 的性能,包括使用 `createElement` 函数、动画元素、理解重绘事件及处理鼠标滚动事件等关键主题。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • publicclassBindActionextendsActionSupport{privateStringproString;privateStringcitString; ... [详细]
  • 本文详细介绍了JQuery Mobile框架中特有的事件和方法,帮助开发者更好地理解和应用这些特性,提升移动Web开发的效率。 ... [详细]
  • 本文介绍了如何通过C#语言调用动态链接库(DLL)中的函数来实现IC卡的基本操作,包括初始化设备、设置密码模式、获取设备状态等,并详细展示了将TextBox中的数据写入IC卡的具体实现方法。 ... [详细]
  • 本文将从基础概念入手,详细探讨SpringMVC框架中DispatcherServlet如何通过HandlerMapping进行请求分发,以及其背后的源码实现细节。 ... [详细]
  • 如何在PHP中安装Xdebug扩展
    本文介绍了如何从PECL下载并编译安装Xdebug扩展,以及如何配置PHP和PHPStorm以启用调试功能。 ... [详细]
  • 深入探讨前端代码优化策略
    本文深入讨论了前端开发中代码优化的关键技术,包括JavaScript、HTML和CSS的优化方法,旨在提升网页加载速度和用户体验。 ... [详细]
  • 解决JavaScript中法语字符排序问题
    在开发一个使用JavaScript、HTML和CSS的Web应用时,遇到从SQLite数据库中提取的法语词汇排序不正确的问题,特别是带重音符号的字母未按预期排序。 ... [详细]
  • 理解浏览器历史记录(2)hashchange、pushState
    阅读目录1.hashchange2.pushState本文也是一篇基础文章。继上文之后,本打算去研究pushState,偶然在一些信息中发现了锚点变 ... [详细]
  • Windows操作系统提供了Encrypting File System (EFS)作为内置的数据加密工具,特别适用于对NTFS分区上的文件和文件夹进行加密处理。本文将详细介绍如何使用EFS加密文件夹,以及加密过程中的注意事项。 ... [详细]
  • 回顾两年前春节期间的一个个人项目,该项目原本计划参加竞赛,但最终作为练习项目完成。独自完成了从编码到UI设计的全部工作,尽管代码量不大,但仍有一定的参考价值。本文将详细介绍该项目的背景、功能及技术实现。 ... [详细]
  • 本文探讨了在一个物理隔离的环境中构建数据交换平台所面临的挑战,包括但不限于数据加密、传输监控及确保文件交换的安全性和可靠性。同时,作者结合自身项目经验,分享了项目规划、实施过程中的关键决策及其背后的思考。 ... [详细]
author-avatar
雪儿2602915015
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有