基于python实现垂直爬虫系统的方法详解
作者:bwt_D 发布时间:2023-11-17 13:33:38
标签:python,垂直,爬虫,系统
html_downloader
from urllib import request
def download(url):
if url is None:
return
response = request.urlopen(url)
if response.getcode() != 200:
return None
return response.read()
html_outeputer
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()
html_parser
import re
from bs4 import BeautifulSoup
from urllib.parse import urljoin
def get_new_urls(page_url, soup):
new_urls = set()
links = soup.find_all('a', href=re.compile(r"/\d+/\d+/\w+/page\.htm"))
for link in links:
new_url = link['href']
new_full_url = urljoin(page_url, new_url)
new_urls.add(new_full_url)
return new_urls
def get_new_data(page_url, soup):
res_data = {}
title_node = soup.find('h1', class_='arti-title')
if title_node is None:
return res_data
res_data['title'] = title_node.get_text()
datetime_node = soup.find('span', class_='arti-update')
res_data['datetime'] = datetime_node.get_text()
visitcount_node = soup.find('span', class_='WP_VisitCount')
res_data['visitcount'] = visitcount_node.get_text()
res_data['url'] = page_url
return res_data
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
spider_main
import urls_manager, html_downloader, \
html_parser, html_outputer
def craw(root_url):
count = 1
urls_manager.add_new_url(root_url)
#启动爬虫循环
while urls_manager.has_new_url():
new_url = urls_manager.get_new_url()
print('craw %d : %s' % (count, new_url))
html_cont = html_downloader.download(new_url)
new_urls, new_data = html_parser.parse(new_url, html_cont)
urls_manager.add_new_urls(new_urls)
if new_data:
html_outputer.collect_data(new_data)
if count == 10:
break
count = count + 1
html_outputer.output_html()
if __name__ == '__main__':
root_url = 'http://news.zzuli.edu.cn/'
craw(root_url)
import urls_manager, html_downloader, \
html_parser, html_outputer
def craw(root_url):
count = 1
urls_manager.add_new_url(root_url)
#启动爬虫循环
while urls_manager.has_new_url():
new_url = urls_manager.get_new_url()
print('craw %d : %s' % (count, new_url))
html_cont = html_downloader.download(new_url)
new_urls, new_data = html_parser.parse(new_url, html_cont)
urls_manager.add_new_urls(new_urls)
if new_data:
html_outputer.collect_data(new_data)
if count == 10:
break
count = count + 1
html_outputer.output_html()
if __name__ == '__main__':
root_url = 'http://news.zzuli.edu.cn/'
craw(root_url)
test_64
from bs4 import BeautifulSoup
import re
html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
<p class="story">...</p>
"""
soup = BeautifulSoup(html_doc, 'html.parser')
print('获取所有链接')
links = soup.find_all('a')
for link in links:
print(link.name, link['href'], link.get_text())
print('获取lacie链接')
link_node = soup.find('a', href='http://example.com/lacie')
print(link_node.name, link_node['href'], link_node.get_text())
print('正则匹配')
link_node = soup.find('a', href=re.compile(r'ill'))
print(link_node.name, link_node['href'], link_node.get_text())
print('获取P段落文字')
p_node = soup.find('p', class_='title')
print(p_node.name, p_node.get_text())
urls_manager
new_urls = set()
old_urls = set()
def add_new_url(url):
if url is None:
return
if url not in new_urls and url not in old_urls:
new_urls.add(url)
def add_new_urls(urls):
if urls is None or len(urls) == 0:
return
for url in urls:
add_new_url(url)
def get_new_url():
new_url = new_urls.pop()
old_urls.add(new_url)
return new_url
def has_new_url():
return len(new_urls) != 0
来源:https://blog.csdn.net/bwt_D/article/details/123238555
0
投稿
猜你喜欢
- 首先,与其他语言不同,JS的效率很大程度是取决于JS engine的效率。除了引擎实现的优劣外,引擎自己也会为一些特殊的代码模式采取一些优化
- 本文实例讲述了Golang算法问题之整数拆分实现方法。分享给大家供大家参考,具体如下:一个整数总可以拆分为2的幂的和,例如:7=1+2+47
- 就javascript来说,iframe创建的框架和frameset创建的框架一样。这里有个关系图,做个笔记。图片源自《javascript
- MapPathMapPath 方法将指定的相对或虚拟路径映射到服务器上相应的物理目录上。语法Server.MapPath( Path ) 参
- 在不久前的一天,当我为了解决一个语法问题来翻阅VBscript文档时,偶然间发现在了下面的一句话: &nb
- 学习JQUERY就应该从最基本的学起,基本的就应该是语法了,在这里,我们有必要先温习一下JAVASCRIPT的一些知识。语法就不用说了,都是
- 阅读作者上一篇文章:段正淳的css笔记(4)css代码的简写CSS未知图片垂直居中的方法:一天大家在团队中讨论“未知图片垂直居中”的问题,突
- ORA-01578:Oracle data block corrupted(file # num,block # num)产生原
- 如何使用数据绑定控件实现不换页提交数据?Chunfeng.html' 提交页面< html><
- 方法一、尽量使用复杂的SQL来代替简单的一堆 SQL.同样的事务,一个复杂的SQL完成的效率高于一堆简单SQL完成的效率。有多个查询时,要善
- 如何正确理解和使用Command、Connection和 Recordset三个对象?我知道它们都是连接数据库的“好手”,但在编程的具体应用
- 什么是PHPPHP代表了"超文本处理器",这意味着你必须知道,它是一种服务器端的处理语言,且以HTML的形式出现。它最常
- sql语句中默认是不区分大小写的,所以语句: Sql代码 SELECT * FROM RecEngineBizInfo WHERE RecE
- 1 引子 Java,C#等各种高级语句的开发工具琳琅满目,争放异彩。但作为AJAX的主角的JavaScri
- AJAX应用因为它们的表现力的丰富、更加互动和更加迅速的响应得到了赞扬声;这些优点都是通过使用XMLHttpRequest对象来动态的载入数
- 前几天翻出以前写的一个纯CSS仿微软经典菜单,现在看来才感叹,微软的经典菜单确实很经典,至少看起来不觉得厌烦。感叹归感叹,想想既然可以实现下
- 远程服务器配置可以使得数据库管理员在服务器以外的主机上连接到一个SQL Server实例,以便管理员在没有建立单据连接的情况下在其他的SQL
- 通常来说,在MyISAM里读写操作是串行的,但当对同一个表进行查询和插入操作时,为了降低锁竞争的频率,根据concurrent_insert
- 嘀咕嘀咕: 每次写文章往往开头是最难的,总想给UED读者不同的sense。就像我们设计产品总是想迎合我们的用户,最后觉得好似跟在用户后面狂奔
- Opera, 作为 A-Grade 浏览器,在现在的前端开发中务必支持。它很优秀,很不幸,bug是每个浏览器都不可避免的问题,Opera亦难