免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4869 | 回复: 4
打印 上一主题 下一主题

新人小程序求助 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-07-24 10:15 |只看该作者 |倒序浏览
刚开始接触python,想实现个这样的功能,不知道怎么弄,知道这边牛人多,来这求助来了

总体功能是一个采集的功能

要采集的目标网址是类似http://zhidao.baidu.com/question/1574378486883235740.html 这样的。最后的id是自增长的,在程序中先要实现生成这样的网址

生成一条网址之后,模拟谷歌或其他搜索引擎蜘蛛获取网页源代码,将title内容保存下来。当title里面只有“百度知道”就不要这个网址,如果除了“百度知道”之外还有其他内容,则将这个title和这个网址记录到数据库中

数据库用mysql

谢谢,大家就当练手好了,我编写的时候卡在数据库和蜘蛛模拟这块了

论坛徽章:
0
2 [报告]
发表于 2014-07-31 13:15 |只看该作者
回复 1# lydxliusun

用Scrapy. http://scrapy.org/doc/
   

论坛徽章:
0
3 [报告]
发表于 2014-07-31 14:21 |只看该作者
  1. #coding:utf8
  2. '''
  3. Created on 2014-7-31

  4. @author: shiban
  5. '''
  6. import urllib2
  7. import urllib
  8. import random
  9. import MySQLdb

  10. class CrawlerClass(object):
  11.     def __init__(self,max):
  12.         self.max = max
  13.         #链接模板
  14.         self.index = 'http://zhidao.baidu.com/question/'
  15.         #链接数据库
  16.         self.saver = SaverMySqlClass()
  17.     def cutSpit(self,txt,head,tail):
  18.         '''
  19.                     函数类似吃甘蔗:txt是一根甘蔗,
  20.                     从头咬,返回的是head与tail之间的部分,
  21.                     以及剩余的半根甘蔗  截取txt文本中,
  22.                     包含在head与tail之间的文字。
  23.         '''
  24.         pos=0
  25.         pos=txt.find(head,pos,len(txt))
  26.         if pos < 0:
  27.             return ''
  28.         assert(pos>=0)
  29.         pos+=len(head)   
  30.         oldpos=pos
  31.         pos=txt.find(tail,oldpos,len(txt))
  32.         if pos<0:
  33.             return ''
  34.         return txt[oldpos:pos]
  35.    
  36.     def getPageToAgency(self,url):
  37.         """功能:使用代理ip的方式抓取页面数据
  38.                         传入参数:url 需要得到的页面地址
  39.                         返回值:page 页面的信息
  40.         """
  41.         proxy_lt = ('211.167.112.14:80','210.32.34.115:8080','115.47.8.39:80','211.151.181.41:80','219.239.26.23:80','219.157.200.18:3128','219.159.105.180:8080','1.63.18.22:8080','221.179.173.170:8080','125.39.66.153:80','125.39.66.151:80','61.152.108.187:80','222.217.99.153:9000','125.39.66.146:80','120.132.132.119:8080','119.7.221.137:82','117.41.182.188:8080','202.116.160.89:80','221.7.145.42:8080','211.142.236.131:80','119.7.221.136:80','211.151.181.41:80','125.39.66.131:80','120.132.132.119:8080','112.5.254.30:80','106.3.98.82:80','119.4.250.105:80','123.235.12.118:8080','124.240.187.79:80','182.48.107.219:9000','122.72.2.180:8080','119.254.90.18:8080','124.240.187.80:83','110.153.9.250:80','202.202.1.189:80','58.67.147.205:8080','111.161.30.228:80','122.72.76.130:80','122.72.2.180:80','202.112.113.7:80','218.108.85.59:81','211.144.72.154:80','119.254.88.53:8080','121.14.145.132:82','114.80.149.183:80','111.161.30.239:80','182.48.107.219:9000','122.72.0.28:80','125.39.68.131:80','118.244.190.6:80','120.132.132.119:88','211.167.112.15:82','221.2.80.126:8888','219.137.229.214:3128','125.39.66.131:80','61.181.22.157:80','115.25.216.6:80','119.7.221.137:82','221.195.42.195:8080','119.254.88.53:8080','219.150.254.158:8080','113.9.163.101:8080','222.89.154.14:9000','114.141.162.53:8080','218.5.74.199:3128','61.152.108.187:80','218.76.159.133:80','59.34.57.88:8080','118.244.190.34:80','59.172.208.189:8080','116.236.216.116:8080','111.161.30.233:80','220.248.237.234:8080','121.14.145.132:82','202.114.205.125:8080')
  42.         i = random.randint(0, len(proxy_lt)-1)
  43.         agency_ip = proxy_lt[i]
  44.         proxies = {'':agency_ip}
  45.         opener = urllib.FancyURLopener(proxies)   
  46.         req = opener.open(url)
  47.         page = req.read()
  48.         page = page.decode('gbk')
  49.         return page
  50.    
  51.     def dealPageInfo(self,page,url):
  52.         """处理page信息 得到title标签中数据
  53.                                 传入参数   page 页面源码
  54.                    url 页面地址
  55.         """
  56.         title = self.cutSpit(page, '<title>', '</title>')
  57.         if title.find(u'百度知道 - 信息提示') <> -1:
  58.             return
  59.         else:
  60.             info_lt = [url,title]
  61.             self.saver.insertPrice(info_lt)
  62.     def mainMehod(self):
  63.         """程序主方法"""
  64.         for i in xrange(self.max):
  65.             url = self.index + '%s.html' % i
  66.             #print url
  67.             page = self.getPageToAgency(url)
  68.             self.dealPageInfo(page,url)
  69.         #关闭数据库
  70.         self.saver.closeDatabase()                           
  71. class SaverMySqlClass(object):
  72.    
  73.     def __init__(self):
  74.         self.conn = MySQLdb.connect(host='127.0.0.1',user='root',passwd='',db='test',port=3306,charset="utf8")
  75.         #链接数据库
  76.         self.cur=self.conn.cursor()
  77.         
  78.    
  79.     def closeDatabase(self):
  80.         self.cur.close()
  81.    
  82.     def insertPrice(self,info_lt):
  83.         """写入价格信息库"""
  84.         sql=r'''insert into tablename1 (
  85.                  url,title  )
  86.                  values ("%s","%s")''' % tuple(info_lt)
  87.         print sql
  88.         try:
  89.             self.cur.execute(sql)
  90.         except Exception,e:
  91.             print e
  92.             self.conn.commit()
  93.         self.conn.commit()
  94. if __name__ == '__main__':
  95.     #传入需要访问的最大值
  96.     max = 2000
  97.     CrawlerClass(max).mainMehod()
复制代码

论坛徽章:
0
4 [报告]
发表于 2014-07-31 14:22 |只看该作者
跑了一下可用,,这是是数据库数据的部分截图

QQ截图20140731141615.png (73.74 KB, 下载次数: 43)

QQ截图20140731141615.png

论坛徽章:
0
5 [报告]
发表于 2014-08-03 10:06 |只看该作者
多谢多谢   我先研究研究
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP