爬虫基础知识简单案例
1.爬虫基础
爬虫概念
什么是爬虫
爬虫是一个应用程序
是指某一个用于爬取数据的应用程序
爬取的目标可以使整个互联网 也可以是单独的某一个服务器
在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爬虫框架
案例:爬取梨视频
mport requests,re,json,uuid
from concurrent.futures import ThreadPoolExecutor
def spider(category_id):
txt=requests.get('https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=%s&start=12'%category_id)
requests_list=[]
video_id_list=re.findall('<a href="video_(\d+)"',txt.text)
video_id_list=tuple(video_id_list)
for i in video_id_list:
requests_dict={}
text=requests.get('https://www.pearvideo.com/video_%s'%i)
requests_dict['video_id'] = re.search('srcUrl="(.*?)"',text.text).group(1)
# print(text.text)
# print(re.search('<h1 class="video-tt">(.*?)</h1>',text.text))
requests_dict['title']=re.search('<h1 class="video-tt">(.*?)</h1>',text.text).group(1)
requests_dict['data'] = re.search('<div class="date">(.*?)</div>',text.text).group(1)
requests_dict['up'] = re.search('<div class="fav" data-id="\d+">(.*?)</div>', text.text).group(1)
requests_list.append(requests_dict)
pool.submit(download,requests_dict['video_id'],requests_dict['title'])
with open ('down_load1' ,'wt')as f:
json.dump(requests_list,f)
print(requests_list)
return
def download(url,title):
print('%s开始下载了'%url)
video=requests.get(url)
with open ('%s.mp4'%title[-1],'wb')as f:
f.write(video.content)
print('%s下载完成' % url)
if __name__=='__main__':
pool=ThreadPoolExecutor(2)
spider(8)
需要的数据:
标题
视频连接
发布时间
点赞数
详情
爬取的流程
1.爬取首页中所有的视频的id
2.拼接详情地址并请求
3.通过re解析数据
4.将结果存储为json数据
分析浏览器请求过程发现:
主要接口为:
https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=5&start=0
categoryId=5 表示视频的分类
start=0 表示其实位置
默认每一页请求12条数据
分析请求头中有用的信息
1.user-agent 用来识别客户端类型
2.refer 用来识别 用户从哪个页面过来的
3.Cookie 当页面需要验证用户身份时 使用
响应头:
location 当请求被重定向时 就会带有该字段 可以通过状态码30* 来识别重定向
发送post请求
requests 中
get请求 参数放在地址后或是使用params参数来指定 一格字典
post请求 参数使用data参数来指定 是一个字典
如果是登录请求一般都需要带token
先发送请求获取token的值 token值一定都在一个form表单中
百度搜索
# 手动进行中文编码
#from urllib.parse import urlencode
#print(urlencode({"wd":key},encoding="utf-8"))
url = "https://www.baidu.com/s"
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)
登录 github
def spider():
# session=requests.session()
# text=session.get('https://github.com/login')
# token=re.search('<input type="hidden" name="authenticity_token" value="(.*?)" /> ',text.text).group(1)
# login_url='https://github.com/session'
# response_text=session.post(login_url,headers={
# "Referer": "https: // github.com / login",
# "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.90 Safari/537.36 2345Explorer/9.7.0.18838"
# },data={
# "utf8":"✓",
# "authenticity_token":token,
# "login":"",
# "password":"",
# "commit":"Sign in"
# })
# print(response_text.status_code)
# with open ('spider.html','wb')as f:
# f.write(response_text.content)
#
#
# spider()