python 开心网和豆瓣日记爬取的小爬虫


Posted in Python onMay 29, 2021

项目地址:

https://github.com/aturret/python-crawler-exercise

用到了BeautifulSoup4,请先安装。

pip install beautifulsoup4

开心网日记爬取

kaixin001.py

使用

登录开心网,浏览器F12看http请求的header,获取自己的cookie。

填写cookie,要爬的日记的url,要爬的总次数。走你。

之后会生成HTML文件,格式是<:title>-<YYYYMMDDHHMMSS>

代码

# -*- coding: utf-8 -*-
from urllib.request import urlopen
import urllib.request
import urllib.parse #为了获取HTTP response
from bs4 import BeautifulSoup #BS4
import string # 为了去掉空白字符
import time # 防止被杀cookie
import unicodedata # 字符修正
# 在这里放第一个链接
urlx = '链接' #写你想爬的文

def request(url):
    global urlx #引用外面的链接作为全局变量,后面还会取下一个进行循环的


# 使用urllib库提交cookie获取http响应
    headers = {
    'GET https':url,
    'Host':' www.kaixin001.com',
    'Connection':' keep-alive',
    'Upgrade-Insecure-Requests':' 1',
    'User-Agent':' Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36',
    'Accept':' application/json, text/javascript, */*; q=0.01',
    'Accept-Language':' zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
    'Cookie':' ', #改成自己的cookie,自己浏览器打开网站F12调试,自己找http请求的header
    }
    request = urllib.request.Request(url=url,headers=headers)
    response = urllib.request.urlopen(request)
    contents = response.read()

# 使用BS4获得所有HTMLtag
    bsObj = BeautifulSoup(contents,"html.parser")

# 使用BS4的find函数得到想要的东西:标题、发表时间和博客正文
    title = bsObj.find("b", attrs={"class":"f14"})
    titleT = bsObj.find("b", attrs={"class":"f14"}).get_text() #开心网日记的标题是一个b标签,class属性值是f14
    date = bsObj.find("span", attrs={"class":"c6"})
    dateT = bsObj.find("span", attrs={"class":"c6"}).get_text() #开心网日记的发表时间是一个span标签,class属性值是c6
    text = bsObj.find("div", attrs={"class":"textCont"})
    textT = bsObj.find("div", attrs={"class":"textCont"}).get_text() #开心网日记的正文是一个div标签,class属性值是textCont

  

# 测试输出
    print(title)
    print(dateT)
    # print(text)
    
    
    

# 生成HTML文件。这里直接用file.open()和file.write()了,也可以用jinja2之类的框架生成。
    remove = string.whitespace+string.punctuation
    table = str.maketrans(':',':',remove)

    fileTitle=str(titleT).replace(':',':').replace('''"''','''“''')+'-'+str(dateT).translate(table).replace('发表','')+'.html'

    print(fileTitle) #测试输出

    f = open(fileTitle,'w',encoding="utf-8") #注意用utf-8编码写入,不然会因为一些旧博文采用的gbk编码不兼容而出问题。

# 写入message
    message = """
    <html>
    <head></head>
    <body>
    <h1>%s</h1>
    <b>%s</b>
    <br></br>
    %s
    </body>
    </html>"""%(title.get_text(),date.get_text(),unicodedata.normalize('NFD',text.prettify()))
    f.write(message)
    f.close()
    # webbrowser.open(fileTitle,new = 1)
   

# 定位下一篇博文的URL

    nextUrl=bsObj.find("a",text="下一篇 >").attrs["href"] #下一篇是一个a标签,使用tag对象的attrs属性取href属性的值。开心网的日记系统里,如果到了最后一篇日记,下一篇的链接内容是第一篇日记,所以不用担心从哪篇日记开始爬。
    # print(nextUrl)
    urlx="http://www.kaixin001.com"+nextUrl
    print(urlx)


# 主循环,给爷爬
num=328 #设定要爬多少次。其实也可以写个数组检测重复然后中止的啦,但我懒得弄了。
for a in range(num):
    request(urlx)    
    print('We get '+str(a+1)+' in '+str(num))
    time.sleep(1) # 慢点,慢点。测试过程中出现了没有设置限制爬一半cookie失效了的情况,可能是太快了被搞了。

豆瓣日记爬取

douban.py

使用

