urls模块化

当项目变大,urls增多,将其放在一个文件中不利于管理,可采用模块化方式,在app中新建文件存储相关子urls。同时需注意使用include函数包含子urls,匹配规则放于特定变量,拼接时避免多加斜杠。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

urls模块化

如果项目变得越来越大,那么url会越来越多,如果都放在urls.py文件中,那么不太好管理,因此我们可以将每个app自己的urls放到自己的app进行管理。一般我们会在app中新建一个urls.py文件来储存所有和这个app相关的子url。需要注意的地方:
1.应该使用include函数包含子url.py,并且这个url.py的路径是相对于项目的路径。
2.在appurls.py中,所有url匹配也有要放在一个叫做urlpatterns的变量中,否则找不到。
3.url是会根据urls.pyapp中的urls.py进行拼接的,因此注意不要多加斜杠。

实现一个简单的爬虫代码时,可以将代码分成以下几个模块: 1. URL管理模块:负责管理需要爬取的URL队列、已经爬取过的URL集合,以及判断一个URL是否可以爬取等功能; 2. HTML下载模块:负责下载指定URL对应的HTML页面,并将其返回给爬虫; 3. HTML解析模块:负责解析HTML页面,提取需要的数据和新的URL,并将它们返回给爬虫; 4. 数据存储模块:负责将爬取到的数据保存到本地文件或数据库中。 下面是一个简单的爬虫代码的模块化实现: ```python # url_manager.py class UrlManager: def __init__(self): self.new_urls = set() self.old_urls = set() def has_new_url(self): return len(self.new_urls) != 0 def add_new_url(self, url): if url not in self.new_urls and url not in self.old_urls: self.new_urls.add(url) def get_new_url(self): url = self.new_urls.pop() self.old_urls.add(url) return url # html_downloader.py import urllib.request class HtmlDownloader: def download(self, url): if url is None: return None response = urllib.request.urlopen(url) if response.getcode() != 200: return None return response.read() # html_parser.py from bs4 import BeautifulSoup import re import urllib.parse class HtmlParser: def parse(self, url, html_content): if url is None or html_content is None: return None soup = BeautifulSoup(html_content, 'html.parser') new_urls = self._get_new_urls(url, soup) new_data = self._get_new_data(url, soup) return new_urls, new_data def _get_new_urls(self, url, soup): new_urls = set() links = soup.find_all('a', href=re.compile(r'^/item/')) for link in links: new_url = urllib.parse.urljoin(url, link['href']) new_urls.add(new_url) return new_urls def _get_new_data(self, url, soup): data = {} data['url'] = url title = soup.find('dd', class_='lemmaWgt-lemmaTitle-title').find('h1').get_text() data['title'] = title summary = soup.find('div', class_='lemma-summary').get_text() data['summary'] = summary return data # html_outputer.py class HtmlOutputer: def __init__(self): self.datas = [] def collect_data(self, data): if data is None: return self.datas.append(data) def output_html(self): fout = open('output.html', 'w', encoding='utf-8') fout.write('<html>') fout.write('<head><meta charset="utf-8"></head>') fout.write('<body>') fout.write('<table>') for data in self.datas: fout.write('<tr>') fout.write('<td>%s</td>' % data['url']) fout.write('<td>%s</td>' % data['title']) fout.write('<td>%s</td>' % data['summary']) fout.write('</tr>') fout.write('</table>') fout.write('</body>') fout.write('</html>') fout.close() # spider_main.py class SpiderMain: def __init__(self): self.urls = UrlManager() self.downloader = HtmlDownloader() self.parser = HtmlParser() self.outputer = HtmlOutputer() def crawl(self, root_url): self.urls.add_new_url(root_url) while self.urls.has_new_url(): try: new_url = self.urls.get_new_url() html_content = self.downloader.download(new_url) new_urls, new_data = self.parser.parse(new_url, html_content) self.urls.add_new_urls(new_urls) self.outputer.collect_data(new_data) except Exception as e: print('crawl failed:', e) self.outputer.output_html() ``` 这个爬虫程序中,每个模块都有自己的功能,且它们之间相互独立。这种模块化的实现方式可以让代码更加清晰,易于维护和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值