Python 爬虫笔记2

2021/12/27 12:37:29

本文主要是介绍Python 爬虫笔记2,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

请求方法:GET & POST

GET 请求

从服务器上爬取数据

        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()方法里面初始化这个请求体

 sign加密代码

每翻译一次,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


   

        

       



这篇关于Python 爬虫笔记2的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程