├── .idea ├── encodings.xml ├── inspectionProfiles │ └── profiles_settings.xml ├── misc.xml ├── modules.xml ├── qiushi.iml └── vcs.xml ├── README.md ├── conf.json ├── data ├── project.db ├── result.db ├── scheduler.1d ├── scheduler.1h ├── scheduler.all └── task.db ├── v2ex ├── __init__.py └── v2ex.py ├── 知乎 ├── __init__.py └── zhihu.py └── 练习 ├── __init__.py ├── c3-11.py ├── mysqldb.py ├── pachong.py ├── pq.py ├── ps1.py └── v2ex.html /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/qiushi.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 11 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # pyspider 2 | 知乎爬虫和v2ex爬虫的实现。使用python的pyspider爬虫进行开发,主要爬取知乎的问题和评论,以及v2ex的帖子。数据转储到mysql数据库,用于zhihu项目的使用。 3 | 4 | 5 | ## 使用python爬虫爬取知乎和v2ex数据,充实网站信息 6 | 7 | 安装python2.7并且配置环境变量。同时安装pycharm,配置interpretor,安装pip。 8 | 9 | 这里会各种报错,主要是中文目录以及pip版本导致的错误,需要修改各种配置文件以支持gbk编码。详情略。 10 | 11 | 安装好以后,我们先熟悉一下python的语法,写一些例子,比如数据类型,操作符,方法调用,以及面向对象的技术。 12 | 13 | 因为数据是要导入数据库的,所以这里安装MySQLdb的一个库,并且写一下连接数据库的代码,写一下简单的crud进行测试。 14 | 15 | 使用requests库作为解析http请求的工具,使用beautifulsoup作为解析html代码的工具,请求之后直接使用css选择器匹配。即可获得内容。 16 | 17 | 当然现在我们有更方便的工具pyspider,可以方便解析请求并且可以设置代理,伪装身份等,直接传入url并且写好多级的解析函数,程序便会迭代执行,直到把所有页面的内容解析出来。这里我们直接启动pyspider的web应用并且写好python代码,就可以执行爬虫了。简单讲一下知乎和v2ex的爬虫流程。 18 | 19 | v2ex: 20 | 首先请求首页,因为v2ex现在也是https页面了,所以需要默认把使用证书设为false。 21 | 22 | 执行完index_page函数,说明首页已经请求完毕,我们了解其css布局和url特征以后,根据tab=?可以进入下一级分类。于是for循环爬出所有以tab=?结尾的url,并且分别请求,进入下一级函数。 23 | 24 | 根据页面的层级和css格式我们设置好多级函数依次循环执行,这样我们就可以解析到最后一级真正的帖子内容了。 25 | 26 | 同理,知乎也是这样,先找到问题,再把问题下所有的回答进行爬取,最后把问题和评论一起处理。 27 | 28 | 当然最后一级内容需要调用数据库的存储接口,为了避免存储错误,需要把内容中的 " 改成 //,否则会出问题。 -------------------------------------------------------------------------------- /conf.json: -------------------------------------------------------------------------------- 1 | { 2 | "message_queue": "redis://127.0.0.1:6379/15", 3 | "webui": { 4 | "port": 5001, 5 | "need-auth":true, 6 | "username":"root", 7 | "password":"1234" 8 | } 9 | } -------------------------------------------------------------------------------- /data/project.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/h2pl/pyspider/5b526643540386646b99b7868c8f50da2c745bba/data/project.db -------------------------------------------------------------------------------- /data/result.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/h2pl/pyspider/5b526643540386646b99b7868c8f50da2c745bba/data/result.db -------------------------------------------------------------------------------- /data/scheduler.1d: -------------------------------------------------------------------------------- 1 | (dp1 2 | . -------------------------------------------------------------------------------- /data/scheduler.1h: -------------------------------------------------------------------------------- 1 | (dp1 2 | . -------------------------------------------------------------------------------- /data/scheduler.all: -------------------------------------------------------------------------------- 1 | (dp1 2 | . -------------------------------------------------------------------------------- /data/task.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/h2pl/pyspider/5b526643540386646b99b7868c8f50da2c745bba/data/task.db -------------------------------------------------------------------------------- /v2ex/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/h2pl/pyspider/5b526643540386646b99b7868c8f50da2c745bba/v2ex/__init__.py -------------------------------------------------------------------------------- /v2ex/v2ex.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- encoding: utf-8 -*- 3 | # Created on 2016-08-17 11:11:46 4 | # Project: v2ex 5 | 6 | from pyspider.libs.base_handler import * 7 | import random 8 | import MySQLdb 9 | 10 | 11 | 12 | 13 | class Handler(BaseHandler): 14 | crawl_config = { 15 | } 16 | 17 | def __init__(self): 18 | self.db = MySQLdb.connect('localhost', 'root', '1234', 'wenda', charset='utf8') 19 | 20 | def add_question(self, title, content): 21 | try: 22 | cursor = self.db.cursor() 23 | sql = 'insert into question(title, content, user_id, created_date, comment_count) values ("%s","%s",%d, %s, 0)' % (title, content, random.randint(1, 10) , 'now()'); 24 | print sql 25 | cursor.execute(sql) 26 | self.db.commit() 27 | except Exception, e: 28 | print e 29 | self.db.rollback() 30 | 31 | #首先进入首页 32 | @every(minutes=24 * 60) 33 | def on_start(self): 34 | self.crawl('https://v2ex.com', callback=self.index_page, validate_cert=False) 35 | 36 | #然后爬取标签tab,比如技术,生活,url是?tab=* 37 | @config(age=10 * 24 * 60 * 60) 38 | def index_page(self, response): 39 | for each in response.doc('a[href^="https://www.v2ex.com/?tab="]').items(): 40 | self.crawl(each.attr.href, callback=self.tab_page, validate_cert=False) 41 | 42 | # 爬取子节点,比如技术下的程序员,java等,url是go开头 43 | @config(age=10 * 24 * 60 * 60) 44 | def tab_page(self, response): 45 | for each in response.doc('a[href^="https://www.v2ex.com/go/"]').items(): 46 | self.crawl(each.attr.href, callback=self.board_page, validate_cert=False) 47 | 48 | # 爬取子节点下的每篇文章。url都是t开头 49 | @config(priority=2) 50 | def board_page(self, response): 51 | for each in response.doc('a[href^="https://www.v2ex.com/t/"]').items(): 52 | url = each.attr.href 53 | # 此处过滤url中的回复编号,防止重复爬取 54 | if url.find('#reply') > 0: 55 | url = url[0:url.find('#')] 56 | self.crawl(url, callback=self.detail_page, validate_cert=False) 57 | # 获取相同节点下不同页的文章页面 58 | for each in response.doc('a.page_normal').items(): 59 | self.crawl(each.attr.href, callback=self.board_page, validate_cert=False) 60 | 61 | # 已经到最后的节点:文章,直接获取标题,url,以及内容,存到数据库 62 | @config(priority=20) 63 | def detail_page(self, response): 64 | title = response.doc('h1').text() 65 | content = response.doc('div.topic_content').html() 66 | self.add_question(title, content) 67 | return { 68 | 'url': response.url, 69 | 'title': title, 70 | 'content': content 71 | } 72 | 73 | -------------------------------------------------------------------------------- /知乎/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/h2pl/pyspider/5b526643540386646b99b7868c8f50da2c745bba/知乎/__init__.py -------------------------------------------------------------------------------- /知乎/zhihu.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- encoding: utf-8 -*- 3 | # Created on 2016-08-19 14:21:53 4 | # Project: zhihu 5 | 6 | from pyspider.libs.base_handler import * 7 | import random 8 | import MySQLdb 9 | 10 | 11 | class Handler(BaseHandler): 12 | crawl_config = { 13 | 'itag': 'v1', 14 | 'headers': { 15 | 'User-Agent': 'GoogleBot', 16 | 'Host' : 'www.zhihu.com', 17 | 'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 18 | } 19 | } 20 | 21 | def __init__(self): 22 | self.db = MySQLdb.connect('localhost', 'root', '1234', 'wenda', charset='utf8') 23 | 24 | def add_question(self, title, content, comment_count): 25 | try: 26 | cursor = self.db.cursor() 27 | sql = 'insert into question(title, content, user_id, created_date, comment_count) values ("%s","%s",%d, %s, %d)' % (title, content, random.randint(1, 10) , 'now()', comment_count); 28 | print sql 29 | cursor.execute(sql) 30 | qid = cursor.lastrowid 31 | self.db.commit() 32 | return qid 33 | except Exception, e: 34 | print e 35 | self.db.rollback() 36 | return 0 37 | 38 | def add_comment(self, qid, comment): 39 | try: 40 | cursor = self.db.cursor() 41 | sql = 'insert into comment(content, entity_type, entity_id, user_id, created_date) values ("%s",%d,%d, %d,%s)' % (comment, 1, qid, random.randint(1, 10) , 'now()'); 42 | #print sql 43 | cursor.execute(sql) 44 | self.db.commit() 45 | except Exception, e: 46 | print e 47 | self.db.rollback() 48 | 49 | #首先进入话题的精华回答列表,这个page貌似没用 50 | @every(minutes=24 * 60) 51 | def on_start(self): 52 | self.crawl('https://www.zhihu.com/topic/19551667/top-answers', callback=self.index_page, validate_cert=False) 53 | self.crawl('https://www.zhihu.com/topic/19552417/top-answers', callback=self.index_page, validate_cert=False) 54 | 55 | 56 | @config(age=10 * 24 * 60 * 60) 57 | def index_page(self, response): 58 | #获取问题详细链接 59 | for each in response.doc('a[href^="/question"]').items(): 60 | self.crawl(each.attr.href, callback=self.detail_page, validate_cert=False) 61 | #如果需要翻页,那么把所有翻页找出来 62 | for each in response.doc('.zm-invite-pager span a').items(): 63 | self.crawl(each.attr.href, callback=self.index_page, validate_cert=False) 64 | 65 | @config(priority=2) 66 | def detail_page(self, response): 67 | items = response.doc('div.zm-editable-content.clearfix').items() 68 | title = response.doc('span.zm-editable-content').text() 69 | html = response.doc('#zh-question-detail .zm-editable-content').html() 70 | 71 | #判断是否有页面内容 72 | if html == None: 73 | #如果内容比较多,会有html来包装 74 | html = response.doc('#zh-question-detail .content.hidden').html() 75 | if html == None: 76 | html = '' 77 | #把双引号用\\替换才能存入数据库 78 | content = html.replace('"', '\\"') 79 | print content 80 | 81 | #sum方法是该问题有多少个问题,此处只显示一页 82 | qid = self.add_question(title, content, sum(1 for x in items)) 83 | #插入该问题的10条评论 84 | for each in response.doc('div.zm-editable-content.clearfix').items(): 85 | self.add_comment(qid, each.html().replace('"', '\\"')) 86 | 87 | return { 88 | "url": response.url, 89 | "title": title, 90 | "content": content, 91 | } 92 | -------------------------------------------------------------------------------- /练习/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/h2pl/pyspider/5b526643540386646b99b7868c8f50da2c745bba/练习/__init__.py -------------------------------------------------------------------------------- /练习/c3-11.py: -------------------------------------------------------------------------------- 1 | # -*- encoding=UTF-8 -*- 2 | 3 | import requests 4 | import random 5 | import re 6 | from bs4 import BeautifulSoup 7 | 8 | 9 | def qiushibaike(): 10 | content = requests.get('http://www.qiushibaike.com').content 11 | soup = BeautifulSoup(content, 'html.parser') 12 | 13 | for div in soup.find_all('div', {'class': 'content'}): 14 | print div.text.strip() 15 | 16 | 17 | def demo_string(): 18 | stra = 'hello world"' 19 | print stra.capitalize() 20 | print stra.replace('world', 'nowcoder') 21 | strb = ' \n\rhello nowcoder \r\n ' 22 | print 0, strb 23 | print 1, strb.lstrip() 24 | print 2, strb.rstrip(), "xx" 25 | strc = 'hello w' 26 | print 3, strc.startswith('hel') 27 | print 4, strc.endswith('x') 28 | print 5, stra + strb + strc 29 | print 6, len(stra), len(strb), len(strc) 30 | print 7, 'x'.join(['a', 'b', 'c']) # StringBuilder 31 | print 8, strc.split(' ') 32 | print 9, strc.find('llo') 33 | 34 | 35 | def demo_operation(): 36 | print 1, 1 + 2, 5 / 2, 5 * 2, 5 - 2 37 | print 1, 1 + 2, 5 / 2.0, 5 * 2, 5 - 2 38 | print 2, True, not True, not False 39 | print 3, 1 << 2, 88 >> 2 # 0x11111 40 | print 4, 1 < 2, 5 < 3 41 | print 5, 5 | 3, 5 & 3, 5 ^ 3 # 0x101 0x011 42 | x = 3 43 | y = 5.0 44 | print x, y, type(x), type(y) 45 | 46 | 47 | def demo_buildinfunction(): 48 | print 1, max(2, 1), min(5, 3) 49 | print 2, len('xxx'), len([1, 2, 3]) 50 | print 3, abs(-2), abs(7) 51 | print 4, range(1, 10, 2) 52 | # print 5, '\n'.join(dir(list)) 53 | x = 2 54 | print x + 3 55 | print 6, eval('x*2+4') 56 | print 7, chr(66), ord('a') 57 | print 8, divmod(11, 3) 58 | 59 | 60 | def demo_controlflow(): 61 | score = 65 62 | if score > 99: 63 | print 1, 'A' 64 | elif score > 60: 65 | print 2, 'B' 66 | else: 67 | print 3, 'C' 68 | while score < 100: 69 | print score 70 | score += 10 71 | if score > 80: 72 | break 73 | 74 | # for (int i = 0; i < 10; ++i) 75 | for i in range(0, 10): 76 | if i == 0: 77 | pass 78 | if i == 3: 79 | continue 80 | if i < 5: 81 | print i * i 82 | if i == 7: 83 | break 84 | 85 | # print i 86 | 87 | 88 | def demo_list(): 89 | lista = [1, 2, 3] # vector ArrayList 90 | print 1, lista 91 | # print dir(list) 92 | listb = ['a', 1, 1.1] 93 | print 2, listb 94 | lista.extend(listb) 95 | print 3, lista 96 | print 4, len(lista) 97 | print 5, 'a' in lista, 'b' in lista 98 | lista = lista + listb 99 | print lista 100 | listb.insert(0, 'wwwwwww') 101 | print listb 102 | listb.pop(1) 103 | print listb 104 | listb.sort() 105 | print listb 106 | print listb[1], listb[2] 107 | print listb * 2 108 | print [0] * 10 # memset 109 | listb.append('xxx') 110 | print listb 111 | listb.reverse() 112 | print listb 113 | t = (1, 1, 3) # pair 114 | print t 115 | print t.count(1), len(t) 116 | 117 | 118 | def add(a, b): 119 | return a + b 120 | 121 | 122 | def sub(a, b): 123 | return a - b 124 | 125 | 126 | def demo_dict(): 127 | dicta = {4: 16, 1: 1, 2: 4, 3: 9, 'a': 'b'} 128 | print 1, dicta 129 | print 2, dicta.keys(), dicta.values() 130 | for key, value in dicta.items(): 131 | print 3, key, value 132 | for key in dicta.keys(): 133 | print 4, key 134 | print 5, dicta.has_key(1), dicta.has_key(11) 135 | 136 | dictb = {'+': add, '-': sub} 137 | print 6, dictb['+'](1, 2) 138 | print 7, dictb.get('-')(6, 2) 139 | 140 | print 8, dictb 141 | del dictb['+'] 142 | print 9, dictb 143 | 144 | dictb.pop('-') 145 | print 10, dictb 146 | 147 | dictb['x'] = 'y' 148 | print dictb 149 | # Map.put(key, value) 150 | 151 | 152 | def demo_set(): 153 | lista = (1, 2, 3) 154 | seta = set(lista) 155 | print 1, seta 156 | setb = set((2, 3, 4)) 157 | print 2, seta.intersection(setb) 158 | print 3, seta & setb 159 | print 4, seta | setb, seta.union(setb) 160 | print 5, seta - setb, setb - seta 161 | seta.add('xxx') 162 | print 6, seta 163 | print 7, len(seta) 164 | print seta.isdisjoint(set(('a', 'b'))) 165 | print 8, 1 in seta 166 | 167 | 168 | class User: 169 | type = 'USER' 170 | 171 | def __init__(self, name, uid): 172 | self.name = name 173 | self.uid = uid 174 | 175 | def __repr__(self): 176 | return 'im ' + self.name + ' ' + str(self.uid) 177 | # toString() 178 | 179 | 180 | class Guest(User): 181 | def __repr__(self): 182 | return 'im guest ' + self.name + ' ' + str(self.uid) 183 | 184 | 185 | class Admin(User): 186 | type = 'ADMIN' 187 | 188 | def __init__(self, name, uid, group): 189 | User.__init__(self, name, uid) 190 | self.group = group 191 | 192 | ''' 193 | def __repr__(self): 194 | return 'im admin ' + self.name + ' ' + str(self.uid) + ' ' + self.group 195 | ''' 196 | 197 | 198 | def create_user(type): 199 | if type == 'USER': 200 | return User('u1', 1) 201 | elif type == 'ADMIN': 202 | return Admin('a1', 2, 'g1') 203 | else: 204 | return Guest('g1', 3) 205 | 206 | 207 | def demo_object(): 208 | user1 = User('jim', 1) 209 | print user1 210 | guest1 = Guest('lily', 2) 211 | print guest1 212 | admin1 = Admin('xiangyu', 3, 'nowcoder') 213 | print admin1 214 | print create_user('ADMIN') 215 | 216 | 217 | def demo_exception(): 218 | try: 219 | print 2 / 1 220 | # print 2/0 221 | raise Exception('Raise Error', 'XXXX') 222 | except Exception as e: 223 | print 'error', e 224 | finally: 225 | print 'clean up' 226 | 227 | 228 | def demo_random(): 229 | # random.seed(1) 230 | # x = prex * 100007 % xxxx 231 | # prex = x 232 | 233 | for i in range(0, 5): 234 | print 1, random.randint(0, 100) 235 | print 2, int(random.random() * 100) 236 | print 3, random.choice(range(0, 100, 5)) 237 | print 4, random.sample(range(0, 100, 10), 5) 238 | 239 | lista = [1, 2, 3, 4, 5] 240 | random.shuffle(lista) 241 | print lista 242 | 243 | def demo_regex(): 244 | str = 'abc123def12gh15' 245 | p1 = re.compile('[\d]+') 246 | p2 = re.compile('\d') 247 | print 1, p1.findall(str) 248 | print 2, p2.findall(str) 249 | 250 | str = 'axxx@163.com,bcc@google.com,c@qq.com,d@qq.com,e@163.com' 251 | p3 = re.compile('[\w]+@[163|qq]+\.com') 252 | print 3, p3.findall(str) 253 | 254 | str = 'titlecontent' 255 | p4 = re.compile('[^<]+') 256 | print 4, p4.findall(str) 257 | p4 = re.compile('[^<]+[^<]+') 258 | print 5, p4.findall(str) 259 | 260 | str = 'xx2016-08-20zzz,xx2016-8-20zzz' 261 | p5 = re.compile('\d{4}-\d{2}-\d{2}') 262 | print p5.findall(str) 263 | 264 | 265 | if __name__ == '__main__': 266 | # qiushibaike() 267 | # demo_string() 268 | # demo_operation() 269 | # demo_buildinfunction() 270 | # demo_controlflow() 271 | # demo_list() 272 | # demo_dict() 273 | # demo_set() 274 | # print 'hello world' 275 | # demo_object() 276 | # demo_exception() 277 | #demo_random() 278 | demo_regex() 279 | -------------------------------------------------------------------------------- /练习/mysqldb.py: -------------------------------------------------------------------------------- 1 | #coding=utf-8 2 | import MySQLdb 3 | import random 4 | 5 | if __name__ == '__main__': 6 | db = MySQLdb.connect('localhost', 'root', '1234', 'wenda', charset='utf8') 7 | 8 | try: 9 | cursor = db.cursor() 10 | 11 | ''' 12 | sql = 'insert into question(title, content, user_id, created_date, comment_count) values("xxx", "xxx", 1, now(), 0)' 13 | cursor.execute(sql) 14 | qid = cursor.lastrowid; 15 | 16 | #commit才是真正入库 17 | db.commit() 18 | print(qid) 19 | ''' 20 | 21 | sql = 'select * from question order by id desc limit 2' 22 | cursor.execute(sql) 23 | 24 | #每行 25 | for each in cursor.fetchall(): 26 | print(each) 27 | #每列 28 | for col in each: 29 | print(col) 30 | 31 | except Exception, e: 32 | print(e) 33 | db.rollback() 34 | db.close() -------------------------------------------------------------------------------- /练习/pachong.py: -------------------------------------------------------------------------------- 1 | # -*- coding: UTF-8 -*- 2 | 3 | #http请求模块 4 | import re 5 | 6 | import requests 7 | 8 | #HTML解析的工具包 9 | from bs4 import BeautifulSoup 10 | 11 | 12 | def qiushibaike(): 13 | content = requests.get("http://www.qiushibaike.com").content 14 | soup = BeautifulSoup(content, "html.parser") 15 | 16 | #class:content是根据html中我们想要的格式来进行匹配的 17 | for div in soup.find_all('div', {'class': 'content'}): 18 | print div.text.strip() + '\n' 19 | 20 | def demo_string(): 21 | 22 | #类似Java,有增加额外方法 23 | stra = 'hello' 24 | print stra.capitalize() 25 | print stra.replace('he', 'ha') 26 | strb = ' \n \rget \r \n ' 27 | print(1, strb.rstrip()) 28 | print(2 , strb.lstrip()) 29 | print(3, stra.startswith('h')) 30 | print(4, stra.endswith('h')) 31 | print(5, stra + strb) 32 | print(6, stra, len(stra), len(strb)) 33 | 34 | print(7, '-'.join(['a','b','c'])) 35 | 36 | strc = 'hello world' 37 | print(strc.split(' ')) 38 | print(strc.find('a')) 39 | 40 | def demo_operation(): 41 | print 1, 1 + 2, 5 / 2, 5 * 2, 5 - 2 42 | print 1, 1 + 2, 5 / 2.0, 5 * 2, 5 - 2 43 | print(2, True, not True, False) 44 | 45 | print(1 << 2, 88 >> 2) 46 | print(5 | 3, 2 & 4, 6 ^ 2) 47 | 48 | def demo_function(): 49 | max([1]) 50 | len('1') 51 | range(1,10,2) 52 | print(dir(list)) 53 | 54 | x = 2 55 | #如果x是个对象,可以用eval直接使用,可以用于写java语言 56 | print(6,eval('x*2 + 5 + 3')) 57 | 58 | print(chr(66), ord('a')) 59 | print(divmod(11, 3)) 60 | 61 | #控制流略 62 | 63 | #list 64 | 65 | def demo_list(): 66 | list1 = [1, 'a', 5.0, 23, 76] 67 | list2 = [1, 'a', 5.0, 23, 1212] 68 | print(list1) 69 | for i in list1: 70 | print(i) 71 | print(list1.extend(list2)) 72 | print(1 in list2) 73 | 74 | #操作符重载,两个相连 75 | list2 = list2 + list1 76 | print(list2) 77 | 78 | list2.insert(0, 'dasdasda') 79 | list2.pop(1) 80 | print(list2) 81 | 82 | list2.sort() 83 | print(list2) 84 | 85 | list2.reverse() 86 | print(list2.count(1)) 87 | 88 | #tuple不可变 89 | t = (1, 2, 3) 90 | print(t) 91 | 92 | 93 | def add(a, b): 94 | return a + b 95 | 96 | 97 | def demo_dict(): 98 | dict = {'a' : 1, 'b': "a"} 99 | print(dict) 100 | print(dict.keys(), dict.values()) 101 | for key, value in dict.items(): 102 | print(key, value) 103 | for key in dict.keys(): 104 | print(key) 105 | print(dict.has_key(1)) 106 | a = add 107 | print(a(1, 2)) 108 | 109 | 110 | class User: 111 | def __init__(self, name, uid): 112 | self.name = name 113 | self.uid = uid 114 | 115 | def __repr__(self): 116 | return "i am a guest" + self.name + str(self.uid) 117 | 118 | 119 | class Admin(User): 120 | def __init__(self, name, uid, group): 121 | User.__init__(self, name, uid) 122 | self.group = group 123 | 124 | def __repr__(self): 125 | return "i am a guest" + self.name + str(self.uid) + self.group 126 | 127 | 128 | def demo_object(): 129 | user = User('jim', 1) 130 | print(user) 131 | 132 | admin = Admin('xiangyu', 1, 'a') 133 | print(admin) 134 | 135 | 136 | def demo_exception(): 137 | try: 138 | print(2/1) 139 | raise Exception("dasdas") 140 | except Exception as e: 141 | print(e) 142 | finally: 143 | print('final') 144 | 145 | 146 | #随机数略 147 | 148 | #正则表达式 149 | 150 | def demo_regex(): 151 | str = 'abc123def12gh15' 152 | #\d是digit数字 \w是字符串和数字 \s是空格 +代表匹配多次 153 | #[]就是用来把一个式子包起来,和数学的()类似 154 | p1 = re.compile('[\d]+') 155 | p2 = re.compile('\d') 156 | p3 = re.compile('[\d]') 157 | print(1, p1.findall(str)) 158 | print(2, p2.findall(str)) 159 | print(3, p3.findall(str)) 160 | 161 | str = 'a@163.com,b@google.com,c@qq.com,d@163.com' 162 | 163 | #.是正则表达式中的特殊字符,需要用\转义 164 | p4 = re.compile('[\w]+@[163|qq|google]+\.com') 165 | print(p4.findall(str)) 166 | 167 | str = 'titlecontent' 168 | 169 | # ^<说明首字符必须是< 170 | p5 = re.compile('[^<]+') 171 | print(p5.findall(str)) 172 | p5 = re.compile('[^<]+[^<]+') 173 | print(p5.findall(str)) 174 | 175 | str = 'xx2016-08-20zzz,xx2016-7-20zzz' 176 | p6 = re.compile('\d{4}-\d{2}-\d{2}') 177 | print(p6.findall(str)) 178 | 179 | if __name__ == '__main__': 180 | #qiushibaike() 181 | #demo_string() 182 | #demo_operation() 183 | #demo_function() 184 | #demo_list() 185 | #demo_dict() 186 | #demo_object() 187 | #demo_exception() 188 | 189 | demo_regex() 190 | -------------------------------------------------------------------------------- /练习/pq.py: -------------------------------------------------------------------------------- 1 | # -*- coding: UTF-8 -*- 2 | from pyquery import PyQuery 3 | 4 | if __name__ == '__main__': 5 | q = PyQuery(open('v2ex.html').read()) 6 | 7 | print q('title').text() 8 | #>表示子元素,也就是div.inner下的a元素, 9 | #并且>要求找到的元素是相邻子元素,而空格只要求找到的是子元素或者是更内层的元素 10 | for each in q('div.inner>a').items(): 11 | #找出标签栏 12 | if (each.attr.href.find('tab') > 0): 13 | #href是a标签的一个属性 14 | print(each.attr.href) 15 | 16 | #是id选择,.是class选择器 17 | for each in q('#Tabs>a').items(): 18 | print each.attr.href 19 | 20 | #a[]的[]是正则表达式 要求href以/go开头,^+元素就是以某元素开头的意思 21 | for each in q('.cell>a[href^="/go/"]').items(): 22 | print 3,each.attr.href 23 | for each in q('.cell a[href^="/go/"]').items(): 24 | print 4,each.attr.href 25 | for each in q('span.item_title>a').items(): 26 | print 5,each.html() 27 | for each in q('a>img.avatar').items(): 28 | print 6,each.html() 29 | -------------------------------------------------------------------------------- /练习/ps1.py: -------------------------------------------------------------------------------- 1 | #coding=utf-8 2 | import requests 3 | payload = {'username' : 'xx', 'password' : 'xx'} 4 | s = requests.session() 5 | print(s.get("http://127.0.0.1:8080/user/6")).content 6 | #登录请求 7 | r = s.post('http://127.0.0.1:8080/login', data=payload) 8 | print(s.get("http://127.0.0.1:8080/user/6")).content 9 | #根据登录后的请求获取cookie 10 | print(s.get("http://127.0.0.1:8080/user/6", cookies={"ticket":"xxx"})).content 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /练习/v2ex.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | V2EX 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 71 | 72 | 73 | 74 |
75 |
76 |
77 | 78 | 79 | 80 | 83 | 84 | 85 |
81 | 82 | 首页   注册   登录
86 |
87 |
88 |
89 |
90 |
91 | 92 |
93 |
94 |
95 | 96 | 97 |
111 | 112 | 113 | 114 | 115 | 116 |
117 |
118 |
119 | 120 | 121 | 125 | 128 |
129 |
130 |
131 | 132 | 133 | 134 | 135 |
136 |
今日热议主题
137 | 138 |
139 | 140 | 141 | 144 | 145 | 150 | 151 |
142 | 143 | 146 | 147 | 北漂的人如何缓解寂寞? 148 | 149 |
152 |
153 | 154 |
155 | 156 | 157 | 160 | 161 | 166 | 167 |
158 | 159 | 162 | 163 | 感觉,我可能发现了阿里云的一个秘密 164 | 165 |
168 |
169 | 170 |
171 | 172 | 173 | 176 | 177 | 182 | 183 |
174 | 175 | 178 | 179 | Pixel 一代还值得入嘛 180 | 181 |
184 |
185 | 186 |
187 | 188 | 189 | 192 | 193 | 198 | 199 |
190 | 191 | 194 | 195 | 国内现在是不是银联已经式微了 196 | 197 |
200 |
201 | 202 |
203 | 204 | 205 | 208 | 209 | 214 | 215 |
206 | 207 | 210 | 211 | 这个 ip 地址是内网? 212 | 213 |
216 |
217 | 218 |
219 | 220 | 221 | 224 | 225 | 230 | 231 |
222 | 223 | 226 | 227 | IPv6 时代下, IP 会成为普通人可购买的普遍的商品吗? 228 | 229 |
232 |
233 | 234 | 235 |
236 |
237 | 244 |
245 | 251 |
252 |
253 |
社区运行状况
254 |
255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 |
注册会员316041
主题454432
回复5660903
269 |
270 |
271 | 财富排行榜 272 |
273 | 消费排行榜 274 |
275 |
276 |
277 | 278 | 279 |
280 |
281 |
282 | 283 |
284 | 287 |
程序员     Python     iDev     Android     Linux     node.js     云计算     宽带症候群
288 | 289 | 290 | 291 |
292 | 293 | 294 | 295 | 296 | 297 | 298 | 302 | 307 | 308 |
感觉,我可能发现了阿里云的一个秘密 299 |
300 |
  •  11   
    程序员  •  realpg  •  8 分钟前  •  最后回复来自 id4alex
    301 |
    303 | 304 | 61 305 | 306 |
    309 |
    310 | 311 |
    312 | 313 | 314 | 315 | 316 | 317 | 318 | 322 | 325 | 326 |
    这里有今天被 LeetCode Weekly Contest 84 : p835 标准答案错误坑到同学吗? 319 |
    320 |
    全球工单系统  •  banxi1988
    321 |
    323 | 324 |
    327 |
    328 | 329 |
    330 | 331 | 332 | 333 | 334 | 335 | 336 | 340 | 345 | 346 |
    封 IP 是什么原理 337 |
    338 |
    程序员  •  socradi  •  10 分钟前  •  最后回复来自 zjqzxc
    339 |
    341 | 342 | 9 343 | 344 |
    347 |
    348 | 349 |
    350 | 351 | 352 | 353 | 354 | 355 | 356 | 360 | 365 | 366 |
    如何有效推广自己的个人项目,做广告吗? 357 |
    358 |
    程序员  •  cllgeek  •  14 分钟前  •  最后回复来自 liangdi
    359 |
    361 | 362 | 1 363 | 364 |
    367 |
    368 | 369 |
    370 | 371 | 372 | 373 | 374 | 375 | 376 | 380 | 385 | 386 |
    coding 的腾讯云主机续费怎么变成 19 了 377 |
    378 |
    全球工单系统  •  kennedy32  •  27 分钟前  •  最后回复来自 saran
    379 |
    381 | 382 | 4 383 | 384 |
    387 |
    388 | 389 |
    390 | 391 | 392 | 393 | 394 | 395 | 396 | 400 | 405 | 406 |
    Python 占据 5 月 Google 语言搜索榜首,首次击败 Java 397 |
    398 |
    Python  •  rogwan  •  28 分钟前  •  最后回复来自 hiddendeerer
    399 |
    401 | 402 | 38 403 | 404 |
    407 |
    408 | 409 |
    410 | 411 | 412 | 413 | 414 | 415 | 416 | 420 | 425 | 426 |
    看到有网友分享吐槽云上网络带宽资源的问题,也反馈一个短信资源情况 417 |
    418 |
    程序员  •  ywgx  •  36 分钟前  •  最后回复来自 Event
    419 |
    421 | 422 | 3 423 | 424 |
    427 |
    428 | 429 |
    430 | 431 | 432 | 433 | 434 | 435 | 436 | 440 | 445 | 446 |
    用 CMake 和 wxWidgets 造一个跨平台 Hello World(1) 437 |
    438 |
  •  1   
    程序员  •  raawaa  •  4 小时 2 分钟前  •  最后回复来自 waruqi
    439 |
    441 | 442 | 5 443 | 444 |
    447 |
    448 | 449 |
    450 | 451 | 452 | 453 | 454 | 455 | 456 | 460 | 465 | 466 |
    红米 note5 无法安装冰箱 457 |
    458 |
    Android  •  anson2416  •  1 小时 19 分钟前  •  最后回复来自 AASW2ss
    459 |
    461 | 462 | 6 463 | 464 |
    467 |
    468 | 469 |
    470 | 471 | 472 | 473 | 474 | 475 | 476 | 480 | 485 | 486 |
    Pixel 一代还值得入嘛 477 |
    478 |
    Android  •  smilingsun  •  1 小时 3 分钟前  •  最后回复来自 sepdy
    479 |
    481 | 482 | 47 483 | 484 |
    487 |
    488 | 489 |
    490 | 491 | 492 | 493 | 494 | 495 | 496 | 500 | 505 | 506 |
    [转] 珍藏的 Windows 效率工具 497 |
    498 |
    程序员  •  omph  •  1 小时 42 分钟前  •  最后回复来自 faemon
    499 |
    501 | 502 | 19 503 | 504 |
    507 |
    508 | 509 |
    510 | 511 | 512 | 513 | 514 | 515 | 516 | 520 | 525 | 526 |
    "LastPass 无法连接到登录服务器" 最近频繁的弹出 517 |
    518 |
    全球工单系统  •  zen9073  •  14 分钟前  •  最后回复来自 yushiro
    519 |
    521 | 522 | 16 523 | 524 |
    527 |
    528 | 529 |
    530 | 531 | 532 | 533 | 534 | 535 | 536 | 540 | 545 | 546 |
    阮一峰老师又被人怼了,这次是关于 JavaScript 的快速排序实现 537 |
    538 |
  •  3   
    JavaScript  •  cairnechen  •  6 小时 45 分钟前  •  最后回复来自 iamdqncoder
    539 |
    541 | 542 | 188 543 | 544 |
    547 |
    548 | 549 |
    550 | 551 | 552 | 553 | 554 | 555 | 556 | 560 | 565 | 566 |
    求教 : Java Nashorn 执行 js 和 浏览器执行 js 结果不一致问题 557 |
    558 |
    Java  •  flybird1971  •  1 小时 1 分钟前  •  最后回复来自 xqin
    559 |
    561 | 562 | 2 563 | 564 |
    567 |
    568 | 569 |
    570 | 571 | 572 | 573 | 574 | 575 | 576 | 580 | 585 | 586 |
    发现一种个人开发者可以收款的免费支付集成方式,不知是否可行? 577 |
    578 |
    程序员  •  maxxfire  •  2 小时 21 分钟前  •  最后回复来自 Xrong
    579 |
    581 | 582 | 18 583 | 584 |
    587 |
    588 | 589 |
    590 | 591 | 592 | 593 | 594 | 595 | 596 | 600 | 605 | 606 |
    #ofo# 我要这月卡有何用 597 |
    598 |
    全球工单系统  •  mayne95  •  4 小时 24 分钟前  •  最后回复来自 jamesxu
    599 |
    601 | 602 | 15 603 | 604 |
    607 |
    608 | 609 |
    610 | 611 | 612 | 613 | 614 | 615 | 616 | 620 | 625 | 626 |
    闲着无聊,弄了一个壁纸网站 617 |
    618 |
    Node.js  •  huruji  •  11 分钟前  •  最后回复来自 huruji
    619 |
    621 | 622 | 5 623 | 624 |
    627 |
    628 | 629 |
    630 | 631 | 632 | 633 | 634 | 635 | 636 | 640 | 645 | 646 |
    腾讯云官网崩了? 637 |
    638 |
    全球工单系统  •  2exhjx  •  1 小时 4 分钟前  •  最后回复来自 fcj558
    639 |
    641 | 642 | 11 643 | 644 |
    647 |
    648 | 649 |
    650 | 651 | 652 | 653 | 654 | 655 | 656 | 660 | 665 | 666 |
    貌似 XLDownloader_1.0.0.7_Alpha 已被迅雷 Ban 掉? 657 |
    658 |
    程序员  •  cigarzh  •  2 小时 35 分钟前  •  最后回复来自 Blazings
    659 |
    661 | 662 | 1 663 | 664 |
    667 |
    668 | 669 |
    670 | 671 | 672 | 673 | 674 | 675 | 676 | 680 | 685 | 686 |
    第三次放弃 vim。。。这次是 VSC 的 vim 插件 677 |
    678 |
    Vim  •  Meli55a  •  59 分钟前  •  最后回复来自 Meli55a
    679 |
    681 | 682 | 37 683 | 684 |
    687 |
    688 | 689 |
    690 | 691 | 692 | 693 | 694 | 695 | 696 | 700 | 705 | 706 |
    新一代轻量级 PHP 扩展框架 Asf 697 |
    698 |
  •  1   
    PHP  •  fanjiapeng  •  9 小时 41 分钟前  •  最后回复来自 whyiyhw
    699 |
    701 | 702 | 25 703 | 704 |
    707 |
    708 | 709 |
    710 | 711 | 712 | 713 | 714 | 715 | 716 | 720 | 725 | 726 |
    请问安卓手机开启 wifi 和 4g 同时,可以指定某个 app 只走 4g 吗? 717 |
    718 |
    Android  •  litaomn  •  1 小时 5 分钟前  •  最后回复来自 litaomn
    719 |
    721 | 722 | 2 723 | 724 |
    727 |
    728 | 729 |
    730 | 731 | 732 | 733 | 734 | 735 | 736 | 740 | 745 | 746 |
    一些多进程多线程对文件操作的一些总结 737 |
    738 |
    Python  •  firejoke  •  6 小时 31 分钟前  •  最后回复来自 wspsxing
    739 |
    741 | 742 | 8 743 | 744 |
    747 |
    748 | 749 |
    750 | 751 | 752 | 753 | 754 | 755 | 756 | 760 | 765 | 766 |
    Mysql 的 BINARY 数据类型, 适用于什么场合( 从经验上来说 ) ? 757 |
    758 |
    Python  •  kunluanbudang  •  2 小时 36 分钟前  •  最后回复来自 mgcnrx11
    759 |
    761 | 762 | 9 763 | 764 |
    767 |
    768 | 769 |
    770 | 771 | 772 | 773 | 774 | 775 | 776 | 780 | 785 | 786 |
    如何实现获取视频网站下载地址 777 |
    778 |
    Python  •  musclepanda  •  10 小时 43 分钟前  •  最后回复来自 mengzx
    779 |
    781 | 782 | 10 783 | 784 |
    787 |
    788 | 789 |
    790 | 791 | 792 | 793 | 794 | 795 | 796 | 800 | 805 | 806 |
    tb 的订单号 797 |
    798 |
    程序员  •  HillW  •  10 小时 52 分钟前  •  最后回复来自 FYK
    799 |
    801 | 802 | 9 803 | 804 |
    807 |
    808 | 809 |
    810 | 811 | 812 | 813 | 814 | 815 | 816 | 820 | 825 | 826 |
    一个网工的未来抉择技术方向,请大家给给意见,非常感谢! 817 |
    818 |
    程序员  •  order  •  2 小时 20 分钟前  •  最后回复来自 order
    819 |
    821 | 822 | 19 823 | 824 |
    827 |
    828 | 829 |
    830 | 831 | 832 | 833 | 834 | 835 | 836 | 840 | 845 | 846 |
    微信能不能自定义过滤朋友圈而不是无脑屏蔽? 837 |
    838 |
    程序员  •  zjsxwc  •  1 小时 2 分钟前  •  最后回复来自 dexterlei
    839 |
    841 | 842 | 21 843 | 844 |
    847 |
    848 | 849 |
    850 | 851 | 852 | 853 | 854 | 855 | 856 | 860 | 865 | 866 |
    不要买小米电视 857 |
    858 |
    全球工单系统  •  xrlin  •  12 小时 7 分钟前  •  最后回复来自 tieshu
    859 |
    861 | 862 | 96 863 | 864 |
    867 |
    868 | 869 |
    870 | 871 | 872 | 873 | 874 | 875 | 876 | 880 | 885 | 886 |
    想到新加坡工作有什么途径没有? 877 |
    878 |
    程序员  •  can126  •  12 小时 12 分钟前  •  最后回复来自 huntcool001
    879 |
    881 | 882 | 2 883 | 884 |
    887 |
    888 | 889 |
    890 | 891 | 892 | 893 | 894 | 895 | 896 | 900 | 905 | 906 |
    进程,线程同步方式中条件变量和信号量有什么区别吗? 897 |
    898 |
    程序员  •  jssyxzy  •  12 小时 16 分钟前  •  最后回复来自 vegito2002
    899 |
    901 | 902 | 2 903 | 904 |
    907 |
    908 | 909 |
    910 | 911 | 912 | 913 | 914 | 915 | 916 | 920 | 925 | 926 |
    小程序审核几次都失败了 917 |
    918 |
    全球工单系统  •  yuanfnadi  •  12 小时 18 分钟前  •  最后回复来自 sommer
    919 |
    921 | 922 | 7 923 | 924 |
    927 |
    928 | 929 |
    930 | 931 | 932 | 933 | 934 | 935 | 936 | 940 | 945 | 946 |
    整合 Django 和 AdminLTE 937 |
    938 |
    Python  •  ybping  •  12 小时 20 分钟前  •  最后回复来自 ybping
    939 |
    941 | 942 | 8 943 | 944 |
    947 |
    948 | 949 |
    950 | 951 | 952 | 953 | 954 | 955 | 956 | 960 | 965 | 966 |
    lxde 和 xfce4 喇个好一些呢 957 |
    958 |
  •  1   
    Linux  •  c3824363  •  12 小时 57 分钟前  •  最后回复来自 sagaxu
    959 |
    961 | 962 | 11 963 | 964 |
    967 |
    968 | 969 |
    970 | 971 | 972 | 973 | 974 | 975 | 976 | 980 | 985 | 986 |
    logitech Options_6.80.384 安装提示安装驱动(LogiMgrDriver.kext)导致黑苹果无法启动。 977 |
    978 |
    全球工单系统  •  bbbb  •  13 小时 28 分钟前  •  最后回复来自 carlclone
    979 |
    981 | 982 | 2 983 | 984 |
    987 |
    988 | 989 |
    990 | 991 | 992 | 993 | 994 | 995 | 996 | 1000 | 1005 | 1006 |
    从谷歌商店下载的利用谷歌账号登陆的应用秒退 997 |
    998 |
    Android  •  KaIKu  •  13 小时 37 分钟前  •  最后回复来自 KaIKu
    999 |
    1001 | 1002 | 2 1003 | 1004 |
    1007 |
    1008 | 1009 |
    1010 | 1011 | 1012 | 1013 | 1014 | 1015 | 1016 | 1020 | 1025 | 1026 |
    google play 家人共享内容库,有一个已购买加入共享库的 app 无法在另一个家人账号中显示。 1017 |
    1018 |
    Android  •  boa2005  •  13 小时 42 分钟前  •  最后回复来自 skylancer
    1019 |
    1021 | 1022 | 7 1023 | 1024 |
    1027 |
    1028 | 1029 |
    1030 | 1031 | 1032 | 1033 | 1034 | 1035 | 1036 | 1040 | 1045 | 1046 |
    Facebook 开源 Pyre: Python 快速静态类型检查 1037 |
    1038 |
  •  3   
    Python  •  guyskk0x0  •  13 小时 57 分钟前  •  最后回复来自 lihongjie0209
    1039 |
    1041 | 1042 | 9 1043 | 1044 |
    1047 |
    1048 | 1049 |
    1050 | 1051 | 1052 | 1053 | 1054 | 1055 | 1056 | 1060 | 1065 | 1066 |
    各位公司用 SVN 的多还是用 GIT 做版本控制的多? 1057 |
    1058 |
  •  1   
    程序员  •  newghost  •  14 小时 0 分钟前  •  最后回复来自 ckylolo
    1059 |
    1061 | 1062 | 84 1063 | 1064 |
    1067 |
    1068 | 1069 |
    1070 | 1071 | 1072 | 1073 | 1074 | 1075 | 1076 | 1080 | 1085 | 1086 |
    即将在北京租房,想问问前辈有什么经验之谈?或者需要避免的坑嘛? 1077 |
    1078 |
  •  2   
    程序员  •  aljun  •  14 小时 11 分钟前  •  最后回复来自 kobe123
    1079 |
    1081 | 1082 | 45 1083 | 1084 |
    1087 |
    1088 | 1089 |
    1090 | 1091 | 1092 | 1093 | 1094 | 1095 | 1096 | 1100 | 1105 | 1106 |
    花了几个月,翻译了狗书作者的新版 Flask 教程 1097 |
    1098 |
  •  2   
    Python  •  luhuisicnu  •  52 分钟前  •  最后回复来自 nanlou
    1099 |
    1101 | 1102 | 54 1103 | 1104 |
    1107 |
    1108 | 1109 |
    1110 | 1111 | 1112 | 1113 | 1114 | 1115 | 1116 | 1120 | 1125 | 1126 |
    爱奇艺无法发布评论,证书过期,在线客服无人回复 1117 |
    1118 |
    全球工单系统  •  cutlove  •  14 小时 50 分钟前  •  最后回复来自 cutlove
    1119 |
    1121 | 1122 | 5 1123 | 1124 |
    1127 |
    1128 | 1129 |
    1130 | 1131 | 1132 | 1133 | 1134 | 1135 | 1136 | 1140 | 1145 | 1146 |
    jenkins 这货启动不起来,怎么搞 1137 |
    1138 |
    程序员  •  wsds  •  8 小时 55 分钟前  •  最后回复来自 tedzhou1221
    1139 |
    1141 | 1142 | 22 1143 | 1144 |
    1147 |
    1148 | 1149 |
    1150 | 1151 | 1152 | 1153 | 1154 | 1155 | 1156 | 1160 | 1165 | 1166 |
    proxmox 怎么给小鸡分公网 IP 呢? 1157 |
    1158 |
    云计算  •  OneNian  •  15 小时 27 分钟前  •  最后回复来自 580a388da131
    1159 |
    1161 | 1162 | 7 1163 | 1164 |
    1167 |
    1168 | 1169 |
    1170 | 1171 | 1172 | 1173 | 1174 | 1175 | 1176 | 1180 | 1185 | 1186 |
    如何做出这种浮动效果? 1177 |
    1178 |
    JavaScript  •  islujw  •  17 小时 21 分钟前  •  最后回复来自 q9REUgpVVCU77pWj
    1179 |
    1181 | 1182 | 16 1183 | 1184 |
    1187 |
    1188 | 1189 |
    1190 | 1191 | 1192 | 1193 | 1194 | 1195 | 1196 | 1200 | 1205 | 1206 |
    nginx 配置 https 不成功呢? 1197 |
    1198 |
    程序员  •  yantianqi  •  17 小时 40 分钟前  •  最后回复来自 singer
    1199 |
    1201 | 1202 | 17 1203 | 1204 |
    1207 |
    1208 | 1209 |
    1210 | 1211 | 1212 | 1213 | 1214 | 1215 | 1216 | 1220 | 1225 | 1226 |
    自如的搜索页打不开了? 1217 |
    1218 |
    全球工单系统  •  JuicyJ  •  13 小时 45 分钟前  •  最后回复来自 clearbug
    1219 |
    1221 | 1222 | 4 1223 | 1224 |
    1227 |
    1228 | 1229 |
    1230 | 1231 | 1232 | 1233 | 1234 | 1235 | 1236 | 1240 | 1245 | 1246 |
    springboot 的启动方式? 1237 |
    1238 |
    程序员  •  yang2yang  •  17 小时 55 分钟前  •  最后回复来自 night98
    1239 |
    1241 | 1242 | 7 1243 | 1244 |
    1247 |
    1248 | 1249 | 1268 | 1269 |
    1270 | 1271 | 1272 | 1273 | 1274 | 1275 | 1276 | 1280 | 1283 | 1284 |
    大家编译 openssl 时精简哪些算法合适 ? 1277 |
    1278 |
    Linux  •  station
    1279 |
    1281 | 1282 |
    1285 |
    1286 | 1289 |
    1290 | 1291 |
    1292 |
    1293 |
    V2EX / 节点导航
    1294 |
    分享与探索问与答    分享发现    分享创造    分享邀请码    奇思妙想    自言自语    随想    设计    Blog   
    V2EXV2EX    DNS    Project Babel    反馈    Google App Engine    使用指南   
    iOSiDev    iCode    iMarketing    iAd    iTransfer   
    Geek程序员    Python    Android    宽带症候群    Linux    PHP    云计算    外包    硬件    Node.js    Java    服务器    Bitcoin    MySQL    编程    Linode    汽车    设计师    Kindle    Markdown    MongoDB    Tornado    Redis    Ruby on Rails    Minecraft    字体排印    商业模式    Ruby    数学    Photoshop    Amazon    LEGO    SONY    自然语言处理    C#    Serverless   
    ApplemacOS    iPhone    MacBook Pro    iPad    MacBook    配件    MacBook Air    iMac    Mac mini    iPod    Mac Pro    MobileMe    iWork    iLife    GarageBand   
    生活二手交易    酷工作    天黑以后    免费赠送    音乐    电影    物物交换    剧集    信用卡    投资    团购    美酒与美食    旅行    阅读    摄影    绿茵场    Baby    宠物    咖啡    乐活    骑行    非诚勿扰    日记    植物    蘑菇    行程控   
    InternetGoogle    Twitter    Coding    Facebook    Wikipedia    reddit   
    城市北京    上海    深圳    杭州    成都    广州    武汉    昆明    天津    New York    San Francisco    青岛    Los Angeles    Boston   
    品牌UNIQLO    Lamy    宜家    无印良品    Gap    Nike    Moleskine    Adidas    G-Star   
    1295 |
    1296 | 1297 | 1298 |
    1299 | 1300 | 1301 |
    1302 |
    1303 |
    1304 |
    1305 |
    1306 |
    1307 |
    1308 |
    1309 |
    1310 |
    1311 |
    1312 | 关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   1731 人在线   最高记录 3541   ·   1313 |
    1314 | 创意工作者们的社区 1315 |
    1316 | World is powered by solitude 1317 |
    1318 | VERSION: 3.9.8.1 · 7ms · UTC 03:22 · PVG 11:22 · LAX 20:22 · JFK 23:22
    ♥ Do have faith in what you're doing.
    1319 |
    1320 |
    沪ICP备16043287号-1 1321 | 1322 |
    1323 |
    1324 |
    1325 |
    1326 |
    1327 | 1328 | 1329 | 1330 | 1331 | 1332 | 1333 | 1334 | 1335 | 1336 | 1347 | 1348 | 1349 | 1350 | 1351 | 1352 | --------------------------------------------------------------------------------