一. 爬虫的五个步骤:
1.需求分析 >由程序员,人工智能完成
2.找到内容相关的网址 >由程序员完成
3.根据网址获取网址的返回信息 >使用程序(urllib,requests)完成
4.定位需要的信息的位置 >使用程序(正则表达式,xpath,css selector)完成
5.存储内容 >储存到文件系统、数据库(mysql,redis,mongodb)
二. HTTP/HTTPS
———— requests————>
客户端 HTPP/HTTPS协议 服务器端
<————response————
三. requests的请求方法
get() 从服务器获取信息,但不改变服务器的状态yu
post() 从服务器获取信息,会改变服务器的状态,常见爬取登录页面
四. Headers包头的重要信息
cookie : 在客户端能够储存一些服务器端的信息,如:session_id。与session共同完成身份标志的工作
user-Agent : 能说明当前使用什么浏览器及版本,给服务器端描述浏览器环境的
Referer : 说明是从哪个页面跳转过来的,相当于介绍人的身份
五. 使用get()请求方法
爬取百度的搜索页面
# 导入requests模块 import requests # 爬虫第三步:根据url获取HTML信息 response = requests.get('http://www.baidu.com') # response.text 返回字符串类型的HTML信息 print(response.text) # 上面返回的内容遇到了乱码的问题,解决办法:response.encoding指定和爬取网页的相同的编码 response.encoding = 'utf-8' print(response.text) # response.content 返回二进制(bytes)类型的HTML信息 print(response.content) # 爬虫第五步:将获取到的HTML信息保存到文件中 with open('baidu.html', 'wb') as f: f.write(response.content)
爬取bilibili某个博主的粉丝数量
import requests import json # 带有需求信息的url url = 'https://api.bilibili.com/x/relation/stat?vmid=353840826&jsonp=jsonp' # 添加headers伪装为浏览器 headers = { 'cookie': 'bsource=search_baidu; _uuid=2B3AB92A-201C-2699-895D-54A5F7706AEE40844infoc; buvid3=4457CFAD-EED8-4D63-97D0-4A739D63DA86138402infoc; bfe_id=1e33d9ad1cb29251013800c68af42315; CURRENT_FNVAL=80; blackside_state=1; sid=k9o04web', 'referer': 'https://space.bilibili.com/353840826/fans/fans', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36', } response = requests.get(url, headers=headers) data_json = json.loads(response.text) # 将数据转换为json格式 print(data_json) print(data_json['data']['follower'])
六. 使用post()请求方法
爬取人人网登录信息
import requests import json # 若需要登录后才能访问的内容,需要登录然后再访问 # post()请求方法需要实例session类 session_requests = requests.session() # 登录url url = 'http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=2020951359639' # post()请求方法需要定义data属性(登录url下的Headers中的Form Data所有内容) body = { 'email': '15836157830', 'icode': '', 'origURL': 'http://www.renren.com/home', 'domain': 'renren.com', 'key_id': '1', 'captcha_type': 'web_login', 'password': '5e34fdfceabda55918f6f75ebb3c97152aa5115a4ce264e7413b9e88a9137811', 'rkey': '33c14357d55b6ff027dcd56e46cb529e', 'f': 'http%3A%2F%2Fwww.renren.com%2F973158989%2Fprofile', } response = session_requests.post(url, data=body) data_json = json.loads(response.text) print(data_json) # {'code': True, 'homeUrl': 'http://www.renren.com/home'} print(data_json['homeUrl']) # data_json['homeUrl'] 返回 http://www.renren.com/home react = session_requests.get(data_json['homeUrl'], allow_redirects=True) # 自动发生重定向 http://www.renren.com/973158989 print(react.url) with open('renren.html', 'wb') as f: f.write(react.content)