准备知识:
一、HTTP和HTTPS
HTTP
超文本传输协议
默认端口号:80
HTTPS
HTTP+SSL(安全套接层)
默认端口号:443
HTTPS比HTTP更安全、但是性能更低
二、python中Bytes类型和str类型
bytes:二进制
互联网上数据都是以二进制的方式传输的
str:unicode呈现形式
unicode实现方式:utf-8(三位)和gbk(两位)
python3开始将两个类型分开
Bytes类型将字符流(011001)转为肉眼不识的码(\adf\dvs\dfo),然后str将其转为可识别的
Bytes ——> str 解码 decode
str ——> Bytes 编码 encode
三、url的形式
形式:
http://www.baidu.com
http://localhost:4000/file/part01/1.2.html
包含内容:
scheme:协议(例如:http,https,ftp)
host:服务器的IP地址或者域名
port:服务器的端口
path:访问资源的路径
query-string:参数,发送给http服务器的数据
anchor:锚
四、HTTP请求
http常见请求头
Host(主机和端口号)
Connection(链接类型)
Upgrade-Insecure-Requests(升级为HTTPS请求)
User-Agent(浏览器名称)
Accept(传输文件类型)
Referer(页面跳转处)
Accept-Encoding(文件编解码格式)
Cookie(cookie)
x-requested-with:XMLHttpRequest(是Ajax异步请求)
请求方式
POST和GET
响应状态码
200:成功
302:临时转移至新的url
307:临时转移至新的url
404:not found
500:服务器内部错误
入门知识:
一、学习过程
基础知识——>requests的使用——>数据提取方法——>动态网页数据提取——>scrapy——>scrapy redis
二、爬虫基础
概念
爬虫是模拟浏览器发送请求,获取响应
流程
url——>发送请求,获取响应——>提取数据——>保存
发送请求,获取响应——>提取url
注意
爬虫要根据当前url地址对应的响应为准,当前url地址的element的内容和url的响应不一样
数据
1) 页面上的数据来自哪里
当前url得知对应的响应中
其他的url地址对应的响应中
比如ajax请求中
2) js生成的
部分数据在响应中
全部通过js生成
三、爬虫分类
通用爬虫:通常指搜索引擎的爬虫
流程:抓取网页——>数据存储——>预处理——>提供检索服务
聚焦爬虫:针对特定网站的爬虫
流程:url列表——>响应内容(重新提取url放入列表)——>提取数据——>入库
四、ROBOTS协议
概念
网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取
入门示例
一、简单请求(get方式)
需求
通过requests向百度首页发送请求,获取百度首页的数据
response = requests.get(url)
response的常用方法:
response.text
response.content
response.status_code
响应体中的状态码
response.request.headers
请求体的头部信息
response.headers
响应体的头部信息:以字典形式返回
二、带header请求
无header请求
python请求所带的User-Agent是python默认,被检测到后没有返回真正的网页内容
带header请求
用python以字典形式进行制作
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'}
response = requests.get('http://www.baidu.com',headers=headers)
三、发送带参数的请求
什么是参数
百度直接搜索python,但是返回的链接中带有很多参数
https://www.baidu.com/s?wd=python&rsv_spt=1&rsv_iqid=0xbcbbc6fc00006ee9&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_su
https://www.baidu.com/s?wd=python 其实直接带这个一样效果
构造参数
方式一
p = {'wd':'python'}
url_temp = 'http://www.baidu.com/'
r = requests.get(url_temp,headers=headers,params=p)
方式二
url = 'http://www.baidu.com/s?wd={}'.format('python')
r = requests.get(url_temp,headers=headers)
format的使用:
1 >>> '1{}23'.format(1) 2 '1123' 3 >>> '1{}23'.format('a') 4 '1a23' 5 >>> '1{}23'.format('[5,6,7]') 6 '1[5,6,7]23'
1 import requests 2 3 #get请求 4 5 ''' 6 response = requests.get('http://www.baidu.com') 7 # response = requests.get('http://www.1211.cn') 8 ret = response.status_code 9 print(ret) # 200 10 assert ret == 200 # 断言ret等于200,如果等于不显示任何,如果不等于报错 11 # assert ret == 300 # AssertionError 12 13 14 # 请求体 response.request 15 print(response.request.headers) # {'User-Agent': 'python-requests/2.20.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'} 16 print(response.request.url) # http://www.baidu.com/ 17 18 print(response.content.decode()) # 如果直接这样访问,使用python默认的请求头,服务器识别后不会返回真实的网页内容 19 ''' 20 21 ''' 22 # 伪造headers 23 headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'} 24 # 头部不能有空格 25 response = requests.get('http://www.baidu.com',headers=headers) 26 ret = response.status_code 27 print(ret) 28 print(response.content.decode()) # 此时返回整个页面 29 ''' 30 31 # 构造参数 32 # 方式一 33 headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'} 34 p = {'wd':'python'} 35 url_temp = 'http://www.baidu.com/' 36 # url_temp = 'http://www.baidu.com/s?' 37 r = requests.get(url_temp,headers=headers,params=p) 38 print(r.status_code) 39 print(r.request.url) # https://www.baidu.com/?wd=python 如果没有解码,可以使用在线解码 40 # 方式二 41 url = 'http://www.baidu.com/s?wd={}'.format('python') 42 r = requests.get(url_temp,headers=headers) 43 print(r.status_code) 44 print(r.request.url)
四、练习
实现任意贴吧的爬虫,保存网页到本地
1 import requests 2 3 class tiebaSpider: 4 def __init__(self,tieba_name): 5 self.tieba_name = tieba_name 6 self.url_temp = 'https://tieba.baidu.com/f?kw='+tieba_name+'&pn={}' 7 self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'} 8 9 def get_url_list(self): # 1.构造url列表 10 url_list = [] 11 for i in range(5): 12 url_list.append(self.url_temp.format(i*50)) 13 return url_list 14 15 def parse_url(self,url): 16 print(url) 17 response = requests.get(url,headers=self.headers) 18 return response.content.decode() 19 20 def save_html(self,html_str,page_num): 21 file_path = '{}-第{}页.html'.format(self.tieba_name,page_num) 22 with open(file_path,'w',encoding='utf-8') as f: 23 f.write(html_str) 24 25 def run(self): # 实现主要逻辑 26 # 思路 27 # 1.构造url列表 28 # 2.遍历,发送请求,获取响应 29 # 3.保存 30 url_list = self.get_url_list() 31 32 for url in url_list: 33 html_str = self.parse_url(url) 34 page_num = url_list.index(url)+1 35 self.save_html(html_str,page_num) 36 37 38 if __name__ == '__main__': 39 tieba_spider = tiebaSpider('李毅') 40 tieba_spider.run()