一 、爬虫基本原理
1、什么是爬虫?
爬虫就是爬取数据。
2、什么是互联网?
由一堆网络设备,把一台台的
计算机互联到一起称之为互联网。
3、互联网建立的目的
数据的传递与数据的共享。
4、什么是数据?
例如:
电商平台的商品信息(淘宝、京东、亚马逊)
链家、自如租房平台的房源信息
股票证券投资信息(东方财富、雪球网)
...
12306,票务信息(抢票)
5、什么是上网?
普通用户:
打开浏览器
---> 输入网址
---> 往目标主机发送请求
---> 返回响应数据
---> 把数据渲染到浏览器中
爬虫程序:
模拟浏览器
---> 往目标主机发送请求
---> 返回响应数据
---> 解析并提取有价值的数据
---> 保存数据(文件写入本地、
持久化到数据库中)
6、爬虫的全过程
1.发送请求(请求库: Requests/Selenium)
2.获取响应数据
3.解析数据 (解析库: BeautifulSoup4)
4.保存数据 (存储库: 文件保存/MongoDB)
总结: 我们可以把互联网中的数据比喻成一座宝藏,
爬虫其实就是在挖取宝藏。
二、 requests请求库
1、安装与使用
pip3 install requests
2、分析请求流程(模拟浏览器)
- 百度:
1.请求url
https://www.baidu.com/
2.请求方式
GET
POST
3.响应状态码
4.请求头信息
我们爬虫要用到的requests请求库:
安装:
1
|
pip3 install requests
|
每次使用的时候在代码前面加上
import requests
import requests #爬虫三部曲 # 1.发送请求 def get_page(url): response = requests.get(url) return response # 2.解析数据 import re def parse_index(html): #findall匹配所有 # re.findall('正则匹配规则','匹配文本','匹配模式') #re.S:对全部文本进行搜索匹配 detail_urls = re.findall('<div class="items"><a class="imglink" href="(.*?)"',html,re.S) return detail_urls #解析详情页 def parse_detail(html): movie_url = re.findall('<source src="(.*?)">',html,re.S) if movie_url: return movie_url[0] #只返回视频的详细网址 # 3.保存数据 import uuid # uuid.uuid4()根据时间戳生成一段世界上唯一的字符串 def save_video(content): with open(f'{uuid.uuid4()}.mp4','wb') as f: f.write(content) print('视频下载完毕') #测试用例 if __name__ == '__main__': for line in range(6): url= f'http://www.xiaohuar.com/list-3-{line}.html' # 发送请求 response = get_page(url) # print(response) # #返回响应状态码 # print(response.status_code) # # 返回响应文本 # print(response.text) # 解析主页页面 detail_urls = parse_index(response.text) #循环遍历详情页url for detail_url in detail_urls: print(detail_url) #往每个详情页发送请求 detail_response = get_page(detail_url) # print(response.text) #解析详情页获取视频url movie_url = parse_detail(detail_response.text) #判断视频存在url并打印 if movie_url: print(movie_url) #往视频url发送请求获取视频的二进制流 movie_response=get_page(movie_url) #把视频的二进制流传给save_video函数保存到本地 save_video(movie_response.content)
三、post请求自动登入github
"""
请求URL:https://github.com/login
请求头:
cookies
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36
请求体:
Form Data:
commit: Sign in
utf8: ✓
authenticity_token: mOyooOxE7c/H7krQKEli+cwwy0+okuPOZqGEBSyu/kRfLHT2mNGu9RQcDnb1ovua1zQe3LOyYXxrWxFL+2aAcg==
login: gr6g5r
password: huhuhhge
webauthn-support: supported
"""
import requests import re login_url = 'https://github.com/login' login_header = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36' } login_res = requests.get(url=login_url, headers=login_header) # 解析提取token字符串 authenticity_token = re.findall( '<input type="hidden" name="authenticity_token" value="(.*?)"', login_res.text, re.S )[0] print(authenticity_token) # 获取login页面的cookies信息 login_cookies = login_res.cookies.get_dict() # 请求url session_url = 'https://github.com/session' # 请求头信息 session_headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36' } # 请求体信息 form_data = { "commit": "Sign in", "utf8": "✓", "authenticity_token": authenticity_token, "login": "*******", "password": "*******", "webauthn-support": "supported" } session_res = requests.post( url=session_url, headers=session_headers, cookies=login_cookies, data=form_data ) with open('github.html', 'w', encoding='utf-8') as f: f.write(session_res.text)