├── .idea ├── baike_spider.iml ├── misc.xml ├── modules.xml └── workspace.xml ├── README.md ├── __pycache__ ├── html_downloader.cpython-36.pyc ├── html_outputer.cpython-36.pyc ├── html_parser.cpython-36.pyc └── url_manager.cpython-36.pyc ├── html_downloader.py ├── html_outputer.py ├── html_parser.py ├── output ├── output.html └── style.css ├── spider_main.py └── url_manager.py /.idea/baike_spider.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 11 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/workspace.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 15 | 16 | 17 | 18 | 19 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 48 | 49 | 50 | 65 | 66 | 67 | 68 | 69 | true 70 | DEFINITION_ORDER 71 | 72 | 73 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | Python 86 | 87 | 88 | 89 | 90 | PyBroadExceptionInspection 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 128 | 129 | 130 | 131 | 134 | 135 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 171 | 172 | 191 | 192 | 193 | 194 | 195 | 208 | 209 | 222 | 223 | 240 | 241 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 283 | 284 | 303 | 304 | 325 | 326 | 348 | 349 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 1491105177992 392 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 426 | 429 | 430 | 431 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 509 | 510 | 511 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | 519 | 520 | 521 | 522 | 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | 531 | 532 | 533 | 534 | 535 | 536 | 537 | 538 | 539 | 540 | 541 | 542 | 543 | 544 | 545 | 546 | 547 | 548 | 549 | 550 | 551 | 552 | 553 | 554 | 555 | 556 | 557 | 558 | 559 | 560 | 561 | 562 | 563 | 564 | 565 | 566 | 567 | 568 | 569 | 570 | 571 | 572 | 573 | 574 | 575 | 576 | 577 | 578 | 579 | 580 | 581 | 582 | 583 | 584 | 585 | 586 | 587 | 588 | 589 | 590 | 591 | 592 | 593 | 594 | 595 | 596 | 597 | 598 | 599 | 600 | 601 | 602 | 603 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 一个简单的python爬虫,爬取百科百科pyhton词条。 -------------------------------------------------------------------------------- /__pycache__/html_downloader.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DragonFlyXD/baike-python/716cd57ed8db85282db9f56d273d7a01be9adaac/__pycache__/html_downloader.cpython-36.pyc -------------------------------------------------------------------------------- /__pycache__/html_outputer.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DragonFlyXD/baike-python/716cd57ed8db85282db9f56d273d7a01be9adaac/__pycache__/html_outputer.cpython-36.pyc -------------------------------------------------------------------------------- /__pycache__/html_parser.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DragonFlyXD/baike-python/716cd57ed8db85282db9f56d273d7a01be9adaac/__pycache__/html_parser.cpython-36.pyc -------------------------------------------------------------------------------- /__pycache__/url_manager.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DragonFlyXD/baike-python/716cd57ed8db85282db9f56d273d7a01be9adaac/__pycache__/url_manager.cpython-36.pyc -------------------------------------------------------------------------------- /html_downloader.py: -------------------------------------------------------------------------------- 1 | import urllib.request 2 | 3 | """ 4 | Html下载器 5 | """ 6 | 7 | 8 | class HtmlDownloader(object): 9 | @staticmethod 10 | def download(url): 11 | """ 12 | 下载该页面 13 | :param url: 14 | :return: 15 | """ 16 | if url is None: 17 | return None 18 | # 打开一个url,返回一个 http.client.HTTPResponse 19 | response = urllib.request.urlopen(url) 20 | # 若请求失败 21 | if response.getcode() != 200: 22 | return None 23 | return response.read() 24 | -------------------------------------------------------------------------------- /html_outputer.py: -------------------------------------------------------------------------------- 1 | """ 2 | Html输出器 3 | """ 4 | 5 | 6 | class HtmlOutputer(object): 7 | def __init__(self): 8 | self.datas = [] 9 | 10 | def collect_data(self, data): 11 | """ 12 | 收集数据 13 | :param data: 14 | :return: 15 | """ 16 | if data is None: 17 | return 18 | self.datas.append(data) 19 | 20 | def output_html(self): 21 | """ 22 | 将收集结果输出成Html页面 23 | :return: 24 | """ 25 | file_out = open('./output/output.html', 'w') 26 | file_out.writelines(['\n', '\n']) 27 | file_out.writelines('\n') 28 | file_out.writelines(['\n', '\n']) 29 | for data in self.datas: 30 | file_out.writelines('
\n') 31 | file_out.writelines( 32 | '

