往期好文推荐
学习Python不需要程基础?
0基础不用怕,从0到1轻松教你入门Python
这篇文章给大家简单总结一下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()
具体的使用方法,可以在w3school查看
最后在爬取之前,我们需要配置我们的无头浏览器,否则很容易被服务器识别出机器人,
from selenium.webdriver.common.desired_capabilities import DesiredCapabilitiesdcap = dict(DesiredCapabilities.PHANTOMJS)dcap["phantomjs.page.settings.userAgent"] = user_agent
私信小编资料即可自动获取Python学习资料!视频教程以及各类PDF!