首先来张图
此网站的url为http://www.sec-wiki.com/news/index
如图所示,首页上是资讯列表,点击标题后会跳到详情页,然后详情页也有一个和首页相同的标题,这个标题中包含着真正的文章地址,所以我们要做的就是先获取第一页中的标题链接,根据这个链接进入到详情页面,然后从详情页获取到标题的名称,连接,和时间即可。
但是还有一个问题,和电影天堂一样,在首页中可以看到,我们的电影或者资讯文章有很多,首页没有完全列出来,而是分页了,根据观察可以看出翻页的url很有规律:http://www.sec-wiki.com/news/index?News_page=
,等号后面填写相应的页面数就可以跳转到对应页,但是这个页面不可能没有尽头,因为文章数是有限的,这件事情有两种解决方法,如下
- 页面数一直增长,等到某一个页面我们没有获取到需要的东西时,说明已经到终点了,抛出异常
- 找到这个最终的页面数,然后根据这个数字进行循环
我们在这用的是第二种方法,因为在页面中查看<末页>的html代码可以看到这里边写的就是最终的页面数,我们用一个正则将这个数字匹配出来,正则表达式是这样的:<li class="last"><a href="/news/index\?News_page=(.*?)
所以我们只需要根据这个提取出来的数字利用for循环就可以了,主函数代码如下:
|
|
我们知道你要爬取任何信息的必要步骤都是要将目标url的代码先获取回来,所以将这个功能封装成一个函数如下:
|
|
这里getOnePage有两个参数,一个是url,另一个是页面数,如果你要获取每一个页面的代码时第二个参数是有用的,但是如果我想根据咨询列表中获得的url进入详情页时,我只需传入一个详情页的url即可,这就用到了默认参数,将这个值设定为0,然后在函数中,判断这个值是否为0,如果为0则是想获得详情页代码,直接请求传入的url即可;如果不为0,则要将url和页面数拼凑成最终的页面url,然后再请求这个url。
现在铺垫都已经做完了,接下来完成主要的事情,就是提取信息:
|
|
我们首先需要先从页面的代码中提取出来详情页的url,根据观察页面代码可以知道,所有的详情页的url都是在
经过观察每一个详情页的url,发现详情页的url只有路径,没有域名,所以这一步还需要将详情页路径和域名拼凑起来,就有了这一句代码
childUrl ='http://www.sec-wiki.com'+url
。有了详情页的url后,我们只需利用getOnePage()这个函数去获取每一个详情页的代码,然后提取最终需要的信息。
这里也是用了一个正则表达式<strong>(.*?)</strong>.*?<a href="(.*?)">(.*?)</a>
解释一下
childPattern=re.compile(‘(.?).?(.*?)‘,re.S)
items = re.findall(childPattern,sonCode)
for item in items:
infoDic[‘time’] = item[0]
infoDic[‘url’] = item[1]
infoDic[‘title’] = item[2]
```
上面三个(.*?)
分别是文章时间、文章url、文章标题。于是对应着item[0]、item[1]、item[2]。
这样我们需要的信息就提取出来了,将每一个信息的字典添加到一个列表中返回给主函数就大功告成了。
此文件的github地址:https://github.com/lowkeynic4/crawl/blob/master/secwiki/secwiki.py