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


推荐阅读
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
  • 【爬虫】关于企业信用信息公示系统加速乐最新反爬虫机制
    ( ̄▽ ̄)~又得半夜修仙了,作为一个爬虫小白,花了3天时间写好的程序,才跑了一个月目标网站就更新了,是有点悲催,还是要只有一天的时间重构。升级后网站的层次结构并没有太多变化,表面上 ... [详细]
  • 用PHP连接MySQL代码的参数说明【PHP】
    后端开发|php教程PHP,连接,MySQL,参数后端开发-php教程代码是这样的:大图标网站源码,怎么在vscode中调试css,ubuntu退出命令行,系统默认开tomcat, ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 在project.properties添加#Projecttarget.targetandroid-19android.library.reference.1..Sliding ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
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社区 版权所有