Pyspider 中采用了 tornado 库来做 http 请求,在请求过程中可以添加各种参数,例如请求链接超时时间,请求传输数据超时时间,请求头等等,但是根据pyspider的原始框架,给爬虫添加参数只能通过 crawl_config这个Python字典来完成(如下所示),框架代码将这个字典中的参数转换成 task 数据,进行http请求。这个参数的缺点是不方便给每一次请求做随机请求头。

crawl_config = {

"user_agent": "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36",

"timeout": 120,

"connect_timeout": 60,

"retries": 5,

"fetch_type": 'js',

"auto_recrawl": True,

}

这里写出给爬虫添加随机请求头的方法:

1、编写脚本,将脚本放置在 pyspider 的 libs 文件夹下,命名为 header_switch.py

#!/usr/bin/env python

# -*- coding:utf-8 -*-

# Created on 2017-10-18 11:52:26

import random

import time

class HeadersSelector(object):

"""

Header 中缺少几个字段 Host 和 Cookie

"""

headers_1 = {

"Proxy-Connection": "keep-alive",

"Pragma": "no-cache",

"Cache-Control": "no-cache",

"User-Agent": "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36",

"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",

"DNT": "1",

"Accept-Encoding": "gzip, deflate, sdch",

"Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4",

"Referer": "https://www.baidu.com/s?wd=%BC%96%E7%A0%81&rsv_spt=1&rsv_iqid=0x9fcbc99a0000b5d7&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&rqlang=cn&tn=baiduhome_pg&rsv_enter=0&oq=If-None-Match&inputT=7282&rsv_t",

"Accept-Charset": "gb2312,gbk;q=0.7,utf-8;q=0.7,*;q=0.7",

} # 网上找的浏览器

headers_2 = {

"Proxy-Connection": "keep-alive",

"Pragma": "no-cache",

"Cache-Control": "no-cache",

"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0",

"Accept": "image/gif,image/x-xbitmap,image/jpeg,application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,*/*",

"DNT": "1",

"Referer": "https://www.baidu.com/link?url=c-FMHf06-ZPhoRM4tWduhraKXhnSm_RzjXZ-ZTFnPAvZN",

"Accept-Encoding": "gzip, deflate, sdch",

"Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4",

} # window 7 系统浏览器

headers_3 = {

"Proxy-Connection": "keep-alive",

"Pragma": "no-cache",

"Cache-Control": "no-cache",

"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0",

"Accept": "image/x-xbitmap,image/jpeg,application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,*/*",

"DNT": "1",

"Referer": "https://www.baidu.com/s?wd=http%B4%20Pragma&rsf=1&rsp=4&f=1&oq=Pragma&tn=baiduhome_pg&ie=utf-8&usm=3&rsv_idx=2&rsv_pq=e9bd5e5000010",

"Accept-Encoding": "gzip, deflate, sdch",

"Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.7,en;q=0.6",

} # Linux 系统 firefox 浏览器

headers_4 = {

"Proxy-Connection": "keep-alive",

"Pragma": "no-cache",

"Cache-Control": "no-cache",

"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:55.0) Gecko/20100101 Firefox/55.0",

"Accept": "*/*",

"DNT": "1",

"Referer": "https://www.baidu.com/link?url=c-FMHf06-ZPhoRM4tWduhraKXhnSm_RzjXZ-ZTFnP",

"Accept-Encoding": "gzip, deflate, sdch",

"Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.7,en;q=0.6",

} # Win10 系统 firefox 浏览器

headers_5 = {

"Connection": "keep-alive",

"Pragma": "no-cache",

"Cache-Control": "no-cache",

"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64;) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 Edge/15.15063",

"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",

"Referer": "https://www.baidu.com/link?url=c-FMHf06-ZPhoRM4tWduhraKXhnSm_RzjXZ-",

"Accept-Encoding": "gzip, deflate, sdch",

"Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.7,en;q=0.6",

"Accept-Charset": "gb2312,gbk;q=0.7,utf-8;q=0.7,*;q=0.7",

} # Win10 系统 Chrome 浏览器

