一、前言
前面几篇爬虫入门篇文章记录了一些简单的爬虫知识,今天结合网络请求流程,实现一个基本的爬虫架构。以后可以根据这个架构代码,对自己的爬虫需求进行拓展。
二、框架代码设计
本爬虫框架的设计思路可先参考上一篇爬虫入门的爬虫架构文章
code_space_spider_demo
├─html_downloader.py 网页下载器
├─html_outputer.py 数据处理器
├─html_parser.py 网页解析器
├─output.html 数据展示html
├─spider_main.py 爬虫启动器
├─urls_manager.py URL管理器
三、代码实现
- URL管理器(用来存放待采集网页的链接,提供入栈、出栈、判空的功能)
# 待爬取集合
new_urls = set()
# 已爬取集合
old_urls = set()
def add_new_url(url):
'''
添加新URL到待爬取集合中
input:
url
output:
无
'''
pass
def add_new_urls(urls):
'''
一次性添加多个URLs到待爬取集合中
input:
urls
output:
无
'''
pass
def get_new_url():
'''
从待爬取集合中获取一个新的待爬取URL
input:
无
output:
url
'''
pass
def has_new_url():
'''
判断是否还有待爬取URL
input:
无
output:
True or False
'''
pass
- 网页下载器(根据提供的url,下载网页响应的html数据)
from urllib import request
def download(url):
'''
下载参数url指示的网页数据,并将网页数据全部返回
input:
url
output:
网页数据
'''
pass
- 数据处理器
data_list = []
def collect_data(data):
data_list.append(data)
def output_html():
fout = open('output.html', 'w')
fout.write('<html>')
fout.write('<body>')
fout.write('<table>')
for dataitem in data_list:
fout.write('<tr>')
# fout.write('<td>%s</td>' % dataitem['url']) 自定义爬取的数据
# fout.write('<td>%s</td>' % dataitem['title'])
# fout.write('<td>%s</td>' % dataitem['datetime'])
# fout.write('<td>%s</td>' % dataitem['visitcount'])
fout.write('</tr>')
fout.write('</table>')
fout.write('</body>')
fout.write('</html>')
fout.close()
- 网页解析器
import re
from bs4 import BeautifulSoup
from urllib.parse import urljoin
def get_new_urls(page_url, soup):
'''
从当前正在爬取的页面上提取所有目标URLs
input:
page_url -> 当前正在爬取的页面的URL
soup -> 当前正在爬取的页面数据的BeautifulSoup对象
output:
所有目标URLs
'''
pass
def get_new_data(page_url, soup):
'''
从当前正在爬取的页面上提取目标信息(例如标题,日期时间,访问次数)
input:
page_url -> 当前正在爬取的页面的URL
soup -> 当前正在爬取的页面数据的BeautifulSoup对象
outut:
res_data -> 字典类型,例如url, title, datetime, visitcount
'''
pass
def parse(page_url, html_cont):
if page_url is None or html_cont is None:
return
soup = BeautifulSoup(html_cont, 'html.parser', from_encoding='utf-8')
new_urls = get_new_urls(page_url, soup)
new_data = get_new_data(page_url, soup)
return new_urls, new_data
- 爬虫启动器
def craw(root_url):
'''
1.爬取页面
2.爬取并提取页面信息后,以html文件的形式输出
'''
pass
if __name__ == '__main__':
root_url = '' #定义想采集的页面
craw(root_url)