%s

\n' % (data['url'], data['title'])) 33 | file_out.writelines(['

%s

\n' % data['summary'], '
\n']) 34 | file_out.writelines(['\n', '']) 35 | file_out.close() 36 | -------------------------------------------------------------------------------- /html_parser.py: -------------------------------------------------------------------------------- 1 | import re 2 | import urllib.parse 3 | 4 | from bs4 import BeautifulSoup 5 | 6 | 7 | class HtmlParser(object): 8 | def parse(self, page_url, html_content): 9 | """ 10 | 解析该页面 11 | :param page_url: 12 | :param html_content: 13 | :return: 14 | """ 15 | if page_url is None or html_content is None: 16 | return 17 | soup = BeautifulSoup(html_content, 'html.parser', from_encoding='utf-8') 18 | new_urls = self._get_new_urls(page_url, soup) 19 | new_data = self._get_new_data(page_url, soup) 20 | return new_urls, new_data 21 | 22 | @staticmethod 23 | def _get_new_urls(page_url, soup): 24 | """ 25 | 获取该页面中所有的符合检验规则的url 26 | :param page_url: 27 | :param soup: 28 | :return: 29 | """ 30 | # 新的带爬取的url集合 31 | new_urls = set() 32 | # 获取所有符合检验规则的url 33 | links = soup.find_all('a', href=re.compile(r'/item/')) 34 | for link in links: 35 | new_url = link['href'] 36 | # 将相对路径的url拼接成绝对路径的url 37 | new_full_url = urllib.parse.urljoin(page_url, new_url) 38 | new_urls.add(new_full_url) 39 | return new_urls 40 | 41 | @staticmethod 42 | def _get_new_data(page_url, soup): 43 | """ 44 | 整合页面的数据 45 | :param page_url: 46 | :param soup: 47 | :return: 48 | """ 49 | # 该页面整合的数据 50 | res_data = {'url': page_url} 51 | 52 | """ 53 | 获取爬取页面的标题 54 |
55 |

Python

