导入 Requests 模块:
import requests
获取网页:
r = requests.get('http://xxx.xxx')
此时,我们获取了 Response 对象 r,我们可以通过 r 获取所需信息。Requests 简便的 API 意味着所有 HTTP 请求类型都是显而易见的,我们来看一下使用常见 HTTP 请求类型 get、post、put、delete 的示例:
r = requests.get('http://xxx.xxx/get')
r = requests.post('http://xxx.xxx/post', data = {'key':'value'})
r = requests.put('http://xxx.xxx/put', data = {'key':'value'})
r = requests.delete('http://xxx.xxx/delete')
通常我们会设置请求的超时时间,Requests 使用 timeout 参数来设置,单位是秒,示例如下:
r = requests.head('http://xxx.xxx/get', timeout=1)
2.2 参数传递
在使用 get 方式发送请求时,我们会将键值对形式参数放在 URL 中问号的后面,如:http://xxx.xxx/get?key=val ,Requests 通过 params 关键字,以一个字符串字典来提供这些参数。比如要传 key1=val1 和 key2=val2 到 http://xxx.xxx/get,示例如下:
pms= {'key1': 'val1', 'key2': 'val2'}
r = requests.get("http://xxx.xxx/get", params=pms)
Requests 还允许将一个列表作为值传入:
pms= {'key1': 'val1', 'key2': ['val2', 'val3']}
注:字典里值为 None 的键都不会被添加到 URL 的查询字符串里。
2.3 响应内容
我们来获取一下服务器的响应内容,这里地址 https://api.github.com 为例:
import requests
r = requests.get('https://api.github.com')
print(r.text)
# 输出结果
# {"current_user_url":"https://api.github.com/user","current_user...
当访问 r.text 之时,Requests 会使用其推测的文本编码,我们可以使用 r.encoding 查看其编码,也可以修改编码,如:r.encoding = ‘GBK’,当改变了编码,再次访问 r.text 时,Request 都将会使用 r.encoding 的新值。
1)二进制响应内容 比如当我们要获取一张图片的数据,会以二进制的方式获取响应数据,示例如下:
from PIL import Image
from io import BytesIO
i = Image.open(BytesIO(r.content))
2)JSON响应内容 Requests 中已经内置了 JSON 解码器,因此我们可以很容易的对 JSON 数据进行解析,示例如下:
import requests
r = requests.get('https://api.github.com')
r.json()
注:成功调用 r.json() 并不一定响应成功,有的服务器会在失败的响应中包含一个 JSON 对象(比如 HTTP 500 的错误细节),这时我们就需要查看响应的状态码了 r.status_code 或 r.raise_for_status(),成功调用时 r.status_code 为 200,r.raise_for_status() 为 None。
2.4 自定义请求头
当我们要给请求添加 headers 时,只需给 headers 参数传递一个字典即可,示例如下:
url = 'http://xxx.xxx'
hds= {'user-agent': 'xxx'}
r = requests.get(url, headers=hds)
注:自定义 headers 优先级是低于一些特定的信息的,如:在 .netrc 中设置了用户认证信息,使用 headers 设置的授权就不会生效,而当设置了 auth 参数,.netrc 的设置会无效。所有的 headers 值必须是 string、bytestring 或者 unicode,通常不建议使用 unicode。
练习:
爬取安全客的标题
import re
import requests
import time
url = "https://www.anquanke.com/"
# header伪装
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
}
# 获取网页内容
req = requests.get(url, headers)
# 获取网页状态码
# print(req)
# 获取全部网页内容
# print(req.text)
# 将内容保存到本地文件中
with open("anquanke.txt", "w", encoding="utf-8") as f1:
data = f1.write(requests.get(url).text)
# 读取本地文件
with open("anquanke.txt", "r", encoding="utf-8") as f2:
content = f2.read()
# 表达式原内容
# 智在粤港澳,阿里云原生安全2.0应运而生
# 编写表达式
m = re.findall('(.*?)', content)
print(f"安全客安全监测与响应中心 每日安全热点\t{time.strftime('%Y-%m-%d')}\n")
# 获取网页标题及链接
num = 9
for i in m:
print(f"标题{len(m) - num}:{i[1]}")
print(f"链接:https://www.anquanke.com/{i[0]}")
num -= 1
爬取图片
import requests
import re
"""
1.确定网址
2.搭建关系 发送请求 接受响应
3.筛选数据
4.保存本地
"""
url = 'https://wallspic.com/tag/iphone/for_mobile'
response = requests.get(url = url).text
contentUrl = re.findall(r'contentUrl":"(https://img\d.wallspic.com/crops/.*?)"', response)
j = 0
for i in contentUrl:
# print(contentUrl)
j += 1
Content = requests.get(url = i).content
print(Content)
with open(f'Wallspic-{j}.jpg', mode = 'wb') as f:
f.write(Content)
print(f'[+] 已保存完成{j}张壁纸!')
爬取网易云音乐歌单的歌名和歌手
import requests
import fake_useragent
import re
"""
1.确定网址
2.搭建关系 发送请求 接受响应
3.筛选数据
4.保存本地
"""
#
url = "https://music.163.com/discover/toplist?id=3778678"
ua = fake_useragent.UserAgent()
header = {
'user-agent': ua.random
}
response = requests.get(url = url, headers = header)
r = response.text
# print(r)
response.close()
# 包含歌曲和歌曲链接的一段字符串
#
all = ''.join(re.findall(r'(.*?)
', r))
# print(all)
# 从 all 里提取歌名
# 我记得
name = re.findall(r'(.*?)', all)
# 从 all 里提取歌曲地址
song_url = re.findall(r'.*?', all)
# 从页面全部源代码中提取歌手的信息
# "artists":[{"id":6731,"name":"赵雷","tns":[],"alias":[]}],"stat
singer = re.findall(r'"artists":\[{"id":.*?,"name":"(.*?)",', r)
# 打印
for i in range(len(name)):
print(name[i], '\t', singer[i], '\t', song_url[i])
练习
爬取QQ音乐歌单
import requests
from fake_useragent import UserAgent
import re
from lxml import etree
import csv
import time
# 打开csv文件
f = open('QQ音乐热歌榜单.csv', mode = 'w', newline = '', encoding = 'utf-8-sig')
w_headers = csv.DictWriter(f, fieldnames = ['歌名','歌手','歌曲地址'])
w_headers.writeheader()
# 目标地址
url = 'https://y.qq.com/n/ryqq/toplist/4'
# 请求头
headers = {
'user-agent' : UserAgent().random
}
time.sleep(2)
#发送请求
response = requests.get(url = url, headers = headers)
html = response.text
#### xpath 解析提取
h = etree.HTML(html)
Dict = {}
data = h.xpath('//div[@class="songlist__item songlist__item--even"]')[0]
Dict['歌名'] = data.xpath('//div[@class="songlist__songname"]/span/a[2]/text()')
Dict['歌手'] = data.xpath('//div[@class="songlist__artist"]/a/text()')
s = 'https://y.qq.com'
src = data.xpath('//div[@class="songlist__songname"]/span/a[2]/@href')
print(src)
for i in range(0,len(src)):
src[i] = s + src[i]
Dict['歌曲地址'] = src
w = {}
for i in range(0, 20):
w['歌名'] = Dict['歌名'][i]
w['歌手'] = Dict['歌手'][i]
w['歌曲地址'] = Dict['歌曲地址'][i]
w_headers.writerow(w)
print(f'[*] 已保存完成{i+1}首歌曲信息')
### re正则表达式解析提取数据
Dict = {}
title = re.finditer(r'(?P.*?)<.*?,html)
j = 0
for i in title:
j += 1
Dict['歌名'] = i.group('name')
Dict['歌手'] = i.group('singer')
Dict['歌曲地址'] = 'https://y.qq.com' + i.group('src')
w_headers.writerow(Dict)
print(f'[*] 已保存完成{j}首歌曲信息')
爬取链家的房源信息
import csv
import requests
import fake_useragent
from lxml import etree
f = open('链家租房信息.csv', mode = 'w', newline = '', encoding = 'utf-8-sig')
writer = csv.DictWriter(f, fieldnames = ['地区','小区','简介','月租'])
writer.writeheader()
for i in range(1, 4):
ua = fake_useragent.UserAgent()
url = "https://bj.lianjia.com/zufang/pg{}/".format(i)
header = {"User-Agent": ua.random}
# 访问获取源代码
r = requests.get(url = url, headers = header).text
# print(r)
html = etree.HTML(r)
# 先获取整个列表
data = html.xpath('//div[@class="content__list"]//div[@class="content__list--item"]')
print(data)
#再循环挨个提取相关信息
for i in data:
# 创建一个字典,把信息放到字典里面
# 方便后期保存
d = {}
d['地区'] = i.xpath('.//p[@class="content__list--item--des"]/a[1]/text()')
d['小区'] = i.xpath('.//p[@class="content__list--item--des"]/a[3]/text()')
d['简介'] = i.xpath('.//p[@class="content__list--item--des"]/text()')
d['月租'] = i.xpath('.//span[@class="content__list--item-price"]/em/text()')
print(d)
writer.writerow(d)
爬取漏洞库的漏洞信息
import csv
import requests
import fake_useragent
from lxml import etree
f = open('漏洞库.csv', mode = 'w', newline = '', encoding = 'utf-8-sig')
writer = csv.DictWriter(f, fieldnames = ['Title', 'EDB-ID', 'CVE', 'Author', 'Type', 'Date', 'DOWNLOAD'])
writer.writeheader()
ua = fake_useragent.UserAgent()
#url = 'https://www.exploit-db.com/exploits/51467'
header = {
'user-agent': ua.random
}
zzz = []
for i in range(0,300):
zzz.append(f"https://www.exploit-db.com/exploits/{51515-i}")
for i in range(0,300):
req = requests.get(url=zzz[i], headers=header)
if int(req.status_code) == 200:
h = etree.HTML(req.text)
Dict = {}
Dict['Title'] = h.xpath('//div[@class="row justify-content-md-center"]/h1/text()')
b = h.xpath('//div[@class="info info-horizontal"]/div')[0]
Dict['EDB-ID'] =b.xpath('//div[@class="col-6 text-center"]/h6/text()')
Dict['CVE'] = b.xpath('//div[@class="col-6 text-center"]/h6/text()')
Dict['Author'] = b.xpath('//div[@class="col-6 text-center"]/h6/text()')
Dict['Type'] = b.xpath('//div[@class="col-6 text-center"]/h6/text()')
Dict['Date'] = b.xpath('//div[@class="col-6 text-center"]/h6/text()')
asd = h.xpath('//div[@class="stats h5 text-center"]/a[1]/@href')
Dict['DOWNLOAD'] = f"https://www.exploit-db.com{asd[0]}"
print(Dict)
writer.writerow(Dict)