澳门新葡亰娱乐网站-www.142net-欢迎您

澳门新葡亰娱乐网站是因为你还没有找到一条正确的致富之路,www.142net是将所有的游戏都汇集在一起的官方平台,因为澳门新葡亰娱乐网站这个网站当中有着大量的游戏攻略,托IP定位技术,传达终端直接到达的精准传播方式。

爬虫入门之handler与opener,爬虫入门

来源:http://www.bhtsgq.com 作者:计算机知识 人气:129 发布时间:2019-05-24
摘要:1 自定义opener opener是 urllib.request.OpenerDirector的实例,我们在此以前一直都在应用的urlopen,它是2个独特的模块创设好的opener 而是基本的urlopen()方法 不帮衬代理、cookie等任何的HTTP/HTTPS高

1 自定义opener

  • opener是 urllib.request.OpenerDirector 的实例,我们在此以前一直都在应用的urlopen,它是2个独特的模块创设好的opener

  • 而是基本的urlopen()方法不帮衬代理、cookie等任何的HTTP/HTTPS高档作用。所以要帮助这么些效应:

    ​ (一)使用相关的 Handler处理器爬虫入门之handler与opener,爬虫入门。 来创制特定功效的微型Computer对象;

    ​ (2)然后通过 urllib.request.build_opener()办法运用这个Computer对象,成立自定义opener对象;

    ​ (三)使用自定义的opener对象,调用open()措施发送请求。

  • 倘诺程序里富有的伏乞都利用自定义的opener,能够行使urllib.request.install_opener() 将自定义的 opener 对象 定义为 全局opener,表示今后凡是调用urlopen,都将利用这么些opener来张开

在urllib库中,给大家提供了有的Handler:HTTPHandler,HTTPSHandler,ProxyHandler,BaseHandler,AbstractHTTPHandler,FileHandler,FTPHandler,分别用于拍卖HTTP,HTTPS,Proxy代理等。

import urllib
from urllib import request

handers = urllib.request.HTTPSHandler()  #构建一个HTTPHandler 处理器对象,支持处理HTTPS请求
hander = urllib.request.HTTPHandler()   #构建一个HTTPHandler 处理器对象,支持处理HTTP请求
# 方式1
opener = urllib.request.build_opener(hander)  #创建一个打开器
urllib.request.install_opener(opener)  #安装一个全局的打开器(这一步可选不安装采用默认)
request = urllib.request.Request("http://www.baidu.com/")
response = opener.open(request)  #opener打开请求
print(response.read().decode())
#方式2
response = urllib.request.urlopen('http://www.baidu.com') #urllib.request.urlopen() 特殊的opener
print(response.read().decode())

一经在 HTTPHandler()增添 debuglevel=一参数,还有也许会将 Debug Log 展开,那样程序在实践的时候,会把收包和发包的报头在显示屏上机关打字与印刷出来,方便调节和测试,有的时候可以省去抓包的办事。

# 构建一个HTTPHandler 处理器对象,支持处理HTTP请求,同时开启Debug Log,debuglevel 值默认 0
http_handler = urllib.request.HTTPHandler(debuglevel=1)

# 构建一个HTTPHSandler 处理器对象,支持处理HTTPS请求,同时开启Debug Log,debuglevel 值默认 0
https_handler = urllib.request.HTTPSHandler(debuglevel=1)

date: 2016-09-24 17:38:42

简单的说记录下Ansible入门基础知识notify和handlers。

Python 爬虫入门(1),python爬虫入门

  毕设是做爬虫相关的,本来想的是用java写,也写了多少个爬虫,当中二个是爬搜狐云音乐的用户音讯,爬了差不离拾0多万,效果不是太如意。在此以前据说Python那地方可比强,就想用Python试试,从前也没用过Python。所以,边爬边学,边学边爬。废话异常少说,进入正题。

  一.首先是获得指标页面,那个对用python来讲,非常的粗略

#encoding=utf8
import urllib