56 | """ 57 | title_node = soup.find('dd', class_='lemmaWgt-lemmaTitle-title').find('h1') 58 | res_data['title'] = title_node.get_text() 59 | """ 60 | 获取爬取页面的概要 61 |
62 |
63 | Python语法简洁清晰,特色之一是强制用空白符(white space)作为语句缩进。 64 |
65 | """ 66 | summary_node = soup.find('div', class_='lemma-summary') 67 | res_data['summary'] = summary_node.get_text() 68 | return res_data 69 | -------------------------------------------------------------------------------- /output/output.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 |
7 |

Python

8 |

9 | Python[1]  10 | (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明,第一个公开发行版发行于1991年。Python是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public License)协议[2]  11 | 。Python语法简洁清晰,特色之一是强制用空白符(white space)作为语句缩进。Python具有丰富和强大的库。它常被昵称为胶水语言,能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起。常见的一种应用情形是,使用Python快速生成程序的原型(有时甚至是程序的最终界面),然后对其中[3]  12 | 有特别要求的部分,用更合适的语言改写,比如3D游戏中的图形渲染模块,性能要求特别高,就可以用C/C++重写,而后封装为Python可以调用的扩展类库。需要注意的是在您使用扩展类库时可能需要考虑平台问题,某些可能不提供跨平台的实现。 13 |

14 |
15 |
16 |

BitTorrent

17 |

18 | 比特流(BitTorrent)是一种内容分发协议,由布拉姆·科恩自主开发。它采用高效的软件分发系统和点对点技术共享大体积文件(如一部电影或电视节目),并使每个用户像网络重新分配结点那样提供上传服务。一般的下载服务器为每一个发出下载请求的用户提供下载服务,而BitTorrent的工作方式与之不同。分配器或文件的持有者将文件发送给其中一名用户,再由这名用户转发给其它用户,用户之间相互转发自己所拥有的文件部分,直到每个用户的下载都全部完成。这种方法可以使下载服务器同时处理多个大体积文件的下载请求,而无须占用大量带宽。 19 |

20 |
21 |
22 |

FrostWire

23 |

24 | FrostWire(简称FW)是一个基于Limewire开发的P2P文件共享软件,比Limewire更好用,使用Java语言开发实现,具备友好的用户界面的系统。 25 |

26 |
27 |
28 |

汤显明

29 |

30 | 汤显明 (1950年- ), 前任香港廉政公署廉政专员,香港中文大学毕业,曾任保安局署理常任秘书长、香港海关关长、第十二届全国政协委员。1972年11月加入香港政府 ,2005年4月升级为甲级政务官。 31 |

32 |
33 |
34 |

二进制代码

35 |

36 | 二进制代码:由两个基本字符'0'、'1'组成的代码。其中,码元:"一位"二进制代码。码字:N个码元可以组成的不同组合,任意一个组合称一个码字二进制编码:用不同码字表示不同的信息的方法就叫二进制编码。如用1111表示15。区别例子:对15进行二进制编码的结果为1111,共需要4位二进制代码。二进制代码指令:是机器语言的指令集体系结构的表示方式。好比"加"在汇编中用add表示,类似的在这个中则是用1100表示(1100只是举例用,实际不是)机器语言:又称机器码,是用"二进制代码指令"表达(不是二进制代码)的计算机语言 37 |

38 |
39 |
40 |

命令提示符

41 |

42 | 命令提示符是在操作系统中,提示进行命令输入的一种工作提示符。在不同的操作系统环境下,命令提示符各不相同。在windows环境下,命令行程序为cmd.exe,是一个32位的命令行程序,微软Windows系统基于Windows上的命令解释程序,类似于微软的DOS操作系统。输入一些命令,cmd.exe可以执行,比如输入shutdown -s就会在30秒后关机。总之,它非常有用。打开方法:开始-所有程序-附件 或 开始-寻找-输入:cmd/cmd.exe 回车。它也可以执行BAT文件。 43 |

44 |
45 |
46 |

utilman.exe

47 |

48 | utilman.exe是一个系统进程,为Windows辅助工具管理器程序。 49 |

50 |
51 |
52 |

鼠标

53 |

54 | 鼠标是计算机的一种输入设备,也是计算机显示系统纵横坐标定位的指示器,因形似老鼠而得名“鼠标”(港台作滑鼠)。“鼠标”的标准称呼应该是“鼠标器”,英文名“Mouse”,鼠标的使用是为了使计算机的操作更加简便快捷,来代替键盘那繁琐的指令。鼠标是1964年由加州大学伯克利分校博士道格拉斯·恩格尔巴特[1]  55 | (Douglas Engelbart)发明的[2]  56 | ,当时道格拉斯·恩格尔巴特在斯坦福研究所(SRI)工作[3]  57 | ,该研究所是斯坦福大学赞助的一个机构,Douglas Engelbart很早就在考虑如何使电脑的操作更加简便,用什么手段来取代由键盘输入的繁琐指令。 58 |

59 |
60 |
61 |

pc

62 |

63 | 单片机及汇编语言中常称作PC(program counter)。 64 |

65 |
66 |
67 |

Windows操作系统

68 |

69 | Microsoft Windows,是美国微软公司研发的一套操作系统,它问世于1985年,起初仅仅是Microsoft-DOS模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家户户人们最喜爱的操作系统。Windows采用了图形化模式GUI,比起从前的DOS需要键入指令使用的方式更为人性化。随着电脑硬件和软件的不断升级,微软的Windows也在不断升级,从架构的16位、32位再到64位, 系统版本从最初的Windows 1.0 到大家熟知的Windows 95、Windows 98、Windows ME、Windows 2000、Windows 2003、Windows XP、Windows Vista、Windows 7、Windows 8、Windows 8.1、Windows 10 和 Windows Server服务器企业级操作系统,不断持续更新,微软一直在致力于Windows操作系统的开发和完善。 70 |

71 |
72 |
73 |

下载工具

74 |

75 | 下载工具是一种可以更快地从网上下载文本、图像、图像、视频、音频、动画等信息资源的软件。用下载工具下载东西之所以快是因为它们采用了“多点连接(分段下载)”技术,充分利用了网络上的多余带宽;采用“断点续传”技术,随时接续上次中止部位继续下载,有效避免了重复劳动。这大大节省了下载者的连线下载时间。 76 |

77 |
78 |
79 |

perl

80 |

81 | Perl,一种功能丰富的计算机程序语言,运行在超过100种计算机平台上,适用广泛,从大型机到便携设备,从快速原型创建到大规模可扩展开发。[1]  82 | Perl最初的设计者为拉里·沃尔(Larry Wall),于1987年12月18日发表。现在的版本为Perl 6,于2015年12月25日更新。Perl借取了C、sed、awk、shell 脚本语言以及很多其他程序语言的特性,其中最重要的特性是它内部集成了正则表达式的功能,以及巨大的第三方代码库CPAN。简而言之,Perl像C一样强大,像awk、sed等脚本描述语言一样方便,被Perl语言爱好者称之为“一种拥有各种语言功能的梦幻脚本语言”、“Unix 中的王牌工具”。Perl 一般被称为“实用报表提取语言”(Practical Extraction and Report Language),你也可能看到“perl”,所有的字母都是小写的。一般,“Perl”,有大写的 P,是指语言本身,而“perl”,小写的 p,是指程序运行的解释器。 83 |

84 |
85 |
86 |

wjview.exe

87 |

88 | wjview.exe是Microsoft Corp.推出的一个进程。 89 |

90 |
91 |
92 |

tracker

93 |

94 | Tracker 系统是是一套专业化的工装及刀具、夹具和量具智能数据库管理系统,它能对企业生产过程中的工装、刀具、夹具和量具进行整体的流程化管理,通过实时跟踪工装及刀夹量具的采购、出入库、修磨、报废、校准等过程,帮助库管员、工艺员、制造工程师和工装及刀夹量具主管等更有效地改善刀具管理过程,降低生产成本。[1]  95 | 96 |

97 |
98 |
99 |

源文件

100 |

101 | 源文件一般指用汇编语言或高级语言写出来的代码保存为文件后的结果。 102 |

103 |
104 |
105 |

临时文件

106 |

107 | 临时文件:在您下载和安装'卸载软件、打开电子邮件和即时消息程序中的文件或传输文件时创建。通常,创建临时文件的程序会在完成时将其删除,但有时候这些文件会被保留。临时文件被保留的原因可能有多种:程序可能在完成安装前被中断,或在重新启动时崩溃。在您进行网上冲浪时也会创建临时文件。Internet Explorer 之类的 Web 浏览程序也会在您的硬盘中保存网页的缓存,以提高以后浏览的速度。 108 |

109 |
110 |
111 |

系统盘

112 |

113 | 系统盘,一指一种电脑软件。是指控制和协调计算机及外部设备,支持应用的软件开发和运行的系统,是无需用户干预的各种程序的集合。重装计算机操作系统不可缺少的一个工具。二指装有操作系统的硬盘分区。 114 |

115 |
116 |
117 |

web

118 |

119 | web(World Wide Web)即全球广域网,也称为万维网,它是一种基于超文本和HTTP的、全球性的、动态交互的、跨平台的分布式图形信息系统。是建立在Internet上的一种网络服务,为浏览者在Internet上查找和浏览信息提供了图形化的、易于访问的直观界面,其中的文档及超级链接将Internet上的信息节点组织成一个互为关联的网状结构。[1]  120 | 121 |

122 |
123 |
124 |

程序设计

125 |

126 | 程序设计是给出解决特定问题程序的过程,是软件构造活动中的重要组成部分。程序设计往往以某种程序设计语言为工具,给出这种语言下的程序。程序设计过程应当包括分析、设计、编码、测试、排错等不同阶段。专业的程序设计人员常被称为程序员。任何设计活动都是在各种约束条件和相互矛盾的需求之间寻求一种平衡,程序设计也不例外。在计算机技术发展的早期,由于机器资源比较昂贵,程序的时间和空间代价往往是设计关心的主要因素;随着硬件技术的飞速发展和软件规模的日益庞大,程序的结构、可维护性、复用性、可扩展性等因素日益重要。[1]  127 | 128 |

129 |
130 |
131 |

磁盘扫描程序

132 |

133 | 电脑用户对Windows 9x的“磁盘扫描程序”都不陌生。我们不仅可以在Windows 9x的“程序→附件→系统工具”中看到它的身影,而且当你非正常关机后重新启动计算机时,它还会自动运行,对你的磁盘“不厌其烦”地进行扫描。那么,Windows的“磁盘扫描程序”到底在扫描什么呢?当然是扫描磁盘错误并加以纠正。 134 |

135 |
136 | 137 | -------------------------------------------------------------------------------- /output/style.css: -------------------------------------------------------------------------------- 1 | .g-wrap { 2 | margin: 20px; 3 | font-family: "monaco", 'menlo', sans-serif, serif; 4 | font-size: 16px; 5 | } 6 | .g-info .m-tt { 7 | text-align: center; 8 | font-size: 1.5em; 9 | } 10 | 11 | .g-info .m-tt a { 12 | color: #42b983; 13 | text-decoration: none; 14 | } 15 | 16 | .g-info .summary { 17 | line-height: 2em; 18 | color: gray; 19 | } -------------------------------------------------------------------------------- /spider_main.py: -------------------------------------------------------------------------------- 1 | import html_downloader 2 | import html_outputer 3 | import html_parser 4 | import url_manager 5 | 6 | """ 7 | 爬虫主程序 8 | """ 9 | 10 | 11 | class SpiderMain(object): 12 | # 初始化爬虫 13 | def __init__(self): 14 | # URL管理器 15 | self.urls = url_manager.UrlManager() 16 | # HTML下载器 17 | self.downloader = html_downloader.HtmlDownloader() 18 | # HTML解析器 19 | self.parser = html_parser.HtmlParser() 20 | # HTML输出器 21 | self.outputer = html_outputer.HtmlOutputer() 22 | 23 | # 爬虫的调动程序 24 | def craw(self, root_url): 25 | # 记录当前爬取的url序号 26 | cnt = 1 27 | # 添加爬取入口的url 28 | self.urls.add_new_url(root_url) 29 | # 若有新的待爬取的url,则一直循环爬取 30 | while self.urls.has_new_url(): 31 | try: 32 | # 获取新的待爬取的url 33 | new_url = self.urls.get_new_url() 34 | # 打印当前爬取的url序号与名字 35 | print('craw %d : %s' % (cnt, new_url)) 36 | # 下载爬取的页面 37 | html_content = self.downloader.download(new_url) 38 | # 解析爬取的页面 39 | new_urls, new_data = self.parser.parse(new_url, html_content) 40 | # 添加批量的带爬取的url 41 | self.urls.add_new_urls(new_urls) 42 | # 收集数据 43 | self.outputer.collect_data(new_data) 44 | # 爬取目标定为爬取20个url,若完成任务,则退出循环 45 | if cnt == 20: 46 | break 47 | cnt += 1 48 | except: 49 | print('craw failed.') 50 | 51 | # 输出收集好的数据 52 | self.outputer.output_html() 53 | 54 | 55 | if __name__ == '__main__': 56 | # 爬虫入口页面 57 | root_url = 'http://baike.baidu.com/item/Python' 58 | obj_spider = SpiderMain() 59 | # 启动爬虫 60 | obj_spider.craw(root_url) 61 | -------------------------------------------------------------------------------- /url_manager.py: -------------------------------------------------------------------------------- 1 | """ 2 | URL管理器 3 | """ 4 | 5 | 6 | class UrlManager(object): 7 | def __init__(self): 8 | self.new_urls = set() # 待爬取的url集合 9 | self.old_urls = set() # 已爬取的url集合 10 | 11 | def add_new_url(self, url): 12 | """ 13 | 添加新的带爬取的url 14 | :param url: 15 | :return: 16 | """ 17 | if url is None: 18 | return 19 | if url not in self.new_urls and url not in self.old_urls: 20 | # 若为新的Url,则添加进待爬取的url集合中 21 | self.new_urls.add(url) 22 | 23 | def add_new_urls(self, urls): 24 | """ 25 | 批量添加新的带爬取的url集合 26 | :param urls: 27 | :return: 28 | """ 29 | if urls is None or len(urls) == 0: 30 | return 31 | for url in urls: 32 | self.add_new_url(url) 33 | 34 | def has_new_url(self): 35 | """ 36 | 检测待爬取集合是否为空 37 | :return: 38 | """ 39 | return len(self.new_urls) != 0 40 | 41 | def get_new_url(self): 42 | """ 43 | 获取要爬取的url 44 | :return: 45 | """ 46 | new_url = self.new_urls.pop() # 获取url并从集合中剔除该url 47 | self.old_urls.add(new_url) # 将获取的url添加进已爬取的url中 48 | return new_url 49 | --------------------------------------------------------------------------------