开发环境:python 2.7.6,mysql 5.5-44
#coding=utf-8
import urllib2
import urllib
import string
import re
import MySQLdb
req=urllib2.Request("http://jw.nju.edu.cn/")
response=urllib2.urlopen(req)
myPage=response.read()
#temp=myPage.decode('utf8')
#xx="<ul><li>(.*)<span class='top'>"
#pattern = re.compile(xx)
#results = list(pattern.findall(temp))
#for result in results :
# print result
#置顶公告
pattern=re.compile("<ul><li>(.*)<span class='top'>")
myMatch=pattern.search(myPage,re.S)
sa=myMatch.group(1)
BgnPartRex = re.compile("\'") #将页面源码中 ' 匹配掉
sa=BgnPartRex.sub("",sa)
tongzhi=re.compile('title=(.*?)>')
lianjie=re.compile('FType=WZSY&(.*?)title')
title=tongzhi.findall(sa,re.S) #返回list
print type(title[0])
url=lianjie.findall(sa,re.S)
#非置顶公告
pattern2=re.compile("<ul><li>(.*?)</span></li></ul>")
myMatch=pattern2.search(myPage,re.S)
sa=myMatch.group(1)
BgnPartRex = re.compile("(.*)<span class='top'>")
sa=BgnPartRex.sub("",sa)
BgnPartRex = re.compile("\'")
sa=BgnPartRex.sub("",sa)
tongzhi2=re.compile('title=(.*?)>')
lianjie2=re.compile('FType=WZSY&(.*?)title')
title2=tongzhi2.findall(sa,re.S)
url2=lianjie2.findall(sa,re.S)
zhiding=[]
feizhiding=[]
for i in range(len(title)):
zhiding.append((0,title[i],url[i]))
zhiding.reverse() #逆序存放,方便后面读取时新数据在最前
for m in range(len(title2)):
feizhiding.append((0,title2[m],url2[m]))
feizhiding.reverse()
conn=MySQLdb.connect(host='localhost',user='root',passwd='',db='python',charset='utf8')
cur=conn.cursor()
cur.executemany('insert into zhiding values(%s,%s,%s)',zhiding) #批量存放
cur.executemany('insert into title values(%s,%s,%s)',feizhiding)
conn.commit()
cur.close()
conn.close()
在进行爬取时一定要注意观察页面源码,如在区分置顶帖和非置顶帖时,因置顶帖后面带有 [置顶],本想通过匹配[置顶]来区分置顶帖和非置顶帖,但是汉字匹配以及其他一些问题耗费了我很多时间,而后再仔细看了一下页面源码,发现置顶帖都有一个标签:<span class='top' ,这样一来就方便了许多。
cur.executemany('insert into zhiding values(%s,%s,%s)',zhiding)
等价于
for i in range(len(zhiding))
cur.execute('insert into zhiding values(%s,%s,%s)',zhiding[i])