爬虫概念:
网络爬虫,网页蜘蛛,网页机器人,就是模拟客户端发送网络请求,接收请求的响应,按照一定规则,自动地抓取互联网信息的程序。(原则上,只要浏览器(用户)能做的事情,爬虫都能做。)
爬虫分类:
通用爬虫 :通常指搜索引擎和大型Web提供服务商的爬虫。
聚集爬虫:针对特定的网站,定向的获取某方面数据的爬虫。
1.累积式爬虫:从开始到结束,不断爬取,过程中会进行去重操作。
2.增量式爬虫:已下载网页采取增量式更新和只爬新产生的或者已经发生变化网页的爬虫。
Deep web爬虫:不能通过静态链接获取的,隐藏在搜索表单后的,只有用户提交一些关键词才能获得的Web页面。
爬虫的用途:
主要用途:数据采集。
其它用途:12306抢票 网上投票 短信轰炸 网络攻击
爬虫的工作原理:
聚焦爬虫原理(重点):
1.目标的url
2.代码发送请求
3.解析数据(数据+新的url)
4.数据入库
搜索引擎原理(了解):
1.抓取网页
2.数据存储
3.预处理
4.提供检索服务,网站排名。
robots协议:
网站通过robots协议告诉搜索引擎可以抓取哪些内容,哪些内容不能抓取。例如访问:www.taobao.com/robots.txt
爬虫是不遵守robots协议的
HTTP:
超文本传输协议
默认端口号:80
HTTPS:
HTTP+SSL(安全套接字层)ca证书
默认端口号:443
HTTP常见请求头:
Host (主机和端口号)
Connection (链接类型)
Upgrade-Insecure-Requests (升级为HTTPS请求)
User-Agent (浏览器名称)
Accept (传输文件类型)
Referer (页面跳转处)
Accept-Encoding(文件编解码格式)
Cookie (Cookie)
x-requested-with :XMLHttpRequest (是Ajax 异步请求)
HTTPS比HTTP更安全,但是性能更低
由于windows下中文编码的问题,建议在虚拟机中创建虚拟环境进行爬虫(需要联网)
mkvirtualenv pyspider3 -p python3
requests模块:
使用requests可以发送请求,返回响应数据,而且在python2和python3中通用,使用方法也一样,底层是使用urllib实现的。
response=requests.get(url) #发送url请求
data_bytes=response.content #接收返回的数据对象,字节类型
data=data_bytes.decode('utf-8') #decode()解码为字符串
获取网页源码的通用方式:
response.content.decode()
response.content.decode(“GBK”)
response.text
以上三种方法从前往后尝试,能够100%的解决所有网页解码的问题
发送带headers的请求:发送请求时,还需带上headers(反扒的最基本手段之一)
#headers形式为字典
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
可以自行在网上百度"User-Agent"池,交替使用"User-Agent",防止检测出同一"User-Agent"访问多次
response=requests.get(url,headers=headers) #发送url请求
为什么要带上headers?
主要是为了模拟浏览器,欺骗服务器,获取和浏览器一致的内容
发送带参数的请求:
参数形式:字典,如: kws={ ‘wd’:‘美女’ }
如百度搜索美女,然后将跳转到的整个html页面保存到本地,
代码如下:
import requests
if __name__ == '__main__':
#1.目标url
url='https://www.baidu.com/s'
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36"}
#带参数
baidu_params={
'wd':'美女'
}
#2.发起请求
response=requests.get(url,headers=headers,params=baidu_params)
#3.获取数据
data=response.content.decode('utf-8')
#4.保存
with open('01_baidu.html','w') as f:
f.write(data)

2108

被折叠的 条评论
为什么被折叠?



