从服务器上爬取数据
get是把参数数据列表加到提交表单的action属性所指的URL中
值和表单内各个字段一一对应,在URL中可以看到
服务器端用Request.QueryString获取变量的值。
get传送的数据量较小,不能大于2KB。
get安全性非常低。
POST请求向服务器传送数据数据
post是通过HTTP post机制将表单内各个字段与其内容放置在
HTML header内一起传送到action属性所指的URL地址,用户看不到这个过程
服务器端用Request.Form 获取提交的数据。
post传送的数据量较大,一般被默认为不受限制。
post安全性较高
如果没有加密,他们安全级别都是一样的,随便一个监听器都可以
把他们所有数据监听到。
使用post方法response_post = requests.post(url, headers=headers, data=data)
相较于get方法,多了一个参数 data(请求体)一般用字典方式传入
是POST请求存放数据的地方
这是金山词霸页面请求体
这里爬取了金山词霸的翻译
import hashlib
import json
import requests
class fy_spider(object):
def __init__(self, query_str): # 初始化方法
self.query_str = query_str
#初始翻译路径 sign加密过程
sign = (hashlib.md5(("6key_cibaifanyicjbysdlove1" + self.query_str).encode('utf-8')).hexdigest())[0:16]
url = 'https://ifanyi.iciba.com/index.php?c=trans&m=fy&client=6&auth_user=key_ciba'
self.url = url + '&sign=' + sign
self.headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"}
# 获取请求体数据
self.data = self.get_data()
def get_data(self):
'''获取请求体数据'''
data = {
'form': 'auto',
'to': 'auto',
'q': self.query_str
}
return data
def get_data_fromurl(self):
'''从服务器获取数据 并且解码返回'''
response = requests.post(self.url, headers=self.headers, data=self.data)
return response.content.decode()
# {"status":1,"content":{"from":"zh","to":"en","vendor":"ciba","out":"hello","reqid":"b5802985-f49d-4d64-b890-f260aec143d1","version":"v2.18.211028.1","ciba_use":"\u4ee5\u4e0a\u7ed3\u679c\u6765\u81ea\u673a\u5668\u7ffb\u8bd1\u3002","ciba_out":"","err_no":0,"ttsLan":1,"ttsLanFrom":8}}
def parse_data(self, json_str):
'''分析数据'''
dict_data = json.loads(json_str)
#会把json格式的字符串转化成字典格式 ,要导入json库
result = dict_data['content']['out'] #拿取字典的方式
print('{}翻译后的结果是:{}'.format(self.query_str, result))
#翻译前和翻译后的参数
def run(self): # run方法用来执行爬虫
# 1.获取url 请求头 请求体
# 2.发起请求获取响应数据
json_str = self.get_data_fromurl()
# 提取数据
self.parse_data(json_str)
if __name__ == '__main__': # 一个引擎来调用run
query_str = input('请输入要翻译的内容:')
spider = fy_spider(query_str)
spider.run()
运行后实现翻译功能
定义了一个字典,value值写成auto代表自动检测语言种类
在init()方法里面初始化这个请求体
每翻译一次,URL里面的sign会动态变化,所以需要找到生成方法
这里的加密比较复杂,遇到了新的模块哈希列表 md5方法,先不理解
爬取百度图片import requests
import time
class Image(object):
def __init__(self):
self.url = 'https://image.baidu.com/search/acjson?'
# 初始化headers 还要添加cookie
self.headers = {
'Cookie': 'BDqhfp=%E7%8B%97%26%260-10-1undefined%26%267688%26%269; BIDUPSID=A89D164551D3AAC959C6179425FB6BCA; PSTM=1640230314; BAIDUID_BFESS=68132518B3EDE84617D0718BDD51BD89:FG=1; BCLID_BFESS=9657096725878967812; BDSFRCVID_BFESS=jPPOJexroG04Xn7Hv8o2MdhPuLweG7bTDYrEuYGUcqUBUxDVJeC6EG0Pts1-dEu-EHtdogKKQgOTH6KF_2uxOjjg8UtVJeC6EG0Ptf8g0M5; H_BDCLCKID_SF_BFESS=tR3h3RrX26rDHJTg5DTjhPrMMR3TWMT-MTryKKt2ynubO-L9hT5Yb-kr5tvfKx-fKHnRh4oNbxTnSJOl3f5l2M0ZyxomtfQxtNRJQKDE5p5hKq5S5-OobUPU0fJ9LUkqW2cdot5yBbc8eIna5hjkbfJBQttjQn3hfIkj2CKLK-oj-D_CDjt-3e; __yjs_duid=1_766df5a7075d1593a720e8dd97c7d39f1640336455495; indexPageSugList=%5B%22%E7%8B%97%22%2C%22%E6%A0%91%22%5D; H_PS_PSSID=35635_34447_35104_31253_35236_35488_35602_34584_35491_35407_34578_35644_26350_35649_35562; BA_HECTOR=25ala520a52kal208n1gsia5e0q; BDRCVFR[X_XKQks0S63]=mk3SLVN4HKm; userFrom=www.baidu.com; firstShowTip=1; BDRCVFR[dG2JNJb_ajR]=mk3SLVN4HKm; BDRCVFR[-pGxjrCMryR]=mk3SLVN4HKm; ab_sr=1.0.1_MjFiMTczNmFlNWQ2ODI4MzZmOTE4YjNhYzc0NjA3NGIxYWU5ZWU1MzM2MzVjYmU5MTNiNjk0NTc3ZjAzZDNhOWFhZTgxMjBkZTFjMzQwMzQ1MDlmZDRkMTUwZDRmM2JkN2Q0NjYzYTY1OTQzMDVmMjhlMGI3NDg2YzdmYjZmNmVmODJjZjIzOTg2NmJhZmQ1MTc5NTYwZDJjM2VhZGMxYg==',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36'
}
self.params = {
'tn': 'resultjson_com',
'logid': '10406596907840461257',
'ipn': 'rj',
'ct': '201326592',
'is': '',
'fp': ' result',
'fr': '',
'word': '狗',
'queryWord': '狗',
'cl': '2',
'lm': '-1',
'ie': 'utf - 8',
'oe': 'utf - 8',
'adpicid': '',
'st': '-1',
'z': '',
'ic': '0',
'hd': '',
'latest': '',
'copyright': '',
's': '',
'se': '',
'tab': '',
'width': '',
'height': '',
'face': '0',
'istype': '2',
'qc': '',
'nc': '1',
'expermode': '',
'nojc': '',
'isAsync': '',
'pn': '', # pn需要重新编译
'rn': '30',
'gsm': 'f0',
'time': '' # 时间戳需要重新编译
}
# 定义空列表来装图片
self.imag_list = []
def get_image(self, num):
for i in range(0, num): # 确定拿了多少页图片
'''生成实时的时间戳,int取整 '''
self.params['time'] = int(time.time() * 1000)
self.params['pn'] = i * 30 # 页数乘30得到图片数量
respense = requests.get(url=self.url, headers=self.headers, params=self.params)
for j in range(0, len(respense.json()['data']) - 1):
self.imag_list.append(respense.json()['data'][j]['thumbURL'])
def save_image(self):
n = 1
for i in self.imag_list:
image = requests.get(url=i)
with open('./图片/{}.jpg'.format(n), 'wb') as f:
f.write(image.content)
n += 1
if __name__ == '__main__':
image = Image()
image.get_image(3)
image.save_image()
输入参数3后,表示爬取3页,共90张
运行后成功得到图片,被保存到本地路径
注意:
初始化headers里 有Cookie 和 User-Agent,
也要初始化payload 里面的参数,里面很多东西是没有用的,我没有具体测试哪些可以删
获取图片
requests.get()把该传入的参数传入
定义了一下pn和时间戳
再写一个for循环 解析json数据:使用json方法获取data,减一是因为第30条数据为空
append() 方法用于在列表末尾添加新的对象
append() 方法把每张图片的url路径添加到了 ['thumbURL'] 列表中额
保存图片到本地首先for循环遍历存放图片链接的列表、
然后用get方法直接通过链接获取图片
最后用with open 把图片保存到本地
图片文件名用变量 n