登录豆瓣,浏览器F12看http请求的header,获取自己的cookie。

填写变量COOKIE,要爬的日记页的url。走你。

之后会生成HTML文件,格式是<:title>-<YYYYMMDDHHMMSS>

代码

# -*- coding: utf-8 -*-
from urllib.request import urlopen
import urllib.request
import urllib.parse #为了获取HTTP response
from bs4 import BeautifulSoup #BS4
import string # 为了去掉空白字符
import unicodedata # 字符修正
import re
# 在这里放链接
url = '' #写你想爬的人 https://www.douban.com/people/xxx/notes 这样
COOKIE = ''

def request(urlx):
    global url #引用外面的链接作为全局变量,后面还会取下一个进行循环的
    global boolean
    global COOKIE
# 使用urllib库提交cookie获取http响应
    headers = {
    'GET https':urlx,
    'Host':' www.douban.com',
    'Connection':' keep-alive',
    'Upgrade-Insecure-Requests':' 1',
    'User-Agent':' Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36',
    'Accept':' application/json, text/javascript, */*; q=0.01',
    'Accept-Language':' zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
    'Cookie':COOKIE, #改成自己的cookie,自己浏览器打开网站F12调试,自己找http请求的header
    }
    request = urllib.request.Request(url=urlx,headers=headers)
    response = urllib.request.urlopen(request)
    contents = response.read()

# 使用BS4获得所有HTMLtag
    bsObj = BeautifulSoup(contents,"html.parser")

# 使用BS4的find函数获取当前页面的所有日记链接
    article = bsObj.find("div", attrs={"class":"article"})
    titleSet = article.findAll("h3")
    # print(titleSet)
    for title in titleSet:
        titleText = title.findAll("a",attrs={"class":"j a_unfolder_n"})
        for link in titleText:
            noteUrl = str(link.attrs["href"])
            print(noteUrl)
            requestSinglePage(noteUrl)
    next = bsObj.find("a",text="后页>")
    if next==None:
        print("结束了")
        boolean=1
    else:
        url = str(next.attrs["href"]).replace("&type=note","")
        print(url)

def requestSinglePage(urly):
    global COOKIE
    headers = {
        'GET https':urly,
        'Host':' www.douban.com',
        'Connection':' keep-alive',
        'Upgrade-Insecure-Requests':' 1',
        'User-Agent':' Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36',
        'Accept':' application/json, text/javascript, */*; q=0.01',
        'Accept-Language':' zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
        'Cookie':COOKIE, #改成自己的cookie,自己浏览器打开网站F12调试,自己找http请求的header
    }
    request = urllib.request.Request(url=urly,headers=headers)
    response = urllib.request.urlopen(request)
    contents = response.read()
    # 使用BS4获得所有HTMLtag
    bsObj = BeautifulSoup(contents,"html.parser")

# 使用BS4的find函数得到想要的东西:标题、发表时间和博客正文

    title = bsObj.find("h1").get_text()
    date = bsObj.find("span", attrs={"class":"pub-date"})
    dateT = bsObj.find("span", attrs={"class":"pub-date"}).get_text()
    text = bsObj.find("div", attrs={"id":"link-report"})
    # textT = bsObj.find("div", attrs={"class":"textCont"}).get_text()

# 测试输出
    print(title)
    print(dateT)

    # 生成HTML文件。这里直接用file.open()和file.write()了,也可以用jinja2之类的框架生成。
    remove = string.whitespace+string.punctuation # 去掉日期的标点符号
    table = str.maketrans(':',':',remove)

    fileTitle=str(title)+'-'+str(dateT).translate(table)+'.html'

    print(fileTitle) #测试输出

    f = open(fileTitle,'w',encoding="utf-8") #注意用utf-8编码写入,不然会因为一些旧博文采用的gbk编码不兼容而出问题。

    # 写入message
    message = """
    <html>
    <head></head>
    <body>
    <h1>%s</h1>
    <b>%s</b>
    <br></br>
    %s
    </body>
    </html>"""%(title,dateT,unicodedata.normalize('NFD',text.prettify()))
    f.write(message)
    f.close()

# 主循环,给爷爬

boolean=0
while(boolean==0):
    a=1
    request(url)
    print('We finished page '+str(a)+' .')
    a+=1

Roadmap

豆瓣四月份时候还有bug,手机端可以看到全部日记,半年隐藏无效。最近修好了。

