练手写的python网页采集脚本

Ubuntu每日小技巧:

现在学习python 做为练手写了个网站内容采集脚本.

实现功能如下:

 

1.根据配置文件进行采集.
2.支持命令行参数 如: python corn.py --config=urls.ini
3.根据规则生成url列表集(只支持数字,能倒序采集).
4.根据规则获取列表页面特定位置,从而进一步分析缩小范围分析内容页面url.
5.将内容部分url存储到文件,每行一个url,并且在写入的时候进行判断是否已经存在相同url.
6.Bug太多,我慢慢完善.

使用方法:  ubuntu环境  终端运行 python xxx.py --config=xxx.ini

                windows环境 修改#!/usr/bin/python 为你的python.exe目录 在命令行运行 python xxx.py --config=xxx.ini

 

下面给出代码 保存成.py文件:

Python代码
  1. #!/usr/bin/python  
  2. #-*-coding:utf-8-*-  
  3.   
  4. #  简单的蜘蛛采集程序  
  5. #  小项  
  6. #  2008-09-18  
  7.   
  8.   
  9. import sys;  
  10. import getopt;  
  11. import re;  
  12. import urllib;  
  13. import ConfigParser;  
  14. import time;  
  15. import MySQLdb as mysql;  
  16.   
  17.   
  18. if __name__ == "__main__":  
  19.   
  20.     try:  
  21.         opts,argv = getopt.getopt(sys.argv[1:],'c:',['config=']);  
  22.     except getopt.GetoptError:  
  23.         Help()  
  24.       
  25.     for keys,cut in opts:  
  26.         #if keys in ('-w','--write'):  
  27.         #    writefile()  
  28.         if keys in ('-c','--config'):  
  29.             cut  
  30.   
  31. try:  
  32.     conf = ConfigParser.ConfigParser();  
  33.     conf.readfp(open(cut));  
  34.   
  35. #==读取采集配置文件==#  
  36. #--urllibs--#  
  37.     starturl = conf.get("urllibs","starturl");  
  38.     startpage = int(conf.get("urllibs","startpage"));  
  39.     endpage = int(conf.get("urllibs","endpage"));  
  40.     urltemp = starturl + conf.get("urllibs","urltemp");  
  41.     filelist = conf.get("urllibs","urllist");  
  42.     dellist = conf.get("urllibs","dellist");  
  43. #--countcfg--#  
  44.     Stops = int(conf.get("countcfg","Stops"));  
  45.   
  46.     Divurl = conf.get("countcfg","Divurl");  
  47.     Urlls = conf.get("countcfg","Urlls");  
  48.   
  49.     Title = conf.get("countcfg","Title");  
  50.     Keywords = conf.get("countcfg","Keywords");  
  51.     Description = conf.get("countcfg","Description");  
  52.   
  53.   
  54.     url = [ urltemp % page for page in range(startpage,endpage) ];  
  55.     for url in url:  
  56.         urllist = urllib.urlopen(url).read(); #读取web文件  
  57.         urls = re.findall(Divurl,urllist); #获取指定的特定区域  
  58.     #将urls{属性为list}转换成str属性的以便于再次获取  
  59.         c = "";  
  60.         urls = c.join(urls);  
  61.         urlls = re.findall(Urlls,urls);  
  62.         urlfile = file(filelist,'r+a'); #打开文件进行追加数据  
  63.         outurl = urlfile.readlines();  
  64.       
  65.         for urlls in set(urlls):  
  66.         #==整理url并进行重复判断==#  
  67.             curls = urlls + "\n";  
  68.           
  69.             if curls in outurl:  #对找到的连接列表进行循环  
  70.                 print urlls + "页面重复跳过";  
  71.                 continue;  # break 是属于整个跳过,continue 是属于跳回去继续执行  
  72.             urlfile.write(urlls + '\n'); #循环输出  
  73.         urlfile.close(); #关闭文件  
  74.   
  75.     print "所有url列表获取完成,存入",filelist,"文件中";  
  76.   
  77.     time.sleep(Stops); #同样停顿一下  
  78.   
  79. #==每次读取列表文件的一行并且指针下移一行,这样可以循环获取每个列表.难题为如何获取整个文件的行数==#  
  80.     listurl = open(filelist,'r');  
  81.     mun = len(listurl.readlines())+1;  
  82.     listurl.seek(0); #指针跳会文件开头  
  83.   
  84.     #contents = open('contens.txt','a');  
  85.     User = 'root';  
  86.     Passwd = '970207';  
  87.     Host = 'localhost';  
  88.     Db = 'testcorn';  
  89.     contents = mysql.connect(user=User,passwd=Passwd,host=Host,db=Db).cursor();  
  90.       
  91.   
  92. #==进行内容循环输出==#  
  93.     for conurl in range(1,mun):  
  94.   
  95.         curl = listurl.readline();  
  96.     #okurl = r'http://www.510buy.com/yewu/5662.html';  
  97.     #print okurl;  
  98.       
  99.         time.sleep(Stops); #停顿一下,免得被封,or超时 进行下一次采集  
  100.          
  101.         content = urllib.urlopen(starturl + curl).read(); #读取url  
  102.   
  103.         title = re.findall(Title,content); #找到标题  
  104.       
  105.         keywords = re.findall(Keywords,content); #找到关键词  
  106.       
  107.         description = re.findall(Description,content); #找到描述  
  108.       
  109.         for title,keywords,description in zip(set(title),set(keywords),set(description)):  
  110.         #print title;  #测试查看输出结果  
  111.             #contents.write('[Title:]' + title + '\n');  
  112.             #contents.write('[Keyword:]' + keywords + '\n');  
  113.             #contents.write('[Description:]' + description + '\n\n');  
  114.             #values = "(" + "\"" + title + "\"","\"" + keywords + "\"","\"" + description + "\"" + ")"  
  115.             #contents.execute("INSERT INTO `counts` (`title` ,`keywords` ,`description`) VALUES (%s, %s, %s);",values);  
  116.             #title = title.encode(title,"utf=8")  
  117.             print "写入",title,"成功!","停顿",Stops,"秒进行下一次采集";  
  118.     contents.close();  
  119.   
  120. except KeyboardInterrupt:  
  121.     print "用户终止";  

