爬虫总结

什么是爬虫


爬虫即网络爬虫,英文是Web Spider。翻译过来就是网络上爬行的蜘蛛,如果把互联网看作一张大网,那么爬虫就是在大网上爬来爬去的蜘蛛,碰到想要的食物,就把他抓取出来。

我们在浏览器中输入一个网址,敲击回车,看到网站的页面信息。这就是浏览器请求了网站的服务器,获取到网络资源。那么,爬虫也相当于模拟浏览器发送请求,获得到HTML代码。HTML代码里通常包含了标签和文字信息,我们就从中提取到我们想要的信息。


得到的responde的内容

网页文本:如HTML文档,Json格式文本等

图片:获取的都是二进制文件,如果保存为图片格式

视频:也是也二进制文件,保存为视频格式

其他 : 只要你能请求到,就能获取到

那什么是json?

JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。

Python3 中可以使用 json 模块来对 JSON 数据进行编解码,它包含了两个函数:

json.dumps(): 对数据进行编码。
json.loads(): 对数据进行解码。
复制代码

在json的编解码过程中,python 的原始类型与json类型会相互转换

动态加载的网页要怎么办?

  • 首先了解什么是ajax
  • AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术。
    AJAX = 异步 JavaScript和XML(标准通用标记语言的子集)。
    AJAX 是一种用于创建快速动态网页的技术。
    AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。

简单的说就是网页加载,浏览器地址栏的网址并没有变,是javascript异步加载的网页,应该是ajax。AJAX一般是通过XMLHttpRequest 对象接口发送请求的,XMLHttpRequest 一般被缩写为 XHR。

所以

我们在Chrome中打开开发者工具(F12)。我们点击Network,点击XHR标签。然后我们刷新网页,往下拉请求。这个时候我们就可以看到XHR标签,在网页每一次加载的时候就会跳出一个请求。就可以找到啦!分析得到的文件url,然后构造url!就可以得到全部信息

如何保存图片,视频等二进制信息?

import requests
 
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}
resp = requests.get('http://www.baidu.com/img/baidu_jgylogo3.gif',headers=headers)
print(resp.content) # 二进制文件使用content
# 保存图片
with open('logo.gif','wb') as f:
f.write(resp.content)
print('Ok')
复制代码

成功运行就可以看到打印出来的图片的二进制数据,可保存成功后打印的 OK,这个时候我们打开文件夹就可以看到下载下来的图片了。这几行代码就简单的演示了爬虫保存文件的过程。

对response的解析

直接处理,比如简单的页面文档,只要去除一些空格的数据;

Json解析,处理Ajax加载的页面;

正则表达式;

BeautifulSoup库;

PyQuery;

XPath。

讲讲BeautifulSoup

BeautifulSoup呢,它是一个方便的网页解析库,处理高效,支持多种解析器。大部分情况下,利用它我们不在需要编写正则表达式就可以方便的实现网页信息的提取。

BeautifulSoup是一个网页解析库,它支持很多解析器,不过最主流的有两个。一个是Python标准库,一个是lxml HTML 解析器

怎么使用BeautifulSoup?

虽然BeautifulSoup的基本用法,标签获取,内容获取,可以解析一些 html代码。但是在遇到很多复杂的页面时,上面的方法是完全不足的,或者是很繁琐的,因为有时候有的标签会有几个属性(class、id等)。

Beautiful Soup支持大部分的 CSS选择器。在Tag或BeautifulSoup对象的.select()方法中传入字符串参数, 即可使用 CSS选择器的语法找到 tag。我们在写 css 时,标签 class类名加”.“,id属性加”#“。

soup.select("title")
# [The Dormouse's story]
复制代码
  • 通过 tag标签逐层查找:


soup.select("body a")
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
#  <a class="sister" href="http://example.com/lacie"  id="link2">Lacie</a>,
#  <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
soup.select("html head title")
# [<title>The Dormouse's story</title>]
复制代码
  • 通过 CSS 的 class类名查找:

soup.select(".sister")
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
#  <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
#  <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
复制代码
  • 通过 tag 的 id 查找:

soup.select("#link1,#link2")
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
#  <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
复制代码
  • 我们要怎样提取他里面的内容呢

for i in list:
print(i.get_text()) # 我们使用get_text()方法获得标签内容
print(i.get['href'] # get['attrs']方法获得标签属性
print(i['href']) # 简写结果一样
复制代码