爬取csdn部分博文
来源:互联网 发布:软件著作权 发表状态 编辑:程序博客网 时间:2024/05/22 07:45
老师让参加2017年SMP的用户画像评测,将本次评测的相关内容写博客记录一下:
关于评测请看官网:2017SMP用户画像评测
6月1号发布相关数据,这段时间老师让总结一个技术路线,所以先爬点csdn的博文数据做些规划。
下面详细介绍如何爬取部分博文。
爬虫的基础知识这里不做介绍。初步的将代码分为三部分,最后在进行归纳总结。
首先需求只是获取csdn的博文,决定爬取全部的专家博客作为数据集,先处理任务一和任务二。
首先分析专家首页:
从首页直接可以爬取部分的专家的主页链接,格式如下:“黄帅”写正则匹配就可以(需要注意的是要用非贪婪模式,详细的见后面贴出的代码)。
第一步先解决获取一个用户的全部文章,然后存入mysql数据库。然后获取全部专家的id。
面临的问题:
这里遇到了第一个坎,由于直接爬取会出现403错误,所以需要简单改下代码,使其伪装成浏览器,
header = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.63 Safari/537.36"
加入header,需要注意的是这里的伪装浏览器可以伪装为手机端或者pc端。我的问题是一直使用pc端看html代码,在程序里使用的伪装浏览器为手机端的,导致没有找到页数,伪装成pc端之后成功解决获取某人全部文章id的需求。代码如下:
from urllib import requestimport reimport timeimport randomfrom bs4 import BeautifulSoup# import MySQLdb#定义保存文件函数def save_file(data, i, article_name): '''将博文信息写入文件''' path = "测试/" + article_name + "_"+str(i)+".txt" file_1 = open(path, 'wb') file_1.write(data) file_1.close()#爬虫类class CSDNSpider: def __init__(self,url="http://blog.csdn.net/"): #默认当前页 self.url = url header = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.63 Safari/537.36" self.header = header #求博客总页数 def getPages(self,article_name): url = self.url + article_name + "/article/list/1" req = request.Request(url) req.add_header('User-Agent', self.header) res = request.urlopen(req) data1 = res.read() data = data1.decode('utf-8') # saveFile(data1,1) pages = r'<div.*?pagelist">.*?<span>.*?共(.*?)页</span>' # 计算我的博文总页数 pattern = re.compile(pages, re.DOTALL) pagesNum = re.findall(pattern, data)[0] return pagesNum def getEachArticle(self,article_name,pagesNum): #获取博主每篇文章的链接以便进一步处理 list_id = list() for i in range(pagesNum): url = self.url + article_name + "/article/list/" + str(i) url_each = url req = request.Request(url_each) req.add_header('User-Agent',self.header) res = request.urlopen(req) data_temp = res.read()#存放爬取的页数的html,包含每篇文章的id data_temp = data_temp.decode("utf-8") # soup = BeautifulSoup(data_temp, "html.parser") # list_id = soup.find_all("a")#查找h1标签页内容 partten_1 = re.compile(r"<a href=.*?article/details/(.*?)#") list_id_1 = partten_1.findall(data_temp) [list_id.append(i) for i in list_id_1] # print (list_id) return list_id def getText(self,list_id,article_name): k = 1 list_id_all = list() for i in list_id: list_id_all.append(i) for i in list_id_all: url = self.url + article_name + "/article/details/" + i print(url) req = request.Request(url) req.add_header('User-Agent',self.header) res = request.urlopen(req, timeout=5) data_text = res.read()#存放爬取的页数的html,包含每篇文章的id save_file(data_text, k, article_name) k = k + 1 print ("writting success!!")def main():#定义爬虫对象 cs = CSDNSpider() article_name = "mynameishuangshuai" pagesNum = int(cs.getPages(article_name)) list_id = cs.getEachArticle(article_name,pagesNum) cs.getText(list_id,article_name) print ("程序结束!")if __name__ == '__main__': main()
这样便实现了将一个用户的全部文章写入txt文档。然后用BeautSoup配合正则来提取文章和标签。
阅读全文
0 0
- 爬取csdn部分博文
- perl 爬取csdn
- Python爬取CSDN博客
- WebCollector爬取CSDN博客
- perl 爬取 csdn 博客
- Java爬取CSDN博客
- python爬虫爬取csdn
- Python3 爬虫(五) -- 单线程爬取我的CSDN全部博文
- Python3 爬虫(五) -- 单线程爬取我的CSDN全部博文
- Scrapy简明教程(三)——爬取CSDN博文并写入文件
- 爬取广东国家税务局信息公开部分
- 使用python爬取csdn博客访问量
- 使用python爬取csdn博客访问量
- 使用python爬取csdn博客访问量
- 使用python爬取csdn博客访问量
- 简单爬取CSDN下载资源信息
- Python 爬取CSDN博客频道
- 使用python爬取csdn博客访问量
- SQL Server 中 RAISERROR 的用法
- JAVA 四大域对象总结
- 每天学一点Swift----函数(二)
- git创建与合并分支
- jsp实现分页(限定显示指定页数)和页面跳转功能
- 爬取csdn部分博文
- 编译器之词法分析器
- Python缓冲池初探
- TensorFlow 中遇到的坑
- 动态绑定
- Java中使用结构体时遇到的问题
- SparkSQL实战
- sql中in和exist语句的区别
- 连续子数组的和的最大值、最小值以及和的绝对值的最大值、最小值