python 爬虫学习笔记2

接着上一篇笔记

这次将该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

下面是抓取的结果

posted on 2015-08-18 11:33  绯村  阅读(171)  评论(0)    收藏  举报