您的位置:首页 > 编程语言 > Python开发

python 爬虫学习笔记2

2015-08-18 11:33 891 查看
接着上一篇笔记

这次将该blog的所有文章都下载下来

思路为根据dict中的url去解析网页

并将其中的博文部分获取并下载下来

#coding=utf-8
import urllib2
import urllib
from bs4 import BeautifulSoup
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
def query_item(input,tag=None,cla=None):
'''
获取对应url中 div标签 class的对象
返回的是set对象p
'''
soup=BeautifulSoup(input,"html.parser")
if cla==None:
if tag == None:
return soup.find_all('div')
else:
return soup.find_all(tag)
else:
if tag == None:
return soup.find_all('div',class_=cla)
else:
return soup.find_all(tag,class_=cla)
req_header = {
'Host':"blog.csdn.net",
'User-Agent':"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36",
'Accept':"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
'Accept-Language':"zh-CN,zh;q=0.8",
'Connection':"keep-alive",
"Cache-Control":"max-age=0",
"Referer":"http://blog.csdn.net"}
blog_art=[]
i=1
#该循环是获取最大页面数,并将获取的页面放入一个list中
while True:
url="http://blog.csdn.net/zhaoyl03/article/list/"
req=urllib2.Request(url+str(i),None,req_header)
result = urllib2.urlopen(req,None)
artcle_num=query_item(result.read(),'div','list_item article_item')
if len(artcle_num)<15:
for x in artcle_num:
blog_art.append(x)
break
else:
i+=1
for x in artcle_num:
blog_art.append(x)
#现在得到blog的有效页数 i 和所有的博文 blog_art
host_url='http://blog.csdn.net'
query_result={}
for x in blog_art:
for y in x.find('span','link_title'):
#得到所有博文的title
query_result[str(y.get_text())]=str(host_url+y.get('href'))
'''
query_result是标题:url的字典
下面根据这个字典将每个博文的内容爬出来 保存在本地
'''
a=1
time=''
for x,y in query_result.items():
temp_req=urllib2.Request(y,None,req_header)
temp_result=urllib2.urlopen(temp_req,None)

for i in query_item(temp_result,'div','article_content'):
# f=open('d:\\csdn\\%s.html' % str(x.strip()),'w')#有问题 无法将博文标题作为文件名写入
f=open('d:\\csdn\\%s.html'% a,'w')
f.write('''<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>''')
f.write(str(x))
for j in i:
f.writelines(str(j))
f.close()
a+=1


下面是抓取的结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: