抓取论坛分页xml配置

天王盖地虎_820 发布于 2013/08/15 21:13
阅读 592
收藏 0

@自风 你好,想跟你请教个问题:

按照你上午的建议,我现在在测试抓取论坛的分页,还是只能抓取第一页的数据。

<?xml version="1.0" encoding="UTF-8"?>
<beans>
	<site name="sg" enable="1" includeHttps="1" url="http://bbs.sgamer.com/forum-44-1.html"
	      reqDelay="1s" charset="utf-8" schedule="1h" thread="2" waitQueue="10s">
		<queueRules policy="and">
			<rule type="!regex" value="^.*\.(jpg|png|gif)$" />
		</queueRules>
		<!--
		  | 抓取目标
		-->
		<targets>
			<sourceRules policy="and">
				<rule type="regex" value="http://bbs\.sgamer\.com/forum-44(-\d+)\.html">
					<digUrls>
						<!--下一页码-->
						<field name="next_page_num" isParam="1">
							<parsers>
								<parser xpath="//div[@class='mn']//div[@id='pgt']//span[@id='fd_page_top']//div[@class='pg']//strong/text()" />
								<parser exp="$Util.toInt($this)+1" />
							</parsers>
						</field>
						<field name="source_url">
							<parsers>
								<parser exp="'http://bbs.sgamer.com/forum-44-'+$fields.next_page_num+'.html'" />
							</parsers>
						</field>
						<field name="target_url" isArray="1">
							<parsers>
								<parser xpath="//div[@class='bm_c']//form[@id='moderate']//table//tbody//tr//th[@class='new']//a[@href]" attribute="href"/>
							</parsers>
						</field>
					</digUrls>
				</rule>
			</sourceRules>
			 
			<target name="article" isForceUseXmlParser="1">
				<urlRules policy="and">
					<rule type="regex" value="http://bbs\.sgamer\.com/thread-\d{8}-\d{1}-\d{1}\.html" />
				</urlRules>
				<model isIgnoreComments="1">
					<!--
					<namespaces>
						<namespace prefix="" uri="" />
					</namespaces>
					-->
					<field name="title">
						<parsers>
							<parser xpath="//div[@id='postlist']//table//tbody//tr//td[@class='plc ptm pbn vwthd']//h1[@class='ts']//a[@id='thread_subject']//text()"/>
						</parsers>
					</field>
					<field name="content" isAlsoParseInNextPage="1" isTrim="1">
						<parsers>
							<parser xpath="//div[@id='postlist']//div[1]//table[1]//tbody//tr//td[2]//div[@class='pct']" exp="$output($this)" />
							<!--attribute 黑名单-->
							<parser exp="$Attrs.xml($this).rm('class').rm('style').rm('width').rm('height').rm('usemap').rm('align').rm('border').rm('title').rm('alt').ok()" />
							<!--tag 黑名单,去掉内嵌内容-->
							<parser exp="$Tags.xml($this).rm('map').rm('iframe').rm('object').empty().ok()" />
							<!--tag 白名单,保留的标签,除此之外都要删除(不删除其他标签内嵌内容)-->
							<parser exp="$Tags.xml($this).kp('br').kp('h1').kp('h2').kp('h3').kp('h4').kp('h5').kp('h6').kp('table').kp('th').kp('tr').kp('td').kp('img').kp('p').kp('a').kp('ul').kp('ol').kp('li').kp('td').kp('em').kp('i').kp('u').kp('er').kp('b').kp('strong').ok()" />
							<!--其他-->
						</parsers>
					</field>
					<!-- 
					<field name="author">
						<parsers>
							<parser xpath="//div[@class='stat']//a[@target='_blank']/text()"/>
						</parsers>
					</field>
					<field name="tags" isArray="1">
						<parsers>
							<parser xpath="//div[@class='Tags']//a/text()"/>
						</parsers>
					</field>
					<field name="answers" isArray="1">
						<parsers>
							<parser xpath="//li[@class='Answer']//div[@class='detail']/text()" />
						</parsers>
					</field>
					 -->
				</model>
			</target>
		</targets>
		<!--
		  | 插件
		-->
		<plugins>
			<plugin enable="1" name="spider_plugin" version="0.0.1" desc="这是一个官方实现的默认插件,实现了所有扩展点。">
				<extensions>
					<extension point="task_poll">
						<impl type="" value="org.eweb4j.spiderman.plugin.impl.TaskPollPointImpl" sort="0"/>
					</extension>
					<extension point="begin">
						<impl type="" value="org.eweb4j.spiderman.plugin.impl.BeginPointImpl" sort="0"/>
					</extension>
					<extension point="fetch">
						<impl type="" value="org.eweb4j.spiderman.plugin.impl.FetchPointImpl" sort="0"/>
					</extension>
					<extension point="dig">
						<impl type="" value="org.eweb4j.spiderman.plugin.impl.DigPointImpl" sort="0"/>
					</extension>
					<extension point="dup_removal">
						<impl type="" value="org.eweb4j.spiderman.plugin.impl.DupRemovalPointImpl" sort="0"/>
					</extension>
					<extension point="task_sort">
						<impl type="" value="org.eweb4j.spiderman.plugin.impl.TaskSortPointImpl" sort="0"/>
					</extension>
					<extension point="task_push">
						<impl type="" value="org.eweb4j.spiderman.plugin.impl.TaskPushPointImpl" sort="0"/>
					</extension>
					<extension point="target">
						<impl type="" value="org.eweb4j.spiderman.plugin.impl.TargetPointImpl" sort="0"/>
					</extension>
					<extension point="parse">
						<impl type="" value="org.eweb4j.spiderman.plugin.impl.ParsePointImpl" sort="0"/>
					</extension>
					<extension point="end">
						<impl type="" value="org.eweb4j.spiderman.plugin.impl.EndPointImpl" sort="0"/>
					</extension>
				</extensions>
				<providers>
					<provider>
						<orgnization name="CFuture" website="http://lurencun.com" desc="Color your future">
							<author name="weiwei" website="http://laiweiweihi.iteye.com | http://my.oschina.net/laiweiwei" email="l.weiwei@163.com" weibo="http://weibo.com/weiweimiss" desc="一个喜欢自由、音乐、绘画的IT老男孩" />
						</orgnization>
					</provider>
				</providers>
			</plugin>
		</plugins>
	</site>
</beans>

 

加载中
0
自风
自风
抱歉,来晚了。
你打开第二页的列表页看看,你写的目标URL的xpath错了,只对第一页有效,第一页是//th[@class='new']但是第二页的是//th[@class='common'] ,我猜测其他页也不是 new的了。再仔细研究下,会发现其实它这个th是固定一个作为详细帖子内容的链接的,因此你可以直接这么写//th[1],最后完整的 target_url 规则这么写就行了,我本地已经测试过了:

<field name="target_url" isArray="1">
	<parsers>
		<parser xpath="//div[@class='bm_c']//form[@id='moderate']//table//tbody//tr//th[1]//a[@href]" attribute="href"/>
	</parsers>
</field>
0
自风
自风
这个就没必要用到 next_page_num 这种思路了,因为它不是用js来生成分页url的,而是直接在页面源码提供了。你好好看下。<span id=" fd_page_bottom"
天王盖地虎_820
天王盖地虎_820
呼叫自风哇
0
天王盖地虎_820
天王盖地虎_820

引用来自“自风”的答案

这个就没必要用到 next_page_num 这种思路了,因为它不是用js来生成分页url的,而是直接在页面源码提供了。你好好看下。<span id=" fd_page_bottom"
<field name="source_url" isArray="1">
       <parsers>
        <parser xpath="//span[@id='fd_page_bottom']//div[@class='bg']//a[@href]" attribute="href"/>
       </parsers>
      </field>

 

根据你的提示,我这样写还是不行.

0
自风
自风

引用来自“自风”的答案

抱歉,来晚了。
你打开第二页的列表页看看,你写的目标URL的xpath错了,只对第一页有效,第一页是//th[@class='new']但是第二页的是//th[@class='common'] ,我猜测其他页也不是 new的了。再仔细研究下,会发现其实它这个th是固定一个作为详细帖子内容的链接的,因此你可以直接这么写//th[1],最后完整的 target_url 规则这么写就行了,我本地已经测试过了:

<field name="target_url" isArray="1">
	<parsers>
		<parser xpath="//div[@class='bm_c']//form[@id='moderate']//table//tbody//tr//th[1]//a[@href]" attribute="href"/>
	</parsers>
</field>
蛋疼, @红薯 怎么这个代码高亮长度超出了不会自动出现横向滚动的?这是一个很严重的bug,求fix。

PS:xpath完整内容是
//div[@class='bm_c']//form[@id='moderate']//table//tbody//tr//th[1]//a[@href]

自风
自风
@红薯 再次蛋疼,这次发出去发现会自动转行了,刚刚明明还不行的!
返回顶部
顶部