
一、需求
1定时抓取固定网站新闻标题、内容、发表时间和来源。
2程序需要支持分布式、多线程
二、设计
1网站是固定,但是未来也可能添加新的网站去抓取,每个网站内容节点设计都不一样,这样就需要支持动态可配置来新增网站以方便未来的扩展,这样就需要每次都需要开发介入。
2网站html节点的结构可能发生变化,所以也要支持提取节点可配置。
3怎样支持分布式?暂时最简单的想法就是:多机器部署程序,还有新搞一台或者部署程序其中一台制作一个定时任务,定时开启每台机器应该抓取哪个网站,暂时不能支持同一个网站同时可以支持被多台机器同时抓取,这样会比较麻烦,要用到分布式队列。所以暂时一个网站同时只会被单台机器抓取。
4多线程,怎样多线程?多线程抓取我这边有两个实现:
(1)一个线程抓取一个网站,维护一个自己的url队列做广度抓取,同时抓取多个网站。如图:
(2)多个线程同时抓取不同的网站。如图:
以上两张办法其实各有优点,也给有缺点,看我们怎么取舍了。
方法1:每个线程创建一个自己的队列,图中的queue可以不用concurrentQueue,优点:不涉及到控制并发,每个网站一个线程抓取一个网站,抓取完毕即自动回收销毁线程。控制方便。缺点:线程数不可以扩展,例如当只有3个网站,你最多只能开3个线程来抓取,不能开更多,有一定的局限性。
方法2:N个线程同时抓取N个网站,线程数和网站数目不挂钩,优点:线程数可以调整并且和和抓取网站数量无关。3个网站我们可以开4个5个或者10个这个可以根据您的硬件资源进行调整。缺点:需要控制并发,并且要控制什么时候销毁线程(thread1空闲,并且queue为空不代表任务可以结束,可能thread2结果还没返回),当被抓取的网站响应较慢时,会拖慢整个爬虫进度。
三、实现
抓取方式最终还是选择了方法二,因为线程数可配置!
使用技术:
jfinal用了之后才发现这东西不适合,但是由于项目进度问题,还是使用了。
maven项目管理
jettyserver
mysql
eclipse开发
项目需要重点攻破的难点:
(1)合理的控制N个线程正常的抓取网站,并且当所有线程工作都完成了并且需要抓取的队列为空时,N个线程同时退出销毁。
(2)不同网站设计节点不一样,需要通过配置解决各个网站需要抓取的URL和抓取节点内容在html节点的位置。
(3)个性化内容处理,由于html结构设计问题,北大青鸟认为抓取的内容可能有些多余的html标签,或者多余的内容该怎么处理。
很简单的一个爬虫
import requests
print(requestsget(">这个简单爬虫就是把百度搜索页面采集了下来,其实就是一次简单的>
visual studio 的winform就可以
先确定爬行的网址
下载网址的文本,然后用正则表达式提取出电子邮件地址
我习惯用c#,做过类似的东西。
需要帮助的话加我的QQ:12880764
以下代码调试通过:
# coding=utf-8import urllib
def getHtml(url):
page = urlliburlopen(url)
html = pageread()
return html
html = getHtml("
运行效果:
#coding=utf-8
from bs4 import BeautifulSoup
with open('indexhtml', 'r') as file:
fcontent = fileread()
sp = BeautifulSoup(fcontent, 'htmlparser')
t = 'new_text_for_replacement'
# replace the paragraph using `replace_with` method
spfind(itemprop='someprop')replace_with(t)
# open another file for writing
with open('outputhtml', 'w') as fp:
# write the current soup content
fpwrite(spprettify())
如果要替换段落的内容而不是段落元素本身,可以设置string属性。
spfind(itemprop='someprop')string = t
赞0收藏0评论0分享
用户回答回答于 2018-07-26
问题取决于你搜索标准的方式,尝试更改以下代码:
print(spreplace(spfind(itemprop="someprop")text,t))
对此:
print(spreplace(spfind({"itemprop":"someprop"})text,t))
# coding:utf-8
from bs4 import BeautifulSoup
import requests
import os
url = '>
Python简单易学、免费开源、高层语言、可移植性超强、可扩展性、面向对象、可嵌入型、丰富的库、规范的代码等。Python除了极少的涉及不到的开发之外,其他基本上可以说全能:系统运维、图形处理、数学处理、文本处理、数据库编程、网络编程、web编程、多媒体应用、pymo引擎、爬虫编写、机器学习、人工智能等等。Python的应用特别广,中国现在的人才缺口超过100万。
如果你想要专业的学习Python开发,更多需要的是付出时间和精力,一般在2w左右。应该根据自己的实际需求去实地看一下,先好好试听之后,再选择适合自己的。只要努力学到真东西,前途自然不会差。
以上就是关于Java多线程爬虫实现全部的内容,包括:Java多线程爬虫实现、一个简单的爬虫的是啥、怎么样做一个简单的网络爬虫程序,实现爬出一个网页中的EMAIL地址的功能。流程怎么样的急求~跪求~等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)