热门标签 | 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!


推荐阅读
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • HTTP(超文本传输协议)是互联网上用于客户端和服务器之间交换数据的主要协议。本文详细介绍了HTTP的工作原理,包括其请求-响应机制、不同版本的发展历程以及HTTP数据包的具体结构。 ... [详细]
  • 利用Cookie实现用户登录状态的持久化
    本文探讨了如何使用Cookie技术在Web应用中实现用户登录状态的持久化,包括Cookie的基本概念、优势及主要操作方法,并通过一个简单的Java Web项目示例展示了具体实现过程。 ... [详细]
  • 本文详细介绍了如何在Android应用中处理和使用Cookie,包括登录时获取Cookie并将其存储,以及在WebView中同步这些Cookie以保持用户会话。 ... [详细]
  • C#爬虫Fiddler插件开发自动生成代码
    哈喽^_^一般我们在编写网页爬虫的时候经常会使用到Fiddler这个工具来分析http包,而且通常并不是分析一个包就够了的,所以为了把更多的时间放在分析http包上,自动化生成 ... [详细]
  • 本文介绍了 Confluence 6 中使用的其他 Cookie,这些 Cookie 主要用于存储产品的基本持久性和用户偏好设置,以提升用户体验。 ... [详细]
  • Cookie学习小结
    Cookie学习小结 ... [详细]
  • 本文介绍了如何利用HTTP隧道技术在受限网络环境中绕过IDS和防火墙等安全设备,实现RDP端口的暴力破解攻击。文章详细描述了部署过程、攻击实施及流量分析,旨在提升网络安全意识。 ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • Python + Pytest 接口自动化测试中 Token 关联登录的实现方法
    本文将深入探讨 Python 和 Pytest 在接口自动化测试中如何实现 Token 关联登录,内容详尽、逻辑清晰,旨在帮助读者掌握这一关键技能。 ... [详细]
  • 本文详细探讨了在微服务架构中,使用Feign进行远程调用时出现的请求头丢失问题,并提供了具体的解决方案。重点讨论了单线程和异步调用两种场景下的处理方法。 ... [详细]
  • 本文详细介绍了JSP(Java Server Pages)的九大内置对象及其功能,探讨了JSP与Servlet之间的关系及差异,并提供了实际编码示例。此外,还讨论了网页开发中常见的编码转换问题以及JSP的两种页面跳转方式。 ... [详细]
  • MySQL锁机制详解
    本文深入探讨了MySQL中的锁机制,包括表级锁、行级锁以及元数据锁,通过实例详细解释了各种锁的工作原理及其应用场景。同时,文章还介绍了如何通过锁来优化数据库性能,避免常见的并发问题。 ... [详细]
  • 本文探讨了在使用Apache HttpClient 4.x(作为commons-httpclient 3.x的后续版本)时,如何配置默认的HttpContext,以确保每次执行请求时无需显式传递上下文。 ... [详细]
  • 本文详细介绍了如何在 Node.js 环境中利用 Nodemailer 库实现邮件发送功能,包括环境配置、代码实现及常见问题解决方法。 ... [详细]
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社区 版权所有