不过现在的隐藏依然没有针对到具体的日记,或许可以想办法通过其他手段爬下来。

以上就是python 开心网日记爬取的示例步骤的详细内容,更多关于python 开心网日记爬取的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python matlibplot绘制3D图形
Jul 02 Python
python中的decorator的作用详解
Jul 26 Python
解决每次打开pycharm直接进入项目的问题
Oct 28 Python
pandas.DataFrame删除/选取含有特定数值的行或列实例
Nov 07 Python
Python3.5内置模块之time与datetime模块用法实例分析
Apr 27 Python
Matplotlib绘制雷达图和三维图的示例代码
Jan 07 Python
如何使用Python抓取网页tag操作
Feb 14 Python
详解如何在pyqt中通过OpenCV实现对窗口的透视变换
Sep 20 Python
python 使用csv模块读写csv格式文件的示例
Dec 02 Python
python 实现端口扫描工具
Dec 18 Python
基于Python实现射击小游戏的制作
Apr 06 Python
python可视化分析绘制带趋势线的散点图和边缘直方图
Jun 25 Python
Python趣味挑战之实现简易版音乐播放器
新手必备Python开发环境搭建教程
Keras多线程机制与flask多线程冲突的解决方案
May 28 #Python
pytorch 6 batch_train 批训练操作
May 28 #Python
pytorch 如何使用batch训练lstm网络
May 28 #Python
使用Pytorch训练two-head网络的操作
May 28 #Python
使用Python的开发框架Brownie部署以太坊智能合约
You might like
解析curl提交GET,POST,Cookie的简单方法
2013/06/29 PHP
php实现将数据做成json的格式给前端使用
2018/08/21 PHP
详解PHP素材图片上传、下载功能
2019/04/12 PHP
用javascript实现画板的代码
2007/09/05 Javascript
JavaScript Event学习第五章 高级事件注册模型
2010/02/07 Javascript
JavaScript 在网页上单击鼠标的地方显示层及关闭层
2012/12/30 Javascript
Extjs4 关于Store的一些操作(加载/回调/添加)
2013/04/18 Javascript
浅谈JavaScript正则表达式分组匹配
2015/04/10 Javascript
学习AngularJs:Directive指令用法(完整版)
2016/04/26 Javascript
在JavaScript中模拟类(class)及类的继承关系
2016/05/20 Javascript
全面解析多种Bootstrap图片轮播效果
2016/05/27 Javascript
jqueryMobile 动态添加元素,展示刷新视图的实现方法
2016/05/28 Javascript
详解AngularJS controller调用factory
2017/05/19 Javascript
js实现类选择器和name属性选择器的示例步骤
2021/02/07 Javascript
python中文分词,使用结巴分词对python进行分词(实例讲解)
2017/11/14 Python
Python实现字符串的逆序 C++字符串逆序算法
2020/05/28 Python
Python双向循环链表实现方法分析
2018/07/30 Python
Django进阶之CSRF的解决
2018/08/01 Python
python如何实现视频转代码视频
2019/06/17 Python
Pycharm 文件更改目录后,执行路径未更新的解决方法
2019/07/19 Python
python 实现Flask中返回图片流给前端展示
2020/01/09 Python
使用keras框架cnn+ctc_loss识别不定长字符图片操作
2020/06/29 Python
意大利巧克力店:Chocolate Shop
2019/07/24 全球购物
乌克兰在线电子产品商店:MTA
2019/11/14 全球购物
您熟悉ORM(Object-Relation Mapping)吗?请谈谈您所理解的ORM
2016/02/08 面试题
平面设计自荐信
2013/10/07 职场文书
责任书范本
2014/08/25 职场文书
企业委托书范本
2014/09/13 职场文书
2015年度党员个人总结
2015/02/14 职场文书
廉洁自律个人总结
2015/02/14 职场文书
初中体育教学随笔
2015/08/15 职场文书
《月球之谜》教学反思
2016/02/20 职场文书
签证扫盲贴,41个常见签证知识,需要的拿走
2019/08/09 职场文书
2020优秀员工演讲稿(三篇)
2019/10/17 职场文书
Java多条件判断场景中规则执行器的设计
2021/06/26 Java/Android
Mysql中mvcc各场景理解应用
2022/08/05 MySQL