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中unittest用法实例
Sep 25 Python
python使用wmi模块获取windows下硬盘信息的方法
May 15 Python
Python模拟登陆实现代码
Jun 14 Python
Python 25行代码实现的RSA算法详解
Apr 10 Python
python用户评论标签匹配的解决方法
May 31 Python
PyQt QListWidget修改列表项item的行高方法
Jun 20 Python
Python3批量生成带logo的二维码方法
Jun 24 Python
Python3中configparser模块读写ini文件并解析配置的用法详解
Feb 18 Python
Python3 shelve对象持久存储原理详解
Mar 23 Python
Python xmltodict模块安装及代码实例
Oct 05 Python
Python如何导出导入所有依赖包详解
Jun 08 Python
Python jiaba库的使用详解
Nov 23 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
PHP使用NuSOAP调用Web服务的方法
2015/07/18 PHP
PHP手机号中间四位用星号*代替显示的实例
2017/06/02 PHP
PHP filesize函数用法浅析
2019/02/15 PHP
jQuery Validation插件remote验证方式的Bug解决
2010/07/01 Javascript
Knockout数组(observable)使用详解示例
2013/11/15 Javascript
JavaScript字符串对象的concat方法实例(用于连接两个或多个字符串)
2014/10/16 Javascript
jQuery的load()方法及其回调函数用法实例
2015/03/25 Javascript
jquery UI Datepicker时间控件的使用方法(基础版)
2015/11/07 Javascript
JavaScript编程学习技巧汇总
2016/02/21 Javascript
如何利用Promises编写更优雅的JavaScript代码
2016/05/17 Javascript
jQuery 3.0十大新特性
2016/07/06 Javascript
jquery基本选择器匹配多个元素的实现方法
2016/09/05 Javascript
js完整倒计时代码分享
2016/09/18 Javascript
vue.js入门(3)——详解组件通信
2016/12/02 Javascript
如何在Angular2中使用jQuery及其插件的方法
2017/02/09 Javascript
Javacript中自定义的map.js  的方法
2017/11/26 Javascript
详解VueJs中的V-bind指令
2018/05/03 Javascript
JQueryDOM之样式操作
2019/03/27 jQuery
js 将线性数据转为树形的示例代码
2019/05/28 Javascript
微信小程序 点击切换样式scroll-view实现代码实例
2019/10/11 Javascript
Python 实现数据库(SQL)更新脚本的生成方法
2017/07/09 Python
Python 比较两个数组的元素的异同方法
2017/08/17 Python
Python如何抓取天猫商品详细信息及交易记录
2018/02/23 Python
python 多线程中子线程和主线程相互通信方法
2018/11/09 Python
Pytorch数据拼接与拆分操作实现图解
2020/04/30 Python
浅谈Keras中shuffle和validation_split的顺序
2020/06/19 Python
使用CSS3代码绘制可爱的Hello Kitty猫
2016/08/03 HTML / CSS
凯伦·米莲女装网上商店:Karen Millen
2017/11/07 全球购物
本科毕业生的求职信范文
2013/11/20 职场文书
高中同学聚会邀请函
2014/01/11 职场文书
庆七一活动总结
2014/08/27 职场文书
个人违纪检讨书
2014/09/15 职场文书
销售开票员岗位职责
2015/04/15 职场文书
法定授权委托证明书
2015/06/18 职场文书
百年校庆感言
2015/08/01 职场文书
导游词之四川熊猫基地
2020/01/13 职场文书