近期爬虫学习小汇总

近期爬虫学习小汇总

爬虫理论

什么是爬虫:
通过编写程序,模拟浏览器上网,然后让其去互联网上抓取数据的过程。
爬虫究竟是合法还是违法的?

​ 在法律中是不被禁止

​ 具有违法风险

​ 善意爬虫 恶意爬虫

爬虫带来的风险可以体现在如下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()   # 返回值 <bound method Response.raise_for_status of <Response [200]>>
    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标签和里面的内容  <title>This is a python demo page</title>
soup.a  #获取a标签  <a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a>
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   #将子标签存入列表  <head><title>This is a python demo page</title></head>
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("包存失败")

猜你喜欢

转载自www.cnblogs.com/zzkhome/p/13375536.html