1.较为复杂的get请求:
有时候当我们需要爬取不止一页网页的数据时,可能需要在每一页请求数据时在终端输入需要的信息,以此来实现爬虫过程中不同url的需求。
下面是一个爬取贴吧的代码示例,能够爬取用户指定吧名和指定页数范围的内容。
import urllib.request
import urllib.parse
import os
# 全部url共同的部分
url = 'http://tieba.baidu.com/f?ie=utf-8&'
# 从终端读取吧名
ba_name = input("请输入您要查找的吧名:")
# 从终端读取起始页数
start_page = int(input("请输入您要查找的起始页数"))
# 从终端读取结束页数
end_page = int(input("请输入您要查找的结束页数"))
# 验证是否存在ba_name文件夹,不存在则创建文件夹
if not os.path.exists(ba_name):
os.mkdir(ba_name)
# 在循环中依次爬取每一页的数据
for page in range(start_page, end_page + 1):
# 利用page这个当前页拼接url的过程
data = {
'kw': ba_name,
'pn': (page - 1) * 50,
}
data = urllib.parse.urlencode(data)
url_t = url + data
print(url_t)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) '
'AppleWebKit/537.36 (KHTML, like Gecko)'
' Chrome/63.0.3239.132 Safari/537.36',
}
# 构造请求对象
url_t = urllib.request.Request(url_t, headers=headers)
print("第%s页开始下载......" % page)
# 构造响应对象
response = urllib.request.urlopen(url_t)
# 构造文件名
filename = ba_name + '_' + str(page) + '.html'
# 构造文件存储路径
filepath = ba_name + '/' + filename
# 创建文件
with open(filepath, 'wb') as fp:
fp.write(response.read())
print("第%s页下载完毕......" % page)
2. Handler 处理器的使用
handler处理器同样可以发送请求获取响应,但是Handler具有一些高级功能,例如使用代理和cookie等
(一)基本使用方法:
- 创建一个handler对象。
- 同股票handler创建一个opener对象,可以利用opener直接发送请求。
- 利用Rquest创建请求对象。
- 最后通过opener和请求对象获取响应。
下面代码是handler的基本使用方法:
import urllib.request
import urllib.parse
url = 'https://www.baidu.com/'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) '
'AppleWebKit/537.36 (KHTML, like Gecko)'
' Chrome/63.0.3239.132 Safari/537.36',
}
# 创建一个handler
handler = urllib.request.HTTPHandler()
# 通过handler创建一个opener
# opener是一个对象,可以利用opener直接发送请求
opener = urllib.request.build_opener(handler)
# 构建请求对象
request = urllib.request.Request(url, headers=headers)
# 发送请求
response = opener.open(request)
print(response.read().decode())
(二)代理高级用法:
代理:及帮忙做的中介
正向代理:代理客户端获取数据
反向代理:代理服务端提供数据
配置:
浏览器配置(以谷歌浏览器为例)
右边三点==》 设置==》 高级==》代理 ==》局域网设置 ==》 为LAN使用代理==》 输入ip和端口号即可
代码配置
handler = urllib.request.ProxyHandler({'http': '114.215.95.188:3128'})
步骤:
- 第一步也是最重要的一步:利用代理IP地址创建handler。
- 利用Handler创建opener。
- 建立请求,获取相应。
下面是相关的实例代码:
import urllib.request
import urllib.parse
# 通过代理的IP地址创建handler
handler = urllib.request.ProxyHandler({'http': '114.215.95.188:3128'})
# 常见opener
opener = urllib.request.build_opener(handler)
url = 'https://www.baidu.com/s?wd=ip&rsv_spt=1&rsv_iqid=0xcdbe4c330001a013&issp=1&f=3&rsv_bp=1&rsv_idx=2&ie=utf-8&rqlang=cn&tn=baiduhome_pg&rsv_' \
'enter=1&oq=%25E8%258A%25B1%25E5%2588%25BA%25E4%25BB%25A3%25E7%2590%2586%25E9%25AA%258C%25E8%25AF%2581&input' \
'T=1238&rsv_t=8eb6BXF148ag8vmsaZ3CuOANm3QvA42z7GawNIHYwu0GaXuOB531V20rNme0okakZFsw&rsv_pq=d23d080500020f17&rsv_sug3=' \
'28&rsv_sug1=22&rsv_sug7=100&rsv_sug2=0&rsv_sug4=1238'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) '
'AppleWebKit/537.36 (KHTML, like Gecko)'
' Chrome/63.0.3239.132 Safari/537.36',
}
request = urllib.request.Request(url, headers=headers)
response = opener.open(request)
print(response.read().decode())
with open('ip.html', 'w') as fp:
fp.write(response.read().decode())
(三)cookie高级用法:
cookie是什么? http 协议是无状态的 网站登录时候的问题,可以简单的认为是用来记录身份信息的,相当于给用户的一套身份证。
模拟登录 (使用cookie进行模拟登陆)
重点:在合适的请求响应中获取cookie,一般在点击涉及用户信息的请求中可以获取用户的cookie。
如果不适用Handler处理器,用一般的请求也可以在请求头部中写入cookie信息获取请求头,这种方法必须在浏览器发送请求时利用抓包工具抓取详细的cookie信息。
下面是不使用handler处理器进行的代码操作:
import urllib.request
import urllib.parse
url = 'http://www.renren.com/969499615/profile'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
'Cookie': 'anonymid=jr3mavy6-2yhg7z; depovince=ZGQT; _r01_=1; _ga=GA1.2.1316689756.1547911144; _'
'gid=GA1.2.1818004214.1547911144; JSESSIONID=abcrFAr_Sa7fPe-QRsPHw; ick_login=39446524-'
'260f-4714-a3d6-8bdb9ff6a681; wp_fold=0; ick=5535a436-9f63-4ed5-94ce-0174d2c49a68; jebec'
'ookies=3ff6473a-f7f1-4105-8c9d-74715ff4c090|||||; _de=9061F4BBA90AC7E232540B3EF7654E2A; '
'p=e4a38e1cefd35bd2e1bb5e462b25d9265; first_login_flag=1; ln_uact=15521093428; ln_hurl=ht'
'tp://head.xiaonei.com/photos/0/0/men_main.gif; t=bdb9b7e1fe466769655943e20e4384d35; socie'
'tyguester=bdb9b7e1fe466769655943e20e4384d35; id=969499615; xnsid=966de04a; ver=7.0; loginf'
'rom=null; jebe_key=4b6c9289-4279-4d5b-a730-8bb81705b3f4%7C195f1926f11e580b33a17dd9cef3228d'
'%7C1547959411717%7C1%7C1547959421472',
'GET': 'http://www.renren.com/969499615/profile HTTP/1.1'
}
request = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(url)
# print(response.read().decode())
# print('--'*100)
# print(response.read().decode())
with open('renrenwang1.html', 'wb') as fp:
fp.write(response.read())
下面是使用handler处理器处理待cookie信息的请求(模拟真实的浏览器,当发生完post请求的时候,将cookie保存到代码中):
步骤:
- 通过cookiejar创建一个handler。
- 通过handler创建一个opener。
- 抓包获取表单数据再发送请求,这时候opener会记住cookie信息,当再次利用opener访问网站时就能顺利访问。
下面是具体的代码示例:
import urllib.request
import urllib.parse
import http.cookiejar
# 模拟真实的浏览器,当发生完post请求的时候,将cookie保存到代码中
cj = http.cookiejar.CookieJar()
# 通过 cookiejar 创建一个handler
handler = urllib.request.HTTPCookieProcessor(cj)
# 通过handler创建opener
opener = urllib.request.build_opener(handler)
post_url = 'http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=2019001240179'
data = {
'email': '15521093428',
'icode': '',
'origURL': 'http://www.renren.com/home',
'domain': 'renren.com',
'key_id': '1',
'captcha_type': 'web_login',
'password': '86043d5b0132f5f5d3f461d6d5ccf4d4b3b40d557828f70e8b08de02dcb01ecf',
'rkey': '4a08d7117a9b2c2e1ad82f6c5dad748b',
'f': 'http%3A%2F%2Fguide.renren.com%2Ffillinfonew',
}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) '
'AppleWebKit/537.36 (KHTML, like Gecko)'
' Chrome/63.0.3239.132 Safari/537.36',
}
data = urllib.parse.urlencode(data).encode()
request = urllib.request.Request(post_url, headers=headers)
response = opener.open(request, data=data)
url = 'http://www.renren.com/969499615/profile'
request = urllib.request.Request(url, headers=headers)
response = opener.open(request)
with open('renrenwang2.html', 'wb') as fp:
fp.write(response.read())