1.查看本地发送过去的头文件
import requests
html = requests.get(url='http://httpbin.org/get').text
print(html)
2.编码模块使用 //使用原因:URL不能识别中文编码,中文转换为编码模式)
(1)urlencode()方法
from urllib import parse
params = parse.urlencode({'wd':'赵丽颖'})
url1 = 'http://www.baidu.com/s?' + params #URL拼接方式
url2 = 'http://www.baidu.com/s?%s' % params
url3 = 'http://www.baidu.com/s?{}'.format(params)
print(url1)
print(url2)
print(url3)
语法:format方法,格式化输出 (传参方式)
'{}_第{}页.html'.format('赵丽颖',9) 输出:‘赵丽颖_第9页.html’
(2)quote()方法 //字符串编码,同上类似
params = parse.quote('赵丽颖')
(3)例子 //百度搜索中从终端输入搜索关键字,保存HTML文件到本地
import requests
# 1.拼接URL
keyword = input('请输入关键字:')
params = parse.urlencode({'wd':keyword})
url = 'http://www.baidu.com/s?{}'.format(params)
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36'}
# 2.发送请求获取响应内容
html = requests.get(url=url, headers=headers).content.decode('utf-8') #直接使用text替代.content.decode('utf-8')可能有乱码
# 3.保存文件到本地
filename = '{}.html'.format(keyword)
with open(filename, 'w', encoding='utf-8') as f:
f.write(html)
#windows默认gbk,linux为utf-8
3.百度贴吧数据抓取实战
需求:a.输入贴吧名称(赵丽颖吧) b.输入起始页:1 c.输入终止页:2 d.保存到本地文件: 赵丽颖吧_第1页.html、赵丽颖吧_第2页.html
思路:
(1)查看抓取的数据在响应内容中是否存在(右键--查看网页源码--搜索所抓数据关键字)
(2)查看并分析URL地址规律:
第1页:http://tieba.baidu.com/f?kw=???&pn=0
第2页:http://tieba.baidu.com/f?kw=???&pn=50
第n页:pn=(n-1)*50
(3)发请求获取响应内容
(4)保存到本地文件
代码如下:
import requests
from urllib import parse
import time
import random
class BaiduSpider:
def __init__(self):
"""定义常用变量"""
self.url = 'http://tieba.baidu.com/f?kw={}&pn={}'
self.headers = headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36'}
def get_html(self, url):
"""请求的功能函数,获取响应内容html"""
html = requests.get(url=url, headers=self.headers).content.decode('utf-8')
return html
def parse_html(self):
""""解析的功能函数,解析提取数据"""
pass
def save_html(self, filename, html):
""""数据处理的功能函数,把数据存入数据库,本地文件..."""
with open(filename, 'w', encoding='utf-8') as f:
f.write(html)
def run(self):
""""程序入口函数"""
name = input('请输入贴吧名:')
start = int(input('请输入起始页:'))
end = int(input('请输入终止页:'))
# 编码
params = parse.quote(name)
for page in range(start, end + 1):
pn = (page - 1) * 50
page_url = self.url.format(params, pn)
# 调用请求功能函数
html = self.get_html(url=page_url)
#调用保存函数功能函数
filename = '{}_第{}页.html'.format(name, page)
self.save_html(filename, html)
#终端提示
print('第%d页抓取完成' % page)
# 控制数据抓取频率,每抓取一个页面随机休眠一段时间
time.sleep(random.randint(1,2)) #每抓取一个页面随机休眠1-2分钟
if __name__ == '__main__':
spider = BaiduSpider()
spider.run()