爬虫概念
什么是爬虫
爬虫是一个应用程序
是指某一个用于爬取数据的应用程序
爬取的目标可以使整个互联网 也可以是单独的某一个服务器
在CS结构中 爬虫属于client 客户端
爬虫的价值 :
互联网中最有价值的就是数据
爬虫中首要任务就是要通过网络取获取模板服务器的数据;来为自己创造价值
爬虫的流程:
首先明确 我们的爬虫是客户端 要爬的数据在服务器上存储,
所以需要借助网络编程,底层的网络协议已经有现成的封装不需要自己写,
数据传输已经解决,问题是对方给我的数据我能不能看懂 我的数据对方能不能看懂
绝大多数网络传输都是采用的HTTP(*****)
HTTP 协议 超文本传输协议
1.明确要爬取的url地址
2.发送请求
浏览器发送请求
第三方requests模块 pip install requests
内置的urllib模块
selenium (自动化测试模块)用程序驱动浏览器发送请求
之所以用selenium是因为一些网站需要人机交互(点击,拖拽等等操作)
针对移动app可以使用代理服务器 可以截获app端发送的请求信息 Charles(青花瓷)
3.接收响应
浏览器接受相应后会渲染页面进行展示 无法拿到数据 所以更多情况下使用用浏览器来分析请求详情
requests和urllib都会直接返回响应体
selenium 提供了find_element***的接口用于获取数据
4.解析数据
re
BeautifulSoup 封装了常用的正则表达式
移动端返回的/ajax返回的json数据 直接json.load
5.存储数据
mysql等 关系型数据库
MongoDB redis 非关系型数据库 一般用在高并发爬虫中
接口测试工具postman paw(mac 可以自动生成请求代码)
Scrapy爬虫框架
import requests key = input("请输入关键字:") # 手动进行中文编码 #from urllib.parse import urlencode #print(urlencode({"wd":key},encoding="utf-8")) url = "https://www.baidu.com/s" #url地址获取 user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36" #模拟浏览器带上版本 resp = requests.get(url, params={"wd":key}, headers = {"User-Agent":user_agent}) with open("baidu.html","wb") as f: f.write(resp.content) #print(resp.text)
#注意 先要安装 pip3 install requests 模块
""" 1.获取token 地址:https://github.com/login token放在了响应体中 """ import requests,re # 1.获取token login_page_url = "https://github.com/login" resp = requests.get(login_page_url) # 请求首页 # 获取返回的cookie cookie = resp.cookies.get_dict() token = re.search('authenticity_token" value="(.*?)" /> ',resp.text).group(1) # 获取token # 2.请求登录接口 login_url = "https://github.com/session" resp2 = requests.post(login_url, headers={ "Referer": "https://github.com/login", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36", }, data={"commit": "Sign in", "utf8": "✓", "authenticity_token": token, "login": "oldboyedujerry", "password": "123654asdAsd", "webauthn-support": "supported"}, cookies = cookie) #data 是post 发送请求带上用户名,密码等信息发送上去 print(resp2.status_code) #查看状态吗 with open("github_home.html","wb") as f: f.write(resp2.content) print("oldboyedujerry/testProject" in resp2.text)
import requests # 最常用的两个函数 # requests.get() # requests.post() url = "https://www.baidu.com/s" resp = requests.get(url,params={"wd":"egon"},headers={"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3538.77 Safari/537.36"}) print(resp.text) #显示是文档形式的 print(resp.content) #显示是二进制形式,用于存视频,图片等 print(resp.status_code) #显示的是状态码 print(resp.url) #显示url地址出来 print(resp.cookies) # 获取返回的cookies信息 print(resp.cookies.get_dict()) # 获取返回的cookies信息 # print(type(resp.json()))# 将结果进行反序列化 print(resp.request) # 请求方式 从文档中获取编码方式 print(resp.apparent_encoding) print(resp.encoding) print(resp.headers) # 查看响应头 print(resp.history) # 重定向历史 即前一次请求的地址 print(resp.url) # 当前地址
# 对于返回值为json格式的处理 # jsonresp = requests.get("http://v.juhe.cn/toutiao/index?key=1f1ed574dda497de207ccca4d9999d7f") # # print(type(jsonresp.text)) # print(type(jsonresp.json())) # # print(jsonresp.json())
# 代理池 ******** 对于爬虫而言是相当重要的一个参数 # ps = ["121.228.240.101:9999","121.228.240.101:9999","121.228.240.101:9999","121.228.240.101:9999"] # import random # # 使用代理服务器请求 # resp = requests.post("http://news.baidu.com/?tn=news",proxies={"HTTP":random.choice(ps)}) # with open("ttt.html","wb") as f: # f.write(resp.content) # print(resp.text)
import requests
# 给服务器传参数
# requests.get("url",params={"key":'value'})
# post请求 data和json都能传参数
# requests.post("url",data={"name":"jerry","pwd":"123"},json={"name":"jerry","pwd":"123"})
# data 拼接为:name=jerry&pwd=123
# json 直接序列化成字符串 {"name":"jerry","pwd":"123"}
# 超时时间 第一个表示连接超时时间 2表示响应超时时间
# requests.post("https://www.baidu.com",timeout=(10,10))