首页 > 代码库 > python编写采集实例学习笔记

python编写采集实例学习笔记

用python写了一个采集程序,因为之前写了大半年的php数据采集,所以转用python做的话,流程差不多,就是换成python的语法函数实现就行了,不过通过用python实现,可以学习下python的一些东西

#python和php的差异是什么,python相对于php有哪些优势

这几天学习的感受是,python的适用应用范围更广,更灵活,而PHP主攻web后端。

 

首先python和PHP差别还是蛮多的,比如注释中有中文都要声明一下

#decoding=utf-8

#引入

#urllib 后续的数据采集用到,php的话经常用 file_get_content(url),curl类去获取远程网站地址
import urllib

#不像PHP,python用到的很多功能都需要提前import一下,php的话其实也需要这种import一样的操作,只不过估计都丢到ini初始化文件里了
import re
import os
import sys
import MySQLdb
import hashlib

global cur
global conne

def connnect_db():
  global conne
  global cur

  conne= MySQLdb.connect(
    host=‘localhost‘,
    port = 3306,
    user=‘root‘,
    passwd=‘xxxx‘,
    db =‘lk_xxxx‘,
    charset = ‘utf8‘, #指定一下字符编码类型,不然插入中文又是乱码了
    unix_socket="/tmp/mysql.sock" #这里php在配置里指定了,python估计也有配置,但是没找到, 直接在这里指定了
  )
  cur = conne.cursor()# 这个cursor是游标,光标的意思,这里用这个单词可能是有取资源定位符对象的意思,后边就用这个cursor操作数据库了


def get_md5(src): #相比较php直接一个md5函数求md5指,python就看着复杂了点
  myMd5 = hashlib.md5()
  myMd5.update(src)
  myMd5_Digest = myMd5.hexdigest()
  return myMd5_Digest


#保存link信息
def save_link(url,title):

  link_md5=get_md5(url)
  sql="SELECT * FROM lk_link WHERE link_md5 = ‘"+link_md5+"‘"
  print sql
  cur.execute(sql)
  result=cur.fetchone()
  print result
  if result == None:
  domain=url.replace(‘http://‘,‘‘)
  domain=domain.replace(‘https://‘,‘‘)

  #类似于PHP的trim()
  domain=domain.strip(‘/‘);
  domain=domain+‘/‘;
  endpos=domain.find(‘/‘)

  #这个字符截取方式看起来也是与众不同,因为都没用到函数
  domain=domain[0:endpos]

  #这里注意一下 对于utf8 截取3个字节是一个汉字,这和编码有关 
  title=title.decode(‘utf8‘)[0:3*48].encode(‘utf8‘)
  insert_sql="INSERT INTO `lk_homepage`.`lk_link` (`domain`, `link`, `title`, `link_md5`) VALUES(‘"+domain+"‘,‘"+url+"‘,‘"+title+"‘,‘"+link_md5+"‘)"
  cur.execute(insert_sql)

  #每执行一个语句,都要commit一下,这很符合mysql的操作,但在php里可能直接封装了

  conne.commit()

 

#获取一个网页的内容
def get_url(url):

  #php用preg_replace实现的功能,这里用的 re.sub,缩写的太厉害了,好记也不好记

  cache_name=re.sub(‘[^a-z|0-9]{1}‘,‘_‘,url)
  print cache_name

  filename = cache_name+‘.txt‘
  if os.path.exists(filename):
  f=open(filename,‘r‘)
  content = f.read()
  f.close()
  print ‘read cache ‘+url+‘.txt‘
else:
  content=urllib.urlopen(url).read()  #  open and read it!!
  f=open(filename,‘w‘) # 文件操作,如果不存在,则创建
  f.write(content) 
  f.close()
  print ‘new get ‘+filename+‘.txt‘
  return content


base_url=‘http://xxxx_page.html‘

connnect_db()
i=1;
while i<124:
  if i==1:
    url = base_url.replace(‘_page‘,‘‘)
  else:
    url=base_url.replace(‘page‘,str(i))

  print ‘爬取当中,当前第%d页...‘ % i
  content=get_url(url)
  tmp_reg = ‘rightTxtHead"><a href="http://www.mamicode.com/(.*?)"‘
  aft = re.findall(tmp_reg,content)

  for url_1 in aft:
    #继续进入下层地址
    content1=get_url(‘http://xxxx‘+url_1)

    # 匹配这里花了很多时间,有时间还需要继续整理一下!

    # tmp_reg1 = ‘<p class="webIntro">([.\s\S]*)</p><ul><a href="http://www.mamicode.com/([^"]+)"‘
    tmp_reg1 = ‘<p class="webIntro">([.\s\S]*?)</p><ul><a href="http://www.mamicode.com/([./s/S]*?)"‘
    # .+  -> 这是贪婪   .*? ->非贪婪  PHP 的话是  /reg/U 用是否加U来区分
    # print content1

    # 用findall 来匹配 ,类似于 PHP的preg_match_all 但是又不一样,特别是返回结果的数组结构

    aft_1 = re.findall(tmp_reg1,content1)

    #!!!!!匹配结果如果有中文,直接print会是乱码一样的东西,要进一步循环到那个元素 打印才可以看到中文,这和PHP又不一样

    for match in aft_1:
      tit=match[0]
      url_web=match[1]

      save_link(url_web,tit)

    #用i++居然不行,又一个不同的地方,记住
    i+=1

  print ‘over!‘
  cur.close()
  conne.close()

以上是用python直接写爬虫的学习心得,因为是直接写,反过来查python的知识,所以这次是边用边学,这种反过来的方法有一定好处,但是后面一定要系统的学一下。

 

python编写采集实例学习笔记