标签:set 需要 odi 优先 fat image ima findall close
这是一篇来自整理EVERNOTE的笔记所产生的小博客,实现功能主要为用广度优先算法爬取小故事网,爬满100个链接并写入mysql,虽然CS作为双学位已经修习了三年多了,但不仅理论知识一般,动手能力也很差,在学习的空余时间前前后后DEBUG了很多次,下面给出源代码及所遇到的BUG。
本博客参照代码及PROJECT来源:http://kexue.fm/archives/4385/
1 import requests as rq 2 import re 3 import codecs 4 import queue 5 import pymysql 6 from urllib.request import urlopen 7 from bs4 import BeautifulSoup 8 9 tasks = queue.Queue() # 链接队列 10 tasks_pass = set() # 已队列过的链接 11 results = {} # 结果变量 12 count = 0 # 爬取页面总数 13 tasks.put(‘/index.html‘) # 把主页加入到链接队列 14 tasks_pass.add(‘/index.html‘) # 把主页加入到已队列链接 15 db = pymysql.connect("localhost","testuser","test123","TESTDB",charset=‘gbk‘) 16 dbc = db.cursor() 17 18 while count<=100: 19 url = tasks.get() #取出一个链接 20 url = ‘http://wap.xigushi.com‘+url 21 web = rq.get(url).content.decode(‘gbk‘) #这里的编码要看实际情形而定 22 urls = re.findall(‘href="(/.*?)"‘, web) #查找所有站内链接 23 for u in urls: 24 if u not in tasks_pass: #把还没有队列过的链接加入队列 25 tasks.put(u) 26 tasks_pass.add(u) 27 html=urlopen(url) 28 bsObj=BeautifulSoup(html.read(),"lxml") 29 if not (re.search(‘images‘,url)): 30 # print(re.search(‘images‘, url)) 31 text=bsObj.title.get_text() 32 print(url + ‘ ‘ + text) 33 sql = "insert into data1(url,title) values(%s,%s);" 34 data=(url,text) 35 dbc.execute(sql,data) 36 db.commit() 37 else: 38 if (re.search(‘images‘,url).span()): 39 print(‘---------------------------skipping--------------------------------------------‘) 40 count += 1 41 db.close() 42 43 with codecs.open(‘results.txt‘, ‘w‘, encoding=‘utf-8‘) as f: 44 f.write(‘\n‘.join(results.items()))
原PROJECT采取多线程并写入MongoDB,我因为还不熟悉多线程,采取了单线程,出于对mysql的偏好和熟悉选取了mysql。
标签:set 需要 odi 优先 fat image ima findall close
原文地址:http://www.cnblogs.com/vorphan/p/7461057.html