哈喽你好,我先在这里废话两句,不想看直接看下面喽。。。。
爬虫
一个惊险而又刺激的东西,但同时也很抽象,说这东西,其实你都用过,但是没人告诉过你,先听我吹完在告诉你什么时候你用过。
爬虫的定义是:网络蜘蛛、网络机器人、抓取网络数据的程序,害,其实说白了就是Python程序模仿人点击浏览器访问网站,而且越逼真越好,这就是爬虫。
为啥用Python做爬虫?? 两个字简单,一个字好。。。。。。我们还是解决上面的问题吧,就是我说过你用过爬虫,这个问题,其实就是,百度,你没看错,就是百度,为什么说百度是爬虫呢,那我们就简单说吧,你在打开百度搜索东西的时候,爬虫就开始工作了,你搜索完,响应出来的页面,比如这样:
给出来的页面就是爬虫爬取完的结果,为什么这么说,其实就是当你一点击百度一下的时候,百度就会从网络上爬去到相对应的资源,响应出来,只不过,当你搜出来后,他会看一下他的服务器上有没有,没有就会保存这次搜索的内容,方便下一次的响应,更大大的节约了响应的时间,你要问我那服务器也有满的时候啊,那那那你别管,百度,有钱,奥利给,存就完了,好废话说多了直接上技术。
requests模块
- 安装
【1】Linux
sudo pip3 install requests
【2】windows
方法1> cmd命令行 --> python -m pip install requests
方法2> 右键管理员进入cmd命令行 :pip install requests
常用方法
- requests.get()
【1】作用
向目标网站发起请求,并获取响应对象
【2】参数
2.1> url :需要抓取的URL地址
2.2> headers : 请求头
2.3> timeout : 超时时间,超过时间会抛出异常
- 此生第一个爬虫
"""
向京东官网(https://www.jd.com/)发请求,获取响应内容
"""
import requests # 导入requests模块
resp = requests.get(url='https://www.jd.com/') # 使用requests.get()方法,url就是网站地址
html = resp.text # 1.text属性: 获取响应内容-字符串
print(html)
- 响应对象(res)属性
【1】text :字符串
【2】content :字节流
【3】status_code :HTTP响应码
【4】url :实际数据的URL地址
效果:
这就是终端响应给我们的东西,看不懂就看不懂吧,你可以理解这个响应内容就是京东首页的HTML页面的代码
好我们接着
出现了一个问题:
- 网站如何来判定是人类正常访问还是爬虫程序访问?–检查请求头!!!
# 请求头(headers)中的 User-Agent
# 测试案例: 向测试网站http://httpbin.org/get发请求,查看请求头(User-Agent)
import requests
url = 'http://httpbin.org/get'
res = requests.get(url=url)
html = res.text
print(html)
# 请求头中:User-Agent为-> python-requests/2.22.0 那第一个被网站干掉的是谁???我们是不是需要发送请求时重构一下User-Agent???添加 headers 参数!!!
我们看响应出来是什么?–> “User-Agent”: “python-requests/2.23.0”,
我们看响应出来的一旦是这样的话,你完了,这一看就是爬虫请求,网站会立即禁止掉你的IP
也就是当我们在以后的爬取过程中,一定一定一定要设置请求头,否则他就把你IP给禁掉了,也就是正常访问也不允许了
接下来我们解决掉它
- 重大问题解决 - headers参数
"""
包装好请求头后,向测试网站发请求,并验证
养成好习惯,发送请求携带请求头,重构User-Agent
"""
import requests
url = 'http://httpbin.org/get'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1'}
html = requests.get(url=url,headers=headers).text
# 在html中确认User-Agent
print(html)
我们可以去百度一下,就直接搜常见的User-Agent总结
就会出来好多好多,你就随便用一个就行像这样:
直接复制一个到你设置的这个里面
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1'}
注意一定要把一条复制全了!!!
爬虫编码模块
- urllib.parse模块
1、标准库模块:urllib.parse
2、导入方式:
import urllib.parse
from urllib import parse
作用:
给URL地址中查询参数进行编码
# 示例
编码前:https://www.baidu.com/s?wd=美女
编码后:https://www.baidu.com/s?wd=%E7%BE%8E%E5%A5%B3
常用方法
urlencode({ 参数为字典 })
- 作用
给URL地址中查询参数进行编码,参数类型为字典 - 使用方法
# 1、URL地址中 一 个查询参数
编码前: params = {'wd':'美女'}
编码中: params = urllib.parse.urlencode(params)
编码后: params结果: 'wd=%E7%BE%8E%E5%A5%B3'
# 2、URL地址中 多 个查询参数
编码前: params = {'wd':'美女','pn':'50'}
编码中: params = urllib.parse.urlencode(params)
编码后: params结果: 'wd=%E7%BE%8E%E5%A5%B3&pn=50'
发现编码后会自动对多个查询参数间添加 & 符号
那接下来我们练习一下吧:
https://tieba.baidu.com/f?kw=迪丽热巴&pn=50
目标: 拼接迪丽热巴吧前20页的URL地址,从终端打印输出
1、urllib.parse
2、for循环
from urllib import parse
params = parse.urlencode({'kw':'迪丽热巴'})
url = 'https://tieba.baidu.com/f?{}&pn={}'
for i in range(20):
pn = i * 50
page_url = url.format(params, pn)
print(page_url)
爬去结果:
这个url地址是真实有效的啊,可以点进去看一下,哎算了算了,你还是看我文章吧哈哈哈哈哈
现在我们看一下拼接URL地址的三种方式
# url = 'http://www.baidu.com/s?'
# params = {'wd':'赵丽颖'}
**********************************
params = urllib.parse.urlencode(params)
【1】字符串相加
【2】字符串格式化(占位符 %s)
【3】format()方法
'http://www.baidu.com/s?{}'.format(params)
练习一下看自己是否掌握了:
进入瓜子二手车直卖网官网 - 我要买车 - 请使用3种方法拼接前20页的URL地址,从终端打印输出
官网地址:https://www.guazi.com/langfang/
- 我们来总结一下,写一个比较高级的爬虫,实例如下:
问题: 在百度中输入要搜索的内容,把响应内容保存到本地文件
编码方法使用 urlencode()
import requests
from urllib import parse
# 1. 拼接URL地址
word = input('请输入搜索关键字:')
params = parse.urlencode({'wd':word})
url = 'http://www.baidu.com/s?{}'.format(params)
# 2. 发请求获取响应内容
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1'}
html = requests.get(url=url, headers=headers).text
# 3. 保存到本地文件
filename = '{}.html'.format(word)
with open(filename, 'w', encoding='utf-8') as f:
f.write(html)
响应了之后你应该看到你编辑器左边的文件里多了一个你搜索的东西的名称,点开它,我搜的是赵丽颖啊,我们来看一下:
我们点开那个名字为赵丽颖.html的文件看:
别惊讶,不要理解什么都没有,其实他在下面,这个百度,还跟你玩躲猫猫呢,我们往下滚动鼠标,马上就有内容了:
这个页面是被我们爬下来了,可是我们不可以打开它,因为我们爬去的知识它的html页面,很多别的我们没有爬下来,如果打开的话,我们会看不到完整的页面的,就像这样:
哎,其实我这个挺好的,只是图片没有显示出来,不知道你们的什么样子,你要是搜的是别的可能会有反扒机制,爬取出来的页面再打开的话,可能根本就不能看,界面还特别丑。
quote(‘参数为字符串’)
- 使用方法
http://www.baidu.com/s?wd=赵丽颖
# 对单独的字符串进行编码 - URL地址中的中文字符
word = '美女'
result = urllib.parse.quote(word)
result结果: '%E7%BE%8E%E5%A5%B3'
我们可以把上面的urlencode的百度实例改写一下
import requests
from urllib import parse
# 1. 拼接URL地址
word = input('请输入搜索关键字:')
params = parse.quote(word)
url = 'http://www.baidu.com/s?wd={}'.format(params)
# 2. 发请求获取响应内容
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1'}
html = requests.get(url=url, headers=headers).content.decode('utf-8')
# 3. 保存到本地文件
filename = '{}.html'.format(word)
with open(filename, 'w', encoding='utf-8') as f:
f.write(html)
这样是效果一样的,可以自己运行试试
而这样的方式我们是可以解码的嘿嘿嘿
- unquote(string)解码
# 将编码后的字符串转为普通的Unicode字符串
from urllib import parse
params = '%E7%BE%8E%E5%A5%B3'
result = parse.unquote(params)
result结果: 美女
可以跟上面quote编码的小练习对应一下,其实就是逆推