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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/528740.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spark更改分区_用于小文件的spark重新分区数据

我对Spark非常新,我主要使用集群来实现并行化目的。我有一个100MB的文件,其中的每一行都通过一些算法进行处理,这是相当繁重和长时间的处理。用于小文件的spark重新分区数据我想使用10节点群集并行处理。我知道块大小超过100MB,我…

js获取字符串出现次数最多_js如何获取字符串中出现次数最多的字符

我是一个不太会表达的人,所以我尽可能的用代码来阐释我的理解和思考,废话不多说,我就直接放代码了:function getStingMax(str){if(typeof str ! "string"){alert("请传入string类型的数据")return}let countO…

2 数据源配置_如何在程序运行中动态切换数据源?架构师必读秘笈

说起动态数据源,大家应该也不陌生。例如在读写分离系统中,则要对请求中的读写操作进行分离,让读和写落在不同的数据库上;例如在多租户系统中,则要根据请求来源租户的不同,让其落在不同租户的数据库上&#…

数字滚动_告别单调!让PPT数字滚动起来。

大家好,我是三石。在PPT的制作过程中,数字是不可缺少的元素。如何设计制作,才能使简单的数字变得有活力。废话不多说看效果~其实制作方式很简单,跟着我的步骤你也能做出来。制作步骤:1、首先要制作出数字条可以通过Exc…

mysql字段是否存在_mysql判断列是否存在

本篇文章将通过存储过程来判断列(字段)是否存在。请看详情。推荐课程:MySQL教程。判断字段是否存在:DROP PROCEDURE IF EXISTS schema_change;DELIMITER //CREATE PROCEDURE schema_change() BEGINDECLARE CurrentDatabase VARCHAR(100);SELECT DATABASE…

mysql 日期间隔_mysql比较两个日期间隔

一、两个日期间隔天数,使用datediff()函数例:mysql> select datediff(now(),20160401);----------------------------| datediff(now(),20160401) |----------------------------| 4 |----------------------------1 row in…

ubuntu apache2 mysql_折腾 Ubuntu 系统续之安装PHP、Apache2和Mysql

一个狗血的开始接上回的折腾,话说昨天晚上狗屎运来临,在重装了一次的 Ubuntu 系统上,居然顺利的安装了 QQ、PHP7、Apache2、phpMyAdmin、chrome stable、Sublime Text3 并注册成功、git,还有其他桌面美化的东西,如 Doc…

mysql 5.7 数据库备份_MySQL5.7.20数据库备份与恢复

MySQL数据库备份与恢复####造成数据丢失的原因####程序错误人为操作错误运算错误磁盘故障灾难(如火灾、地震)和盗窃####物理与逻辑的角度####1、物理备份:冷备份:在数据关闭的状态下运行热备份:在数据库运行的状态时进行备份操作,…

mysql warning 日志_Mysql5.7.19安装后错误日志中有警告

警告1:secure_file_priv 配置项对数据导入导出的影响1、限制mysqld 不允许导入 | 导出mysqld --secure_file_privenullMySQL [ztjy]> select * from info_posts limit 10 into outfile /usr/local/src/info_posts_tmp.txt;ERROR 1290 (HY000): The MySQL server …

fscanf不读取_思考了一天,终于把matlab的fscanf中的sizeA搞清楚了

数值如12345等可以作为字符,所以以字符格式读取文件时,这些数字照样可以被读取 A fscanf(fileID,formatSpec) A fscanf(fileID,formatSpec,sizeA) 以上是fscanf的语法; sizeA起到的作用是限制,限制读取读取文件中数据的数量&…

linux开发板 pc 通讯_从51单片机到Linux 开发板运行hello world(教程4)

大家好,我是兔子。是一个嵌入式软硬件工程师。正在从单片机开发转岗Linux开发。这次教大家如何在Linux开发板上运行可执行文件。简单起见,不涉及到硬件。直接和教程2一样,能在PC虚拟机上运行hello world程序。当然开发板上也可以。1.Source I…

python decimal 转 float_python教程之二python数学运算

存储数据变量#两个变量交换值,通过第三个参数实现print(两个变量交换值,通过第三个参数实现); #第一种方法是通过第三个参数实现x5;#变量赋值y11; #变量赋值print(交换前,x,y);tempx;xy;ytemp;print(交换后,x,y);#两个变量交换值,更便捷的方法…

mysql 视图 动态sql_sql-server – 使用动态Sql创建视图

我正在尝试创建一个动态数据库创建脚本.有很多步骤,我们经常创建这个数据库,所以脚本看起来像这样.DECLARE databaseName nvarchar(100) DatabaseNameEXEC(/*A lot of database creation code built off of databaseName*/)除了我们在此数据库中创建的一个视图外,这一切都很好…

apache arm 交叉编译_移植apache2 ARM版 – 交叉编译apache2 | 学步园

下载apache2 http://apache.fayea.com/apache-mirror//httpd/httpd-2.4.6.tar.bz21. tar jxvf httpd-2.4.6.tar.bz22. cd httpd-2.4.63. ./configure --hostarm-linux --prefix/usr/local/arm/4.4.3 --with-apu/usr/local/arm/4.4.3/ --with-apr-util/usr/local/arm/4.4.3 --wi…

mysql订单表上亿怎么分表_[转]单表上亿的数据量如何分表

之前的几篇关于分表的,提到的分表策略不够详细,我在这篇中补充一些分表策略吧:按号段分:(1) user_id为区分,1~1000的对应table1,1001~2000的对应table2,以此类推&#xf…

mysql msdtc 不支持_IIS5.1安装后,不支持IIS的问题。(转)

(如果是ghost版本安装的xp或者win2003无法安装iis,那么你只需要下载本站从WINDOWS安装盘抽取的IIS安装文件,就可以安装IIS了,WINXPSP1 安装IIS 5, WINXP SP2 IIS5.1 ,WIN2003安装IIS6,特别提示下菜鸟同志&a…

python中对象包含几个部分_python中包含对象类型的两个列表的交集

如果顺序无关紧要,请使用set.intersection:A [(1.1,2.2),(3.3,4.4),(5.5,6.6)]B [(1.1,2.2),(7.7,8.8),(3.3,4.4)]print(set(A).intersection(B))set([(3.3, 4.4), (1.1, 2.2)])或者将B设为集合,并在a上迭代保持公共元素:^{pr2}…

mysql 不会联想字段_你有没有被MySQL的这个bug坑过?

问题描述近期,线上有个重要Mysql客户的表在从5.6升级到5.7后,master上插入过程中出现"Duplicate key"的错误,而且是在主备及RO实例上都出现。以其中一个表为例,迁移前通过“show create table” 命令查看的auto increme…

mysql新增后默认返回值_mybatis insert、update 、delete默认返回值解释与如何设置返回表主键...

在使用mybatis做持久层时,insert、update、delete,sql语句默认是不返回被操作记录主键的,而是返回被操作记录条数;那么如果想要得到被操作记录的主键,可以通过下面的配置方式获取。针对Sequence主键而言,在…

mysql 主从 sql线程no_Mysql 主从同步 slave_sql_running 为no

背景之前搭建了主从,但没有设置读写分离,从库也能写数据。于是想测试下在从库写数据会导致同步怎么样。 结果发现,slave_sql_running为no,slava_IO_running仍然为yes.原因由于从库写数据,导致主从数据不一致&#xff0…