从服务器上爬取数据
get是把参数数据列表加到提交表单的action属性所指的URL中
值和表单内各个字段一一对应,在URL中可以看到
服务器端用Request.QueryString获取变量的值。
get传送的数据量较小,不能大于2KB。
get安全性非常低。
向服务器传送数据数据
post是通过HTTP post机制将表单内各个字段与其内容放置在
HTML header内一起传送到action属性所指的URL地址,用户看不到这个过程
服务器端用Request.Form 获取提交的数据。
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