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


推荐阅读
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • 本文详细介绍了Python编程语言的学习路径,涵盖基础语法、常用组件、开发工具、数据库管理、Web服务开发、大数据分析、人工智能、爬虫开发及办公自动化等多个方向。通过系统化的学习计划,帮助初学者快速掌握Python的核心技能。 ... [详细]
  • 本文介绍了多个关于JavaScript的书籍资源、实用工具和编程实例,涵盖从入门到进阶的各个阶段,帮助读者全面提升JavaScript编程能力。 ... [详细]
  • 本文探讨了如何在日常工作中通过优化效率和深入研究核心技术,将技术和知识转化为实际收益。文章结合个人经验,分享了提高工作效率、掌握高价值技能以及选择合适工作环境的方法,帮助读者更好地实现技术变现。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 深入理解Tornado模板系统
    本文详细介绍了Tornado框架中模板系统的使用方法。Tornado自带的轻量级、高效且灵活的模板语言位于tornado.template模块,支持嵌入Python代码片段,帮助开发者快速构建动态网页。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文详细介绍了如何使用Python编写爬虫程序,从豆瓣电影Top250页面抓取电影信息。文章涵盖了从基础的网页请求到处理反爬虫机制,再到多页数据抓取的全过程,并提供了完整的代码示例。 ... [详细]
  • 本文介绍了在Windows环境下使用pydoc工具的方法,并详细解释了如何通过命令行和浏览器查看Python内置函数的文档。此外,还提供了关于raw_input和open函数的具体用法和功能说明。 ... [详细]
  • 使用Python在SAE上开发新浪微博应用的初步探索
    最近重新审视了新浪云平台(SAE)提供的服务,发现其已支持Python开发。本文将详细介绍如何利用Django框架构建一个简单的新浪微博应用,并分享开发过程中的关键步骤。 ... [详细]
  • 自己用过的一些比较有用的css3新属性【HTML】
    web前端|html教程自己用过的一些比较用的css3新属性web前端-html教程css3刚推出不久,虽然大多数的css3属性在很多流行的浏览器中不支持,但我个人觉得还是要尽量开 ... [详细]
  • 本文详细解析了如何使用Python的urllib模块发起POST请求,并通过实例展示如何爬取百度翻译的翻译结果。 ... [详细]
  • 前端开发:从底层到顶端的行业现象解析
    在编程领域,鄙视链现象屡见不鲜,从C语言到Java、.NET等,每个技术栈都有其独特地位。然而,前端开发者尽管常处于鄙视链底端,却在市场需求中备受青睐。本文深入探讨这一现象,并分析前端工程师如何在竞争激烈的市场中脱颖而出。 ... [详细]
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社区 版权所有