一、前言
上篇爬虫入门篇笔记设计了基本的项目结构和对应的代码功能。根据设计好的项目结构,我们选定个目标网站进行实践采集,完成爬虫的具体实现。
二、需求分析
- 目标网址:郑州工业大学新闻网
- 目标数据:
- 新闻链接(url)
- 新闻标题(tile)
- 发布时间(datetime)
- 浏览次数(visitcount)
三、代码实现
- URL管理器
# 待爬取集合
new_urls = set()
# 已爬取集合
old_urls = set()
def add_new_url(url):
'''
添加新URL到待爬取集合中
input:
url
output:
无
'''
new_urls.add(url)
def add_new_urls(urls):
'''
一次性添加多个URLs到待爬取集合中
input:
urls
output:
无
'''
for url in urls:
new_urls.add(url)
def get_new_url():
'''
从待爬取集合中获取一个新的待爬取URL
input:
无
output:
url
'''
next_url = new_urls.pop()
return next_url
def has_new_url():
'''
判断是否还有待爬取URL
input:
无
output:
True or False
'''
result = False
if new_urls:
result = True
return result
- 网页下载器
from urllib import request
def download(url):
'''
下载参数url指示的网页数据,并将网页数据全部返回
input:
url
output:
网页数据
'''
response = request.urlopen(url)
html_cont = response.read().decode("utf-8")
return html_cont
- 数据处理器
data_list = []
def collect_data(data):
data_list.append(data)
def output_html():
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 dataitem in data_list:
try:
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>')
except BaseException as e:
print("新闻《" + dataitem['title'] + "》写入失败")
print(e)
fout.write('</table>')
fout.write('</body>')
fout.write('</html>')
fout.close()
- 爬虫解析器和爬虫启动器代码见资源文件。代码较长就不放上来了。
四、测试结果
爬虫的基本代码思路千篇一律,只要掌握了里面的逻辑,我们可以对爬虫进行更多拓展,进阶更高级的爬虫。