useragent相关知识
-
随机生成UserAgent的python库一、安装fake-useragent库:pip install fake-useragent二、使用方法:1、导入fake-useragent库from fake_useragent import UserAgent2、实例化一个对象ua = UserAgent()3、随机生成IE浏览器的UserAgent>> ua.ieu'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/4.0; GTB7.4; InfoPath.3; SV1; .NET CLR 3.1.76908; WOW64; en-US)'>> ua.ieu'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.5072
-
php判断网页 是否是 Android webview加载一 . 思路: 1. Android 使用webview加载网页, 在 android 端设置其 userAgent 特定字符 2. 服务器端 php 判断获取的 user agent 中有没有 Android 给的特定字符 3. 如果有, 则为 Android webview加载网页二 . 代码 Android 端需要设置: (这两句代码: 找到Android端的userAgent, 将其中的Android 字符串改为 APP_WEBVIEW Android , APP_WEBVIEW 就是给php的标志)String userAgent = webView.getSettings().getUserAgentString();//找到webview的useragentwebView.getSettings().setUserAgentString(userAgent.replace("Android&qu
-
php 判断手机登陆<?phpfunction isMobile(){$useragent=isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '';$useragent_commentsblock=preg_match('|\(.*?\)|',$useragent,$matches)>0?$matches[0]:'';function CheckSubstrs($substrs,$text){foreach($substrs as $substr)if(false!==strpos($text,$substr)){return true;}return false;}$mobile_os_list=array('Google Wireless Transcoder','Windows CE','Wind
-
如何使用PHP识别Mobile Client Or Pc Clientfunction isMobile(){ $useragent=isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : ''; $useragent_commentsblock=preg_match('|\(.*?\)|',$useragent,$matches)>0?$matches[0]:''; function CheckSubstrs($substrs,$text){ foreach($substrs as $substr) if(false!==strpos($text,$substr)){ return true; }
useragent相关课程
-
JavaScript进阶篇 JavaScript如何“制霸”前端? js工程师可以非常自信的说:在前端工作中,没什么是JavaScript实现不了的。 Web前端工程师入行门槛低,前景更广阔的,近些年来入行的新人数不胜数,而作为前端“万金油”万金油的JavaScript,热度自然居高不下。 本课程包含了很完善的JavaScript基础必备的知识。以知识点与小案例结合的形式书写,确保每个知识点都有对应的练习题,让你一边学习一边练习,重点知识及时实践,加深记忆,巩固学习成果。 学完本课程后,你可以掌握:js基础语法(变量、逻辑与、或、非)、数组、流程控制语句(判断、多种循环)、函数、事件、内置对象、浏览器对象、DOM等知识点 通过本门课程的学习,你可以顺利完成JavaScript基础入门,独立实现简单的页面交互,不论你是计算机专业毕业生,还是转行IT的新手程序员,本门课程都能带你无压力的入门JavaScript。
讲师:慕课官方号 入门 454527人正在学习
useragent相关教程
- 2. 伪装成随机浏览器 我们来看看 Scrapy 给我们提供的、用于伪装 User-Agent 字段的中间件:UserAgentMiddleware 。其定义位于 scrapy/downloadermiddlewares/useragent.py 文件中,我们来看看其具体内容:class UserAgentMiddleware: """This middleware allows spiders to override the user_agent""" def __init__(self, user_agent='Scrapy'): self.user_agent = user_agent @classmethod def from_crawler(cls, crawler): o = cls(crawler.settings['USER_AGENT']) crawler.signals.connect(o.spider_opened, signal=signals.spider_opened) return o def spider_opened(self, spider): self.user_agent = getattr(spider, 'user_agent', self.user_agent) def process_request(self, request, spider): if self.user_agent: request.headers.setdefault(b'User-Agent', self.user_agent)从上面的代码我们可以看到,该中间件会从 settings.py 中取得 USER_AGENT 参数值, 然后进行实例化:o = cls(crawler.settings['USER_AGENT'])在处理请求的核心方法 process_request() 会将该值赋给请求头中的 User-Agent 字段。注意该中间件属于下载中间件,在 Scrapy 中默认被启用,如下图所示:我们来看看如何在这个中间件的基础上实现随机的 User-Agent 请求:编写一个基于 UserAgentMiddleware 的中间件类,可以放到 scrapy 项目的 middlewares.py 文件中。这里我们使用 fake-useragent 模块来帮我们生成各种各样的 user-agent 值,这样避免我们手工维护一个 user-agent 的值列表。该模块的使用非常简单:(scrapy-test) [root@server china_pub]# python Python 3.8.1 (default, Dec 24 2019, 17:04:00) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)] on linuxType "help", "copyright", "credits" or "license" for more information.>>> from fake_useragent import UserAgent>>> ua = UserAgent()>>> ua.random'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36'>>> ua.random'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36'>>> ua.random'Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1464.0 Safari/537.36'>>> ua.random'Mozilla/5.0 (Windows NT 6.2; rv:21.0) Gecko/20130326 Firefox/21.0'>>> 注意:使用这个模块需要联网,根据相应的版本要请求网站的相应接口,获取相应数据。例如我这里的版本是0.1.11,于是请求的 URL 及其接口数据如下:来看我们自定义的中间件代码如下:# 写入位置:scrapy项目的middlewares.py文件中from scrapy.downloadermiddlewares.useragent import UserAgentMiddlewarefrom fake_useragent import UserAgent# ...class MyUserAgentMiddleware(UserAgentMiddleware): def process_request(self, request, spider): ua = UserAgent() user_agent = ua.random if user_agent: request.headers.setdefault(b'User-Agent', user_agent) return None另外,我们这里继承了 UserAgentMiddleware 中间件,那么原来的这个中间件就失去了意义、因此,在 settings.py 中,我们要启用新的设置 User-Agent 的中间件且关闭原来的中间件:# 代码位置:scrapy项目的settings.py文件中DOWNLOADER_MIDDLEWARES = { '项目名称.middlewares.MyUserAgentMiddleware': 500, 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,}
- 2. Navigator 只读属性 Window.navigator 会返回一个 Navigator 对象的引用,可以用于请求运行当前代码的应用程序的相关信息。(MDN)navigator 最常用到的就是 userAgent 属性,通常简称为 UA。console.log(navigator.userAgent);// Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36// 不同设备的输出不一定相同该属性包含了一些浏览器、操作系统、设备等信息,通常判断平台,如 ios、android,或者判断浏览器都会使用这个属性。但 userAgent 并不是很准确,特别是一些被拉黑名单的第三方的浏览器厂商,通过伪造 UA 欺骗网站,防止被拦截,比如通将 UA 设置成某个版本的 Chrome 浏览器,达到伪造浏览器的目的。除了 userAgent,其他的内容用到的相对较少。但也有比较有趣的属性,比如 onLine,这个属性可以用于判断网络状态。console.log(navigator.onLine); // true or false如果网站需要支持 i18n (国际化),还会用到 language 属性。其他的一些处于试验性的特性,也会被放在 navigator 下。如以前申请媒体设备需要使用 navigator.getUserMedia,后来随着特性的升级,变成了MediaDevices.getUserMedia()。
- 2. 反反爬虫策略: 更改 UserAgent我们可以在请求头中替换我们的请求媒介,让网站误认为是我们是通过移动端的访问,运行下面的代码后,当我们打开 hupu.html,我们会发现返回的是移动端的虎扑的页面而不是网页端的。import requestsfrom bs4 import BeautifulSoupheader_data = {'User-Agent': 'Mozilla/5.0 (Linux; U; Android 4.4.2; en-us; SCH-I535 Build/KOT49H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30'}re = requests.get('https://www.hupu.com/', headers=header_data)bs = BeautifulSoup(re.content)with open('hupu.html', 'wb') as f: f.write(bs.prettify(encoding='utf8'))减少爬取频率,设置间隔时间比如,我们可以设置一个随机的间隔时间,来模拟用户的行为,减少访问的次数和频率。我们可以在我们爬虫的程序中,加入如下的代码,让爬虫休息3秒左右,再进行爬取,可以有效地避开网站的对爬虫的检测和识别。import timeimport randomsleep_time = random.randint(0.,2) + random.random()time.sleep(sleep_time)运用代理机制代理就是通过访问第三方的机器,然后通过第三方机器的 IP 进行访问,来隐藏自己的真实IP地址。import requestslink = "http://www.baidu.com/"proxies = {'http':'XXXXXXXXXXX'} //代理地址,可以自己上网查找,这里就不做推荐了response = requests.get(link, proxies=proxies)由于第三方代理良莠不齐,而且不稳定,经常出现断线的情况,爬取速度也会慢许多,如果对爬虫质量有严格要求的话,不建议使用此种方法进行爬取。变换IP进行爬取可以通过动态的 IP 拨号服务器来变换 IP,也可以通过 Tor 代理服务器来变换 IP。
- 1. 一个简单的分布式爬虫案例 我们以前面的第16讲的头条热点新闻爬虫基础,使用 scrapy-redis 插件进行改造,使之支持分布式爬取。现在我们按照如下的步骤进行。环境准备。由于条件限制,我们只有2台云主机,分别命名为 server 和 server2。两台主机的用途如下:主机服务公网 ipserverscrapy爬虫180.76.152.113server2scrapy爬虫、redis服务47.115.61.209先准备好 redis 服务,redis 服务的搭建以及设置密码等步骤在第一部分中已经介绍过了,这里就不再重复介绍了;[root@server ~]# redis-cli -h 47.115.61.209 -p 677747.115.61.209:6777> auth spyinxOK47.115.61.209:6777> get hello"new world"我们在 server 和 server2 上都进行测试,确保都能连上 server2 上的 redis 服务。安装 scrapy 和 scrapy-redis;[root@server2 ~]# pip3 install scrapy scrapy-redis# ...改造 spider 代码,将原先继承的 Spider 类改为继承 scrapy-redis 插件中的 RedisSpider,同时去掉 start_requests() 方法:# from scrapy import Request, Spiderfrom scrapy_redis.spiders import RedisSpider# ...class HotnewsSpider(RedisSpider): # ... # 注释start_requests()方法 # def start_requests(self): # request_url = self._get_url(max_behot_time) # self.logger.info(f"we get the request url : {request_url}") # yield Request(request_url, headers=headers, cookies=cookies, callback=self.parse) # ...改造下原先的 pipelines.py 代码,为了能实时将数据保存到数据库中,我们挪动下 SQL 语句 commit 的位置,同时去掉原先的邮件发送功能:# Define your item pipelines here## Don't forget to add your pipeline to the ITEM_PIPELINES setting# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html# useful for handling different item types with a single interfaceimport loggingfrom string import Templatefrom itemadapter import ItemAdapterimport pymysqlfrom toutiao_hotnews.mail import HtmlMailSenderfrom toutiao_hotnews.items import ToutiaoHotnewsItemfrom toutiao_hotnews.html_template import hotnews_template_htmlfrom toutiao_hotnews import settingsclass ToutiaoHotnewsPipeline: logger = logging.getLogger('pipelines_log') def open_spider(self, spider): # 初始化连接数据库 self.db = pymysql.connect( host=spider.settings.get('MYSQL_HOST', 'localhost'), user=spider.settings.get('MYSQL_USER', 'root'), password=spider.settings.get('MYSQL_PASS', '123456'), port=spider.settings.get('MYSQL_PORT', 3306), db=spider.settings.get('MYSQL_DB_NAME', 'mysql'), charset='utf8' ) self.cursor = self.db.cursor() def process_item(self, item, spider): # 插入sql语句 sql = "insert into toutiao_hotnews(title, abstract, source, source_url, comments_count, behot_time) values (%s, %s, %s, %s, %s, %s)" if item and isinstance(item, ToutiaoHotnewsItem): self.cursor.execute(sql, (item['title'], item['abstract'], item['source'], item['source_url'], item['comments_count'], item['behot_time'])) # 将commit语句移动到这里 self.db.commit() return item def query_data(self, sql): data = {} try: self.cursor.execute(sql) data = self.cursor.fetchall() except Exception as e: logging.error('database operate error:{}'.format(str(e))) self.db.rollback() return data def close_spider(self, spider): self.cursor.close() self.db.close()接下来就是配置 settings.py 了,我们首先要设置好 UserAgent,这一步是所有爬虫必须的。另外,针对 scrapy-redis 插件,我们只需要设置 scrapy-redis 的调度器和去重过滤器以及 Redis 的连接配置即可。如果想要将抓取的结果保存到 Redis 中,需要在 ITEM_PIPELINES 值中添加 scrapy-redis 的 item pipeline 即可。这里我们相应的配置如下:# ...USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36'# ...ITEM_PIPELINES = { 'toutiao_hotnews.pipelines.ToutiaoHotnewsPipeline': 300, # 指定scrapy-redis的pipeline,将结果保存到redis中 'scrapy_redis.pipelines.RedisPipeline': 400,}# ...SCHEDULER = 'scrapy_redis.scheduler.Scheduler'DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter'# 设置连接 Redis 的 URLREDIS_URL = 'redis://:spyinx@47.115.61.209:6777'就这样简单改造后,一个支持分布式的爬虫就完成了。我们在每台云主机上上传该爬虫代码,然后在爬虫项目目录下执行 scrapy crawl hotnews 运行爬虫。此时,所有的爬虫都会处于等待状态,需要手动将起始的请求 URL 设置到 redis 的请求列表中,相应的 key 默认为 hotnews:start_urls。添加的 redis 命令为:> lpush hotnews:start_urls url为此我准备了一段 python 代码帮助我们完成 url 的生成以及推送到 redis 中:# 位置: 在 toutiao_hotnews 目录下,和 scrapy.cfg 文件同一级import redisfrom toutiao_hotnews.spiders.hotnews import HotnewsSpiderspider = HotnewsSpider()r = redis.Redis(host='47.115.61.209', port=6777, password='spyinx', db=0)request_url = spider._get_url(0)r.lpush("hotnews:start_urls", request_url)接下来,我们看看这个分布式爬虫的运行效果:115上面的视频中,我们启动了两个 scrapy 爬虫,他们分别监听 redis 中的 hotnews:start_urls 列表,当里面有数据时其中一个爬虫便会读取该 url 然后开始爬取动作;后面我们停止其中一个爬虫时,继续向 redis 中添加一个请求的 url 则另一个 scrapy 爬虫也会继续正常工作。 由于我们添加了两个 item pipeline,其中第一个会将 item 数据保存到数据库中,scrapy_redis 的 item pipeline 则会将抓取的 item 结果保存到 redis 中,对应的 key 名为 hotnews:items。在对 scrapy-redis 插件有了一定的了解后,我们来分析一下 scrapy-redis 的源码并解释下上述工程的执行流程。
- 9.1【应用】删除资源 .Net Core 开发电商后端API
- MySQL Server 优化 深入理解 MySQL 的方方面面
useragent相关搜索
-
ubuntu安装
ubuntu安装教程
ubuntu官网
ucenter
udp通信
ui层
uml
uml类图
uml建模
uml教程
uml图
underscore
uni app
unicode
uniform
union
union用法
uniq
uniqueconstraint
uniqueid