headers_6 = {

"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",

"Accept-Encoding": "gzip, deflate, sdch",

"Accept-Language": "zh-CN,zh;q=0.8",

"Pragma": "no-cache",

"Cache-Control": "no-cache",

"Connection": "keep-alive",

"DNT": "1",

"Referer": "https://www.baidu.com/s?wd=If-None-Match&rsv_spt=1&rsv_iqid=0x9fcbc99a0000b5d7&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&rq",

"Accept-Charset": "gb2312,gbk;q=0.7,utf-8;q=0.7,*;q=0.7",

"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0",

} # win10 系统浏览器

def __init__(self):

pass

def select_header(self):

n = random.randint(1, 6)

switch={

1: self.headers_1

2: self.headers_2

3: self.headers_3

4: self.headers_4

5: self.headers_5

6: self.headers_6

}

headers = switch[n]

return headers

其中,我只写了6个请求头,如果爬虫的量非常大,完全可以写更多的请求头,甚至上百个,然后将 random的随机范围扩大,进行选择。

2、在pyspider 脚本中编写如下代码:

#!/usr/bin/env python

# -*- encoding: utf-8 -*-

# Created on 2017-08-18 11:52:26

from pyspider.libs.base_handler import *

from pyspider.addings.headers_switch import HeadersSelector

import sys

defaultencoding = 'utf-8'

if sys.getdefaultencoding() != defaultencoding:

reload(sys)

sys.setdefaultencoding(defaultencoding)

class Handler(BaseHandler):

crawl_config = {

"user_agent": "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36",

"timeout": 120,

"connect_timeout": 60,

"retries": 5,

"fetch_type": 'js',

"auto_recrawl": True,

}

@every(minutes=24 * 60)

def on_start(self):

header_slt = HeadersSelector()

header = header_slt.select_header() # 获取一个新的 header

# header["X-Requested-With"] = "XMLHttpRequest"

orig_href = 'http://sww.bjxch.gov.cn/gggs.html'

self.crawl(orig_href,

callback=self.index_page,

headers=header) # 请求头必须写在 crawl 里,cookies 从 response.cookies 中找

@config(age=24 * 60 * 60)

def index_page(self, response):

header_slt = HeadersSelector()

header = header_slt.select_header() # 获取一个新的 header

# header["X-Requested-With"] = "XMLHttpRequest"

if response.cookies:

header["Cookies"] = response.cookies

其中最重要的就是在每个回调函数 on_start,index_page 等等 当中,每次调用时,都会实例化一个 header 选择器,给每一次请求添加不一样的 header。要注意添加的如下代码:

header_slt = HeadersSelector()

header = header_slt.select_header() # 获取一个新的 header

# header["X-Requested-With"] = "XMLHttpRequest"

header["Host"] = "www.baidu.com"

if response.cookies:

header["Cookies"] = response.cookies

当使用 XHR 发送 AJAX 请求时会带上 Header,常被用来判断是不是 Ajax 请求, headers 要添加 {‘X-Requested-With': ‘XMLHttpRequest'} 才能抓取到内容。

确定了 url 也就确定了请求头中的 Host,需要按需添加,urlparse包里给出了根据 url解析出 host的方法函数,直接调用netloc即可。

如果响应中有 cookie,就需要将 cookie 添加到请求头中。

如果还有别的伪装需求,自行添加。

如此即可实现随机请求头,完。

以上这篇Pyspider中给爬虫伪造随机请求头的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

本文标题: Pyspider中给爬虫伪造随机请求头的实例

本文地址: http://www.cppcns.com/jiaoben/python/227296.html

