近期爬虫学习小汇总
爬虫理论
什么是爬虫:
通过编写程序,模拟浏览器上网,然后让其去互联网上抓取数据的过程。
爬虫究竟是合法还是违法的?
在法律中是不被禁止
具有违法风险
善意爬虫 恶意爬虫
爬虫带来的风险可以体现在如下2方面:
爬虫干扰了被访问网站的正常运营
爬虫抓取了收到法律保护的特定类型的数据或信息
http协议
概念:服务器和客户端进行数据交互的一种形式
User-Agent:请求载体的身份表示
Connection:请求完毕后,是断开的连接还是保持连接
常用响应头信息
Content-Type:服务器响应回客户端的数据类型
https协议:
- 安全的超文本传输协议
加密方式
- 对称秘钥加密
- 非对称秘钥加密
- 证书秘钥加密
爬虫思路
分析网页,确定 url 路径
发起request请求,获取相应数据
数据解析筛选
保存数据
requests库:模拟浏览器发送请求
import requests
url="http://www.dianping.com" #协议地址
header={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36"
}
res=requests.get(url,headers=header,timeout=2) #超时参数为2秒
res.encoding # 查看编码
res.status_code #状态信息,200正常,404是错误
res.apparent_encoding #分析内容可能的编码
#把响应的二进制字节流转化为str类型
res.content.decode() #括号里可以写gbk,获取网页源码 第二个尝试方式
- text 文本数据
- json 对象数据
- content 二进制数据(一般用于图片)
通用代码框架
def getHTMLText(url):
header={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36"
}
try:
r=requests.get(url,timeout=30,headers=header)
r.raise_for_status #如果状态不为200,引发HTTPError异常
r.encoding=r.apparent_encoding
return r.text
except:
return "产生异常"
传参
import requests
keyword="python"
try:
kv={"q":keyword}
r=requests.get("http://www.so.com",params=kv) # 搜索引擎后面的参数 ,表示搜索的内容
print(r.request.url)
r.raise_for_status() # 返回值 >
print(len(r.text))
except:
print(r.status_code)
print("爬取失败")
xpath:
实例化一个etree的对象,需要将被解析的页面加载到该对象中,返回的是一个列表,但是索引是从一开始的
语法:
/: 表示的是从根节点开始定位,表示的是一个层级
//: 表示的是多个层级,可以表示从任意位置开始定位
属性定位://div[@class="song"]
/text() 获取标签中直系文本
//text() 获取所有文本
/@attrName取属性
使用案例
from lxml import etree
import requests
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36"}
url="http://sc.chinaz.com/tubiao/dongmankatong_2.html"
page_text=requests.get(url,headers)
page_text.encoding="utf8"
page_text=page_text.text
tree=etree.HTML(page_text)
ico_list=tree.xpath('.//div[@class="text_left"]/ul/li/p/a/@href')
beautifulsoup:用于捕获标签
案例演示与讲解
from bs4 import BeautifulSoup
import requests
demo="http://python123.io/ws/demo.html"
demo=requests.get(demo)
demo=demo.text #使用requests库获取文本
soup=BeautifulSoup(demo,"html.parser")
soup.title # title标签和里面的内容 This is a python demo page
soup.a #获取a标签 Basic Python
soup.a.name # a标签的名字
soup.a.parent.parent.name #获取父标签的名字
soup.a.attrs # a标签的属性 以字典形式b返回
soup.a.attrs["class"] # 获取class属性
soup.b.string #b标签中非属性字符串,即直系内容,如果没有,那就是没有
soup.head.contents #将子标签存入列表 This is a python demo page
soup.a.next_sibling # 返回HTML文本顺序下一个平行节点标签
soup.prettify() # 基于html的输出 将每个标签用换行符表示出来
soup.find("a") #只找出一个,a标签
soup.find_all("a") #只找出所有a标签
soup.find_all(id="link1") # 找所以含有id="link1"的标签
图片与文件爬取
图片和文件还有音频都是二进制文件,需要找到文件源头,发起响应,然后写入本地即可
案例演示
import requests
import os
url="http://pic.netbian.com/uploads/allimg/190917/151703-1568704623b3da.jpg"
root=r"C:\Users\32198\Pictures\爬虫图片"
path=root+"/"+url.split("/")[-1]
try:
if not os.path.exists(root):
os.mkdir(root)
if not os.path.exists(path):
r=requests.get(url)
with open (path,"wb") as f:
f.write(r.content)
f.close
print("保存文件成功")
else:
print("文件已存在")
except:
print("包存失败")