res = urllib.urlopen("http://www.baidu.com")
print res.read()

  运维结果和开采百度页面,查看源代码同样。这里针对python的语法有几点表明。

    a).import 便是引进的乐趣,java也用import,C/C 用的是include,成效同样

    b).urllib 这么些是python自带的模块,在此后开垦的时候,借使碰着自身须要的作用,python自带的模块中从不的时候,能够试着去英特网找一找,比方必要操作MySql数据  库,那个时候python是不曾自带的,就足以在网络找到MySQLdb,然后安装引入就行了。

    c).res是1个变量,不用像java,C语言那样表明。用的时候平昔写就行了

    d).标点符号。像java,C那些语言,每行代码后边都要用分号或然其余符号,作为完毕标识,python不用,用了反了会出错。可是某些时候,会用标点符号,譬喻冒号,  这些后边再说

    e).关于print,在python二.7中,有print()函数,也是有print 语句,成效为主大致。

    f).#注释

    g).encoding=utf八代表接纳utf八编码,这么些在代码中有汉语的时候极度有用

  二.分析到手的网页中的成分,获得本身想要的,以豆瓣为例,大家想赢得那一个页面中的全体书籍名称(仅供就学沟通)

  

  图片 1

  首先获得页面代码:

#encoding=utf8
import urllib
res = urllib.urlopen("http://www.douban.com/tag/小说/?focus=book")
print res.read()

  获取结果,通过深入分析页面源代码(提议用firefox浏览器,按F12,可观望源代码),能够一定到有效代码如下:

  图片 2

  图片 3

  下边大家伊始分析(这里用BeautifulSoup,自行下载安装),基本流程:

    a).减弱范围,这里大家由此id="book"获取具备的书

    b).然后通过class="title",遍历全体的书名。

  代码如下:  

#encoding=utf8
import urllib
import BeautifulSoup

res = urllib.urlopen("http://www.douban.com/tag/小说/?focus=book")
soup = BeautifulSoup.BeautifulSoup(res)
book_div = soup.find(attrs={"id":"book"})
book_a = book_div.findAll(attrs={"class":"title"})
for book in book_a:
    print book.string

  代码表明:

    a).book_div    通过id=book获取div标签

    b).book_a    通过class="title"获取具备的book  a标签

    c).for循环     是遍历book_a所有的a标签

    d).book.string  是输出a标签中的内容

  结果如下:

  图片 4

  三.累积获取的数目,例如写入数据库,作者的数据库用的Mysql,这里就以Mysql为例(下载安装MySQLdb模块这里不做叙述),只写怎么推行一条sql语句

  代码如下:

connection = MySQLdb.connect(host="***",user="***",passwd="***",db="***",port=3306,charset="utf8")
cursor = connection.cursor()
sql = "*******"
sql_res = cursor.execute(sql)
connection.commit()
cursor.close()
connection.close()

  说明:

    a).这段代码是实践sql语句的流程,针对差异的sql语句,会有分歧的拍卖。比方,实行select的口舌,作者怎么获取实施的结果,推行update语句,怎么之后成没成功。那  些将在自个儿入手了

    b).创设数据库的时候势供给小心编码,提出选取utf八

  4.至此,三个简易的爬虫就马到成功了。之后是指向反爬虫的壹部分计谋,比方,用代理突破ip访问量限制

 声明:

  代码仅供就学交换使用,不能够用于恶意搜聚、破坏等不良行为,出标题概不担当

  如失常,迎接指正。

  转发请注脚出处。

  

  

爬虫入门(1),python爬虫入门 毕设是做爬虫相关的,本来想的是用java写,也写了多少个爬虫,其中一个是爬和讯云音乐的用户消息,...

2 Cookie概述

Cookie 是指有些网址服务器为了鉴定识别用户身份和拓展Session跟踪,而积存在用户浏览器上的文件文件,Cookie能够维持登入新闻到用户下一次与服务器的对话。

(1) Cookie原理
HTTP是无状态的面向连接的商谈, 为保持一连景况, 引入Cookie机制 Cookie是http音信头中的一种特性,包括:

Cookie名字(Name)
Cookie的值(Value)
Cookie的过期时间(Expires/Max-Age)
Cookie作用路径(Path)
Cookie所在域名(Domain),
使用Cookie进行安全连接(Secure)。

前两个参数是Cookie应用必要条件,还包括Cookie大小(Size,不同浏览器对Cookie个数及大小限制是有差异的)。

Cookie由变量名和值组成,Cookie格式如下:

Set-Cookie: NAME=VALUE;Expires=DATE;Path=PATH;Domain=DOMAIN_NAME;SECURE

(2) cookie应用

Cookies在爬虫方面最规范的使用是判别注册用户是还是不是曾经报到网址,用户也许会获得升迁,是不是在下一回进入此网站时保留用户新闻以便简化登动手续。

# 获取一个有登录信息的Cookie模拟登陆
import urllib
from urllib import request

# 1. 构建一个已经登录过的用户的headers信息
headers = {
    "Host":"www.renren.com",
    "Connection":"keep-alive",
    "Upgrade-Insecure-Requests":"1",
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36",
    "Accept":"text/html,application/xhtml xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
    "Accept-Language":"zh-CN,zh;q=0.8,en;q=0.6",

    # Accept-Encoding: gzip, deflate, sdch   # 便于终端阅读,表示不支持压缩文件   

    # 重点:这个Cookie里记录了用户名,密码(通常经过RAS加密)
    "Cookie": "anonymid=ixrna3fysufnwv; depovince=GW; _r01_=1; JSESSIONID=abcmaDhEdqIlM7riy5iMv; jebe_key=f6fb270b-d06d-42e6-8b53-e67c3156aa7e|c13c37f53bca9e1e7132d4b58ce00fa3|1484060607478|1|1484060607173; jebecookies=26fb58d1-cbe7-4fc3-a4ad-592233d1b42e|||||; ick_login=1f2b895d-34c7-4a1d-afb7-d84666fad409; _de=BF09EE3A28DED52E6B65F6A4705D973F1383380866D39FF5; p=99e54330ba9f910b02e6b08058f780479; ap=327550029; first_login_flag=1; ln_uact=mr_mao_hacker@163.com; ln_hurl=http://hdn.xnimg.cn/photos/hdn521/20140529/1055/h_main_9A3Z_e0c300019f6a195a.jpg; t=214ca9a28f70ca6aa0801404dda4f6789; societyguester=214ca9a28f70ca6aa0801404dda4f6789; id=327550029; xnsid=745033c5; ver=7.0; loginfrom=syshome"
}
# 2. 通过headers里的报头信息(主要是Cookie信息),构建Request对象
req = urllib.request.Request("http://www.renren.com/", headers = headers)
# 3. 直接访问renren主页,服务器会根据headers报头信息(主要是Cookie信息),判断这是一个已经登录的用户
response = urllib.request.urlopen(req)
# 4. 打印响应内容
print(response.read())

# 或者构建opener
hander = urllib.request.HTTPHandler()
opener = urllib.request.build_opener(hander)
req = urllib.request.Resquest("http://www.renren.com/", headers = headers)
response = opener.open(req)
print(response.read().decode())

可是那样做太过复杂,大家先要求在浏览器登入账户,并且安装保存密码,并且经过抓包本领猎取那个Cookie,那有么有更简便易行方便的措施吗?

今日普降,晚上没课,适合学习。(●'◡'●)

notify
notify这几个action可用来在每种play的末段被触发,那样可避防止频仍有退换产生时每回都进行钦赐的操作,代替他,仅在颇具的浮动发生实现后三遍性地推行内定操作。

3 cookielib库和HTTPCookieProcessor处理器

在Python处理Cookie,一般是由此cookielib模块和 urllib模块的HTTPCookieProcessor拍卖器类一齐利用