python伪造请求头x-forwarded-for的作用_Pyspider中给爬虫伪造随机请求头的实例相关推荐

  1. NO.2_python_scrapy_反爬虫(随机请求头IP代理)取消链接去重

    1.随机请求头 # -*- coding: utf-8 -*- """ 所有请求头的USER_AGENTS网址 http://www.useragentstring.co ...

  2. python choice添加下拉框_自定义Django Form中choicefield下拉菜单选取数据库内容实例...

    工作中遇到的问题,自定义了一个forms.form表单,某项需要作出下拉菜单,下拉菜单中的选项需要从数据库(objectForm models)中提取. form.py为: class objectF ...

  3. python爬虫电影输出到文件中_python爬虫用scrapy获取影片的实例分析

    我们平时生活的娱乐中,看电影是大部分小伙伴都喜欢的事情.周围的人总会有意无意的在谈论,有什么影片上映,好不好看之类的话题,没事的时候谈论电影是非常不错的话题.那么,一些好看的影片如果不去电影院的话,在 ...

  4. 深入理解HTTPS及在iOS系统中适配HTTPS类型网络请求(上)

    2019独角兽企业重金招聘Python工程师标准>>> 深入理解HTTPS及在iOS系统中适配HTTPS类型网络请求 一.引言 本篇博客主要讨论如何在客户端与服务端之间进行HTTPS ...

  5. python 随机请求头_为了爬虫换个头,我用python实现三种随机请求头方式!

    相信大家在爬虫中都设置过请求头 user-agent 这个参数吧? 在请求的时候,加入这个参数,就可以一定程度的伪装成浏览器,就不会被服务器直接识别为spider.demo.code ,据我了解的,我 ...

  6. python中requests库的用途-python中requests库的post请求

    用python来验证接口正确性,主要流程有4步: 1 设置url 2 设置消息头 3 设置消息体 4 获取响应 5 解析相应 6 验证数据 Content-Type的格式有四种:分别是applicat ...

  7. 数据采集与清洗基础习题(二)Python爬虫常用模块,头歌参考答案

    数据采集习题参考答案,会持续更新,点个关注防丢失.为了方便查找,已按照头歌重新排版,朋友们按照头歌所属门类查找实训哦,该篇为Python爬虫常用模块. 创作不易,一键三连给博主一个支持呗. 文章目录 ...

  8. 爬取斗鱼LOL主播人气数据,并显示排行榜 [网络爬虫] [应用案例][请求头][模块]

    您的"关注"和"点赞",是信任,是认可,是支持,是动力- 如意见相佐,可留言. 本人必将竭尽全力试图做到准确和全面,终其一生进行修改补充更新. 文章目录 1 爬 ...

  9. [Python爬虫] 2-网络请求

    # I.urllib库:最基本的网络请求库,可以模拟浏览器的行为,向指定的服务器发送一个请求,并且可以保存返回的数据,常用函数如下: # 1)urlopen:抓取内容 from urllib impo ...

最新文章

  1. 在CentOS 6.3 64bit上如何从源码生成rpm包?
  2. 关于端口映射的一个命令
  3. Python 官方报告:哪些库最受欢迎、PyCharm 比 VScode更香?
  4. 天文学家搞医术,Science也挡不住
  5. 爱创课堂每日一题101天-哪些操作会造成内存泄漏?
  6. RIPv1 与 RIPv2 基础配置
  7. mysql update 几万 非常慢_mysqL update 太慢,求解决方法
  8. matlab if m不等于0,matlab问题clearfor a=0.1:0.1:50for b=0.1:0.1:20for m=0.1:0.1:5
  9. Java的这个强大功能,很多人都不知道
  10. python椭圆识别_Python+pillow计算椭圆图形几何中心
  11. ajax中data传参报错
  12. hdu5347 MZL's chemistry(打表)
  13. 变量案例弹出用户名(JS)
  14. iproute2 对决 net-tools
  15. 【聚类分析】基于matlab GUI K-means聚类分析【含Matlab源码 791期】
  16. centOS安装libX11
  17. 百度这个写在控制台的消息:2021百度校招
  18. nuc虚拟机服务器,玩出新花样NUC虚拟机OP+Roon妈妈再也不用担心听音乐卡了
  19. 产品设计实战(上):Axure9绘制高保真原型
  20. JSR 354为Java引入金钱与货币的完美支持

热门文章

  1. SRE 是如何保障稳定性的
  2. DevOps 在移动应用程序开发中扮演什么角色?
  3. 腾讯游戏与NVIDIA合作发布START云游戏服务
  4. 微软发布 Azure 物联网安全中心;阿里巴巴在美申请专利,以实现跨区块链统一管理;Google利用足球训练下一代人工智能……...
  5. Spark精华问答 | Spark做大规模高性能数值计算可以吗?
  6. python实现接口自动化_python 实现接口自动化1
  7. centos 7 安装golang遇到问题: No package golang available.
  8. KAFKA 同步和异步消息的发送(开发实战)
  9. mysql主从复制排错
  10. 通用mapper 如何处理多表条件查询通过list封装(一对多)