下面是ini的配置文件 保存成.ini文件:

Ini配置文件代码
  1. [urllibs]  
  2. #目标网址  
  3. starturl = http://www.510buy.com  
  4. #列表开始页码  
  5. startpage = 2  
  6. #列表结束页码  
  7. endpage = 3  
  8. #列表部分代码  
  9. urltemp = /yewu/list_%d.html  
  10. #存储url列表文件路径  
  11. urllist = /home/buysz/桌面/urllist.ini  
  12. #剔除不需要的url列表,中间用,隔开  
  13. dellist = http://www.510buy.com,http://www.510buy.com" target="_blank,/yewu/index.html,http://www.510buy.com/  
  14.   
  15. [countcfg]  
  16. #采集停顿秒数  
  17. Stops = 1  
  18. #采集特定位置url规则  
  19. Divurl = <div.*?>(.*?)<\/div>  
  20. #采集url的正则  
  21. Urlls = <a href=[\"|\'](.*?)[\"\']>  
  22.   
  23. #标题正则  
  24. Title = <title>(.*?) - .*?</title>  
  25. #关键词正则  
  26. Keywords = name=\"keywords\" content=\"(.*?)\">  
  27. #页面描述正则  
  28. Description = name=\"description\" content=\"(.*?)\">  

 

Tags: 采集, 脚本, python

只显示5条记录相关文章

文件对比查找 (浏览: 676, 评论: 0)
一个获取配置文件的东西,应该还有更好的办法 (浏览: 601, 评论: 0)
ubuntu环境下python+apache2+mod_python配置django (浏览: 3275, 评论: 1)
python 批量替换文件内容脚本 (浏览: 2689, 评论: 0)
Python Os 模块 中文说明 (浏览: 3449, 评论: 0)

3条记录访客评论

有没有用access的链接?

Post by 学习python采集中 on 2008, November 13, 5:11 AM 引用此文发表评论 #1

这个程序我运行的时候,提示print urlls + "页面重复跳过"
中的urlls是无效的。
如何解决?
或者您有最新版本的吗?
谢谢!

Post by 新手 on 2009, February 5, 6:13 AM 引用此文发表评论 #2

你加我gmail吧. ripsy110@gmail.com

Post by 小项 on 2009, February 7, 4:00 AM 引用此文发表评论 #3


发表评论

评论内容 (必填):