什么是爬虫?
模拟浏览器打开网页,获取网页中我们想要的那部分数据
浏览器打开网页的过程:
当你在浏览器中输入地址后,经过DNS服务器找到服务器主机,向服务器发送一个请求,服务器经过解析后发送给用户浏览器结果,包括html,js,css等文件内容,浏览器解析出来最后呈现给用户在浏览器上看到的结果
所以用户看到的浏览器的结果就是由HTML代码构成的,我们爬虫就是为了获取这些内容,通过分析和过滤html代码,从中获取我们想要资源(文本,图片,视频…)
爬虫的基本流程
发起请求
通过HTTP库向目标站点发起请求,也就是发送一个Request,请求可以包含额外的header等信息,等待服务器响应
如我们向百度发送一个Request,大家可以试着用Chrome浏览器右键检查,或者快捷键F12-》network查看
获取响应内容
如果服务器能正常响应,会得到一个Response,Response的内容便是所要获取的页面内容,类型可能是HTML,Json字符串,二进制数据(图片或者视频)等类型
如图:
解析内容
得到的内容可能是HTML,可以用正则表达式,页面解析库进行解析,可能是Json,可以直接转换为Json对象解析,可能是二进制数据,可以做保存或者进一步的处理
保存数据
保存形式多样,可以存为文本,也可以保存到数据库,或者保存特定格式的文件。
这是我们爬虫的基本流程,如果想了解什么是request和response,请看内容:
Python爬虫之request和response
能爬取什么样的数据
- 网页文本:如HTML文档,Json格式化文本等
- 图片:获取到的是二进制文件,保存为图片格式
- 视频:同样是二进制文件
- 其他:只要请求到的,都可以获取
如何解析数据
- 直接处理
- Json解析
- 正则表达式处理
- BeautifulSoup解析处理
- PyQuery解析处理
- XPath解析处理
关于抓取的页面数据和浏览器里看到的不一样的问题
出现这种情况是因为,很多网站中的数据都是通过js,ajax动态加载的,所以直接通过get请求获取的页面和浏览器显示的不同。
如何解决js渲染的问题?
- 分析ajax
- Selenium/webdriver
- Splash
- PyV8,Ghost.py
怎样保存数据
- 文本:纯文本,Json,Xml等
- 关系型数据库:如mysql,oracle,sql server等结构化数据库
- 非关系型数据库:MongoDB,Redis等key-value形式存储
接下来我们试试一个简单的demo:
import urllib.request
response = urllib.request.urlopen('http://www.baidu.com')
print(response.read().decode('utf-8'))
大家看看会发现什么?