cookielib模块:重要功效是提供用于存款和储蓄cookie的对象

HTTPCookieProcessor微机:重要效用是管理那个cookie对象,并构建handler对象。

(1)cookielib库

该模块主要的目的有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar

#CookieJar:管理HTTP cookie值、存储HTTP请求生成的cookie、向传出的HTTP请求添加cookie的对象。整个cookie都存储在内存中,对CookieJar实例进行垃圾回收后cookie也将丢失。

#FileCookieJar (filename,delayload=None,policy=None):从CookieJar派生而来,用来创建FileCookieJar实例,检索cookie信息并将cookie存储到文件中。filename是存储cookie的文件名。delayload为True时支持延迟访问访问文件,即只有在需要时才读取文件或在文件中存储数据。

#MozillaCookieJar (filename,delayload=None,policy=None):从FileCookieJar派生而来,创建与Mozilla浏览器 cookies.txt兼容的FileCookieJar实例。

#LWPCookieJar (filename,delayload=None,policy=None):从FileCookieJar派生而来,创建与libwww-perl标准的 Set-Cookie3 文件格式兼容的FileCookieJar实例。

实际一大半情景下,我们只用CookieJar(),假诺必要和地点文件交互,就用 MozillaCookjar() 或 LWPCookieJar()

(2) 案例

HTTPCookieProcessor 用来计划cookie的管理器

ProxyHandler 用来布署代理

HTTPHander 用来配置http

HTTPSHander 用来布局https

cookie库的配备流程:

  1. 始建二个CookieJar对象
  2. 动用cookiejar对象,创立1个handler对象
  3. 利用handler创设一个opener
  4. 通过opener登录
  5. handler会自动的保存登录之后的cookie
  • 赢得Cookie,并保存到CookieJar()对象中
import urllib.request
from http import cookiejar  

cookies = cookiejar.CookieJar()  # 构建一个CookieJar对象实例来保存cookie
# 使用HTTPCookieProcessor()来创建cookie处理器对象,参数为CookieJar()对象
cookie_handler = urllib.request.HTTPCookieProcessor(cookies)  
opener = urllib.request.build_opener(cookie_handler)  # 构建打开器
response = opener.open("http://www.baidu.com")  #访问页面
cookieDict = ''
for cookie in cookies:
    print(cookie)   #类型为<class 'http.cookiejar.Cookie'>
    cookieDict  = cookie.name  '='  cookie.value   'n'
print(cookieDict)

#输出:
<class 'http.cookiejar.Cookie'>
BAIDUID=ACB161A0A42A0374A9D9C4F94DC7F563:FG=1
BIDUPSID=ACB161A0A42A0374A9D9C4F94DC7F563
H_PS_PSSID=1426_21083_26577_22073
PSTM=1528979080
BDSVRTM=0
BD_HOME=0
  • 做客网址获得cookie值,并把收获的cookie保存在cookie文件中
import urllib.request
from http import cookiejar

filename = 'cookie.txt'
#涉及本地文件交互采用LWPCCookieJar实例保存cookie
cookies = cookiejar.LWPCCookieJar(filename=filename)  
cookie_handle = urllib.request.HTTPCookieProcessor(cookies) #构建cookie处理器
headers = {
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36"
}
req = urllib.request.Request('http://www.baidu.com',headers=headers) #构建请求
response = opener.open(req)   #打开请求
cookies.save(ignore_discard=True, ignore_expires=True)  #忽略错误并保存cookie至本地
  • ##### 从文件中获得cookies,做为请求的1部分去拜访
import urllib.request
from http import cookiejar

filePath = 'baiduCookie.txt'   #本地已存在的文件
cookies = cookiejar.LWPCookieJar()   #实例化保存cookie对象cookies,不需传参
cookies.load(filePath=filePath,ignore_discard=True, ignore_expires=True)  #对cookies文件进行加载

