首页 > 代码库 > 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编写采集实例学习笔记