Python爬虫Csdn系列II

By 白熊花田(http://blog.csdn.net/whiterbear) 转载需注明出处,谢谢。

说明:

在上1篇文章中,我们已知道了只要将程序假装成阅读器就可以访问csdn网页。在这篇文章中,我们将想法获得某个csdn用户的所有文章的链接。

分析:

打开1个某1个的csdn用户的的专栏,可以选择目录视图(如:http://blog.csdn.net/whiterbear?viewmode=contents)和摘要视图(比如:http://blog.csdn.net/whiterbear?viewmode=list)。两个视图都可以显示用户的文章列表。

注意:这里我们选择摘要视图,不要选择目录视图,文章最后会解释为何。

打开摘要视图查看网页源代码,我们发现,在id为’article_list’的div中,每个子div都代表着1篇文章,如图:

每个子div中都包括1篇文章的标题,链接,浏览次数,是不是为原创,评论数等信息,我们只需要取出标题和链接就够了。如何取出不难,学过正则表达式应当都会。我们再使用个数组将界面中所有的文章名及其链接保存便可。

这里需要注意的是,如果博客有分页怎样办,我们还需要获得分页的下1页中的文章的链接?

我尝试了两种方法,第1种方法是设定1个article_list字典,字典成员为‘下1页链接和是不是已被访问标识键值对’,初始放入首页链接,每处理1个界面时将该链接的值设为访问,以后查找下1页的链接,如果其不在字典里,就将其加入并设访问标识为0。

比如初始字典为article_list={‘/pongba/article/list/1’:False},在处理/pongba/article/list/1这个界面时设值为True,此时又发现了/pongba/article/list/2和/pongba/article/list/3。此时,我们判断字典(has_key())中是没有这两个键的,就加入,并设其值为False。以后遍历(keys())字典,如果有值为0的链接,则访问该链接,重复。

第2种方法:在分页的html代码中给出了分页的页数,我们提取出页数pagenum,结合/pongba/article/list/num,num为页数,值为[1,pagenum]。通过这个链接便可取出该作者的所有文章了。

我代码中采取了第2种方法,第1种方法试了,也能够。

代码介绍:

CsdnArticle类(article.py),封装成1篇文章必须的东西,便于保存和访问1个文章的属性。

我重写了__str__()方法,便于输入。

#-*- coding:utf⑻ -*-

class CsdnArticle(object):

def __init__(self):

#作者

self.author = ''

#博客文章名

self.title = ''

#博客链接

self.href = ''

#博客内容

self.body = ''

#字符串化

def __str__(self):

return self.author + '' + self.title + '' + self.href + '' + self.body

CsdnCrawler类。封装了爬取csdn博客所有链接的操作。

#-*- coding:utf⑻ -*-

import sys

import urllib

import urllib2

import re

from bs4 import BeautifulSoup

from article import CsdnArticle

reload(sys)

sys.setdefaultencoding('utf⑻')

class CsdnCrawler(object):

#默许访问我的博客

def __init__(self, author = 'whiterbear'):

self.author = author

self.domain = 'http://blog.csdn.net/'

self.headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36'}

#存储文章对象数组

self.articles = []

#给定url,得到所有的文章lists

def getArticleLists(self, url= None):

req = urllib2.Request(url, headers=self.headers)

response = urllib2.urlopen(req)

soup = BeautifulSoup(''.join(response.read()))

listitem = soup.find(id='article_list').find_all(attrs={'class':r'list_item article_item'})

#链接的正则表达式,可以匹配链接

href_regex = r'href="(.*?)"'

for i,item in enumerate(listitem):

enitem = item.find(attrs={'class':'link_title'}).contents[0].contents[0]

href = re.search(href_regex,str(item.find(attrs={'class':'link_title'}).contents[0])).group(1)

#我们将获得的1篇文章信息封装成1个对象,然后存入数组中

art = CsdnArticle()

art.author = self.author

art.title = enitem.lstrip()

art.href = (self.domain + href[1:]).lstrip()

self.articles.append(art)

def getPageLists(self, url= None):

url = 'http://blog.csdn.net/%s?viewmode=list'%self.author

req = urllib2.Request(url, headers=self.headers)

response = urllib2.urlopen(req)

soup = BeautifulSoup(''.join(response.read()))

num_regex = '[1⑼]d*'

pagelist = soup.find(id='papelist')

self.getArticleLists(url)

#如果该作者博客多,有分页的话

if pagelist:

pagenum = int(re.findall(num_regex, pagelist.contents[1].contents[0])[1])

for i in range(2, pagenum + 1):

self.getArticleLists(self.domain + self.author + '/article/list/%s'%i)

def mytest(self):

for i,url in enumerate(self.articles):

print i,url

def main():

#可以将pongba换成你的博客名,也能够不填,为空,这样默许是访问我的博客

csdn = CsdnCrawler(author='pongba')#'pongba'

csdn.getPageLists()

csdn.mytest()

if __name__ == '__main__':

main()

结果:

输出了126条数据。

选择摘要视图的解释:当某用户文章多有分页时,访问目录视图界面中的下1页链接时会跳转到摘要视图的下1页链接中。我这么说你可能不太明白,举个例子吧。

我使用刘未鹏学长(我崇拜的)的博客为例子吧,地址:http://blog.csdn.net/pongba。他的文章很多,有分页。选择他界面中的目录视图后,翻到分页链接出。以下图:

其中的分页链接值为:

可以看出下1页的链接为:http://blog.csdn.net +/pongba/article/list/2.

当我们在阅读器输入这个网址回车后是出现这个结果的:

可以看到第1篇文章为“斯托克代尔悖论与底线思考法”

但是,当我们使用程序打开的结果却是:

而这个结果却和摘要视图的第2页结果1样:

所以,如果你试图用程序使用http://blog.csdn.net/pongba/article/list/2这个链接访问,得到的结果却其实不是目录视图的结果。我没能理解为何,纠结了好久程序为何出错了,后来换成摘要视图了。

未完待续。

python php csdn_Python爬虫Csdn系列II相关推荐

  1. python爬虫Pragmatic系列II

    python爬虫Pragmatic系列II By 白熊花田(http://blog.csdn.net/whiterbear) 说明: 在上一篇博客中,我们已经学会了如何下载一个网页,并进行简单的分析它 ...

  2. python爬虫Pragmatic系列IV

    python爬虫Pragmatic系列IV By 白熊花田(http://blog.csdn.net/whiterbear) 说明: 在上一篇博客中,我们已经做到了从赶集网上单个首页中抓取所有的链接, ...

  3. python爬虫Pragmatic系列III

    python爬虫Pragmatic系列III By 白熊花田(http://blog.csdn.net/whiterbear) 说明: 在上一篇博客中,我们已经学会了从赶集网上的一家公司中提取出有关的 ...

  4. Python爬虫学习系列教程

    大家好哈,我呢最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多.学习过程中我把一些学习的笔记总结下来,还记录了一些自己实际写的一些小爬虫,在这里跟大家一同分享,希望对Python爬虫 ...

  5. Python爬虫学习系列教程-----------爬虫系列 你值的收藏

    静觅 » Python爬虫学习系列教程:http://cuiqingcai.com/1052.html 大家好哈,我呢最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多.学习过程中我把 ...

  6. Python 爬虫学习 系列教程

    Python爬虫 --- 中高级爬虫学习路线 :https://www.cnblogs.com/Eeyhan/p/14148832.html 看不清图时,可以把图片保存到本地在打开查看... Pyth ...

  7. Python爬虫自学系列(五)

    文章目录 前言 数据集 知识储备 正主:Python大并发爬虫 1.0版本:原始版 2.0版本,加上时间处理.缓存 批量下载 图片批量下载 批量音频下载 视频下载 开多少线程/进程合适? 前言 emm ...

  8. 用爬虫抓取动态加载数据丨Python爬虫实战系列(6)

    提示:最新Python爬虫资料/代码练习>>戳我直达 前言 抓取动态加载数据 话不多说,开练! 爬虫抓取动态加载数据 确定网站类型 首先要明确网站的类型,即是动态还是静态.检查方法:右键查 ...

  9. Python爬虫入门系列——Urllib详解

    Python爬虫入门系列--Urllib详解 1.背景 1.1 初识爬虫 1.2 合法性 1.3 robots协议 2.要求 2.1 当前开发环境 2.2 编程基础 3.快速上手Urllib 3.1 ...

最新文章

  1. 统计学习方法|朴素贝叶斯原理剖析及实现
  2. HTML的onclick的this指向
  3. Extjs4:改变Grid单元格背景色(转载)
  4. SQL报错:Column count doesn‘t match value count at row 1
  5. 微信小程序, 解析↵换行
  6. sublime运行node.js报[Decode error - output not cp936]错误
  7. [object%20HTMLInputElement] 是什么意思?
  8. 浅谈算法和数据结构: 十 平衡查找树之B树
  9. ManualResetEvent
  10. Vue路由的页面跳转打开新页面
  11. python3 读文件 编码_Pyhton3下的ISO8859-1编码文件的读取
  12. linux vim编辑矩阵乘,VIM使用系列:二进制文件编辑
  13. MacOS制作ubuntu18.04系统U盘启动盘
  14. 【目标检测】《DINO: DETR with Improved DeNoising Anchor Boxes for End-to-End Object Detection》论文阅读笔记
  15. ETL示例解决方案 —— Sakila下载和基本配置 (笔记一)
  16. select 检索数据
  17. 我的世界服务器不显示前缀,[管理|聊天]TRCStudioChatSystem —— 多功能聊天系统|聊天|脏话|匿名|前缀[1.7-1.15]...
  18. 分享10个非常不错的封面设计模板
  19. Java之XML解析-使用dom(org.w3c.dom)解析XML
  20. Java开发——Mindmaster/Typora思维导图

热门文章

  1. 机器人相关的标准汇总
  2. unity GPU优化
  3. 文件嵌套时,定义package包的形式
  4. 基于FreeCAD的dxf转机械手代码的一种实现方法
  5. 基于 GraphQL 的 BFF 实践
  6. 解决batis.binding.BindingException: Invalid bound statement (not found)
  7. html点击头像旋转,如何鼠标移动上去让头像旋转
  8. Android 使用定位功能的坑
  9. 如何使用EasyMock?
  10. 五层协议的体系结构概述