cookie_handler = urllib.request.HTTPCookieProcessor(cookies) #处理器
opener = urllib.request.build_opener(cookie_handler)#构建打开器

headers = {
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36"
}
req = urllib.request.Request('http://www.baidu.com',headers=headers) #构建请求
response = opener.open(req)   #打开请求

图片 5

在notify中列出的操作称为handler,也即notify中调用handler中定义的操作。

4 HTTP代理Fidder

(一)Request部分解析

Headers —— 显示客户端发送到服务器的 HTTP 请求的 header,显示为一个分级视图,包含了 Web 客户端信息、Cookie、传输状态等。
Textview —— 显示 POST 请求的 body 部分为文本。
WebForms —— 显示请求的 GET 参数 和 POST body 内容。
HexView —— 用十六进制数据显示请求。
Auth —— 显示响应 header 中的 Proxy-Authorization(代理身份验证) 和 Authorization(授权) 信息.
Raw —— 将整个请求显示为纯文本。
JSON - 显示JSON格式文件。
XML —— 如果请求的 body 是 XML 格式,就是用分级的 XML 树来显示它。

(二)Response部分详解

Transformer —— 显示响应的编码信息。
Headers —— 用分级视图显示响应的 header。
TextView —— 使用文本显示相应的 body。
ImageVies —— 如果请求是图片资源,显示响应的图片。
HexView —— 用十六进制数据显示响应。
WebView —— 响应在 Web 浏览器中的预览效果。
Auth —— 显示响应 header 中的 Proxy-Authorization(代理身份验证) 和 Authorization(授权) 信息。
Caching —— 显示此请求的缓存信息。
Privacy —— 显示此请求的私密 (P3P) 信息。
Raw —— 将整个响应显示为纯文本。
JSON - 显示JSON格式文件。
XML —— 如果响应的 body 是 XML 格式,就是用分级的 XML 树来显示它 

(3)模拟登7个人人网

import urllib
from urllib import request, parse
from http import cookiejar

filename = "cookie.txt"
cookie = cookiejar.LWPCookieJar(filename=filename)  #创建一个cookie对象,保存cookie
# 构建cookie处理器
hander_cookie = urllib.request.HTTPCookieProcessor(cookie)
# 创建一个打开器
opener = urllib.request.build_opener(hander_cookie)
# 安装一个全局可用的opener
urllib.request.install_opener(opener)
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36"}

loginUrl = "http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=2018542123646"
data = {
"email": "用户名",
"password": "密码"
}
data = urllib.parse.urlencode(data).encode('utf-8')  #将data转二进制
req = urllib.request.Request(url=loginUrl, headers=header, data=data)  #构建request请求
response = opener.open(req)  #打开请求
cookie.save(ignore_discard=True, ignore_expires=True) # 保存cookie可重复使用
print(response.read().decode())   #返回登陆后的响应
print(cookie,type(cookie)) # cookie存放在列表里

indexurl = "http://www.renren.com/SysHome.do"  #登陆界面
print("==================")
response = opener.open(indexurl)
print(response.read().decode())   #打印登陆后的网页

(肆)重复使用cookie

import urllib
from urllib import request, parse
from http import cookiejar

# 创建一个cookie对象 
filename = "cookie.txt"   #本地已存在的cookie
cookie = cookiejar.LWPCookieJar()
cookie.load(filename, ignore_expires=True, ignore_discard=True) # 加载cookie

hander_cookie = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(hander_cookie)
urllib.request.install_opener(opener)
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"}

indexurl = "http://zhibo.renren.com/top"

print("==================")
print(urllib.request.urlopen(indexurl).read().decode())

pachong

---- name: test.yml just for test 
    hosts: testserver 
    vars:   
        region: ap-southeast-1 
    tasks:   
        - name: template configuration
          file      template: src=template.j2 dest=/etc/foo.conf     
    notify:         
        - restart memcached         
        - restart apache 
    handlers:   
          - name: restart memcached     
            service: name=memcached state=restarted   
          - name: restart apache     
            service: name=apache state=restarted

5 ProxyHandler处理器

一.爬虫简要介绍

  • 爬虫:1段机关抓取网络消息的顺序
  • 价值:互连网数据,为作者所用!
    情报聚合阅读器、最爆笑轶事APP、图书价格相比网、Python本领小说大全

handlers
Handlers 也是一些 task 的列表,通过名字来引用,它们和一般的 task 并不曾什么界别。

(1) 代理 IP

利用代理IP,那是爬虫/反爬虫的第一大招,平日也是最棒用的。

诸多网址会检查测试某一段时间某些IP的访问次数(通过流量总结,系统日志等),即使访问次数多的不像常人,它会禁止那么些IP的造访。

据此大家得以安装有些代理服务器,每隔一段时间换一个代理,纵然IP被取缔,依旧能够换个IP继续爬取。urllib中经过ProxyHandler来设置使用代理服务器,上边代码表明什么利用自定义opener来使用代理:

import urllib.request

#构建了两个代理Handler,一个有代理IP,一个没有代理IP
httpproxy_handler = urllib.request.ProxyHandler({"http":"120.76.55.49:8088"})
nullproxy_handler = urllib.request.ProxyHandler({})
proxyswitch = True   #定义一个代理开关
#通过urllib2.build_opener()方法使用这些代理Handler对象,创建自定义opener
if proxyswitch:
    opener = urllib.request.build_opener(httpproxy_handler)
else:
    opener = urllib.request.build_opener(nullproxy_handler)
request = urllib.request.Request("http://www.baidu.com/")
#1.如果这么写,只有使用opener.open()方法发送请才使用自定义的代理,而urlopen()使用自定义代理
response = opener.open(request)

#2.如果这么写,就是opener应用到全局,不管是opener.open()还是urlopen()发送请求,都将使用自定义代理
# urllib.request.install_opener(opener)
# response = urllib.request.urlopen(request)
print(response.read())

无需付费短时间代理网址譬喻:
西刺无偿代理IP
快代理无需付费代办
Proxy360代理
全网代理IP

#当有足够的代理ip与用户代理时,可以随机操作
import urllib.request
import random

proxy = {"http": "10.31.162.71:808"}  # 代理ip, 无密码
# 代理ip, 有密码{"协议":"用户名:密码@IP:端口"}
# proxy = {"HTTP": "User1:123456@10.31.162.71:808"}  

# ip代理池列表
proxyList = [{"HTTPS": "14.118.252.111:6666"},
             {"HTTPS": "122.72.18.34:80"},
             {"HTTPS": "122.72.18.35:80"}]

# user-agent代理列表(或者直接构建字典 {User-Agent:" "})
UserAngentList=[
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36",
    "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko",
    "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1",
    "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Mobile Safari/537.36"
]

for _ in range(1):
    proxy = random.choice(proxyList) #
    proxy_handler = urllib.request.ProxyHandler(proxy)  # 代理处理器
    opener = urllib.request.build_opener(proxy_handler)  # 创建打开器opener
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"}
    url = "http://blog.csdn.net/Gi1gamesh/article/details/80690415" 
    req = urllib.request.Request(url, headers=headers)
    req.add_header("User-Agent", random.choice(UserAngentList))  #给用户代理添加User-Agent属性
    response = urllib.request.urlopen(req)
    #进行异常处理
    try:
        req = urllib.request.Request(url, headers=headers)  #构建请求
        response = urllib.request.urlopen(req)  #打开请求
        print(response.code) #状态码
    except:
        pass

二.大致爬虫架构

简言之爬虫架构-运转流程

调度器->URL管理器->下载器->解析器->应用

Handlers 是由公告者进行 notify, 假设未有被 notify,handlers 不会实践。

本文由澳门新葡亰发布于计算机知识,转载请注明出处:爬虫入门之handler与opener,爬虫入门

关键词: 编程

频道精选

最火资讯