爬虫基础简介
爬虫的定义:
通过编写程序,模拟浏览器上网,然后让其去互联网上抓取数据的过程。
爬虫的价值:
-实际应用 -就业
爬虫的合法性:
-在法律中不被禁止 -具有违法风险
爬虫带来的风险可以体现在如下2个方面:
-爬虫干扰了被访问网站的正常运营
-爬虫抓取了受到法律保护的特定类型的数据或信息
如何在使用编写爬虫的过程中避免触犯法律:
-时常优化自己的程序,避免干扰被访问网站的政策运行
-在使用传播爬取到的数据时,审查爬取到的内容,如果发现了设计到用户隐私商业机密等敏感内容需要立刻停止爬取和传播。
爬虫在使用场景中的分类:
-通用爬虫:搜索引擎抓取系统的重要组成部分,抓取的是一整张页面数据
-聚焦爬虫:是建立在通用爬虫的基础之上,抓取的是页面中特定的局部内容
-增量式爬虫:监测网站中数据更新的情况,只会爬取网站中最新更新出来的数据
爬虫的矛与盾
反爬机制
相关的门户网站,可以通过制定相应的策略或者技术手段,防止爬虫程序进行网站数据的爬取
反反爬策略
爬虫程序可以通过制定相关的策略或者技术手段,破解门户网站中具备的反爬机制,从而可以获取门户网站的相关信息。
robots.txt协议
规定了网站中哪些数据可以被爬虫爬取,哪些数据不可以被爬取。
http协议
-
概念:服务器与客户端进行数据交互的一种形式。
-
常用请求头信息:
①User-Agent:表示请求载体的身份标识
②Connection:请求完毕后,是断开连接还是保持连接
-
常用响应头信息
①Content-Type:服务器响应回客户端的数据类型
https协议
安全的超文本传输协议
-
加密方式:
①对称密钥加密
②非对称密钥加密
③证书密钥加密
requests模块
- 概念:python中原生的一款基于网络请求的模块,功能非常强大,简单便捷,效率极高。
- 作用:模拟浏览器发请求
- 如何使用:①指定url ②发起请求 ③获取响应数据 ④持久化存储响应数据
- 环境安装:pip install requests
- 实战编码:需求:爬取搜狗首页的页面数据
爬取搜狗首页的页面数据
#需求:爬取搜狗首页的页面数据
import requests
if __name__=="__main__":
#第一步:指定url
url='https://www.sogou.com/'
#第二步:发起请求
#get方法会返回一个响应对象
response=requests.get(url=url)
#第三步:获取响应数据 text返回的是字符串形式的数据
page_text=response.text
print(page_text)
#第四步:持久化存储
with open('./sogou.html','w',encoding='utf-8') as fp:
fp.write(page_text)
爬取搜狗指定词条对应的搜集结果页面(简易网页采集器)
#反爬机制:UA检测:门户网站的服务器会检测对应请求的载体身份标识,
# 如果检测到请求的载体身份标识为某一款浏览器说明该请求是一个正常的请求。
# 如果检测到请求的载体身份标识不是基于某一款浏览器,则该请求为不正常的请求(爬虫),
#则服务器端可能拒绝该请求
#UA:User-Agent(请求载体的身份标识)
#反反爬策略:UA伪装:让爬虫对应的请求载体身份标识伪装成某一款浏览器
import requests
#UA伪装:将对应的User-Agent封装到一个字典中
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0'
}
url = 'https://www.sogou.com/web'
#处理url携带的参数:封装到字典中
kw = input('enter a word:')
param = {
'query':kw
}
#对指定的url发起的请求是携带参数的,并且请求过程中处理了参数
response = requests.get(url=url,params=param,headers=headers)
#获取响应数据
page_text = response.text
fileName = kw+'.html'
with open(fileName,'w',encoding='utf-8') as fp:
fp.write(page_text)
print(fileName,'保存成功')
破解百度翻译
#破解百度翻译
#post请求(携带了参数)
#响应数据是一组json数据
import requests
import json
post_url='https://fanyi.baidu.com/sug'
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0'
}
#post请求参数处理
word=input('enter a word')
data={
'kw':word
}
#UA伪装
response=requests.post(url=post_url,data=data,headers=headers)
#获取响应数据:json()方法返回的是obj(如果确认返回数据是json类型的,才可以用json)
dic_obj=response.json()
#进行持久化存储
fileName=word+'.json'
fp=open(fileName,'w',encoding='utf-8')
json.dump(dic_obj,fp=fp,ensure_ascii=False)
print('over')
爬取豆瓣电影分类排行榜
import requests
import json
url='https://movie.douban.com/j/chart/top_list?'
param={
'type': '24',
'interval_id': '100:90',
'action':'',
#start表示从库中的第几部电影去取 limit表示取多少部
'start': '0',
'limit': '20',
}
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0'
}
response=requests.get(url=url,params=param,headers=headers)
list_data=response.json()
fp=open('./douban.json','w',encoding='utf-8')
json.dump(list_data,fp,ensure_ascii=False)
print('over')
爬取肯德基餐厅查询
import requests
url='https://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
param={
'cname': '南京',
'pid':'',
'keyword': '北京',
'pageIndex':'1',
'pageSize': '10',
}
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0'
}
response=requests.get(url=url,params=param,headers=headers)
page_text=response.text
with open('KFC',mode='w',encoding='utf-8') as f:
f.write(page_text)
print('over')