DataWhale-Task3(Beautifulsoup爬取丁香园)


简要分析

任务3:爬取丁香园论坛特定帖子,包括帖子主题,帖子介绍,回贴内容(用户名,用户头像,用户所在城市,用户回贴内容)

此次爬取的url:http://i.dxy.cn/topic/admerahealthcollege

其加载帖子内容的接口:http://i.dxy.cn/topic/admerahealthcollege/feeds/list

其数据接口仅在于路径不同,host是相同的,在帖子url补上/feeds/list

数据接口共有三个GET参数:JUTE_TOKEN,type,page,size

参数 说明
JSTE_TOKE 是第一次请求服务器响应的 cookies 之一
type 默认为 0
page 评论的页码
size 每次请求多少条评论

代码函数功能

  • get_json_data:获取评论的数据(用户名,用户头像地址,用户所在城市,评论内容)
  • get_cookies:获取cookies,以备设置JUTE_TOKEN参数值
  • display: 显示提取的最终数据
  • main:主模块,负责调用以上三个函数

完整代码

import requests
import json
import re
from bs4 import BeautifulSoup """
爬取: http://i.dxy.cn/topic/admerahealthcollege
爬取丁香园:丁香园是用 js 接口加载信息的,即直接请求上面的网址
得到的只是一个模板文件
通过浏览器开发者工具可以看到其加载信息的接口为
http://i.dxy.cn/topic/admerahealthcollege/feeds/list?JUTE_TOKEN=f79d77be-f161-4b2a-bc87-b20271b018ba&type=0&page=1&size=20
可以发现的是有三个请求参数 JSTE_TOKEN type page size
url: http://i.dxy.cn/topic/admerahealthcollege/feeds/list
JSTE_TOKE 是第一次请求服务器响应的 cookies 之一
type 默认为 0
page 评论的页码
size 每次请求多少条评论
""" headers = {
'User-Agent': ('Mozilla/5.0 (X11; Linux x86_64)'
' AppleWebKit/537.36 (KHTML, like Gecko)'
' Chrome/68.0.3440.106 Safari/537.36')
} comment_pattern = re.compile('"body":"(.*?)","nickname') def get_json_data(url):
"""
:param url: api
:return: comment dict
comment
nickname 作键值
avator 头像 url 地址
body 评论内容
city 用户省份
"""
comment = []
tarage_index = 1
while True:
target_url = url.format(tarage_index)
resp = requests.get(target_url, headers=headers)
resp_dict = json.loads(resp.content.decode("utf-8"))
if len(resp_dict['items']) == 0:
break
for item in resp_dict['items']:
body = re.search(comment_pattern, item['content']).group(1)
comment.append({item['nickname']: {'avator': item['infoAvatar'], 'body': body, 'city': item['city']}})
tarage_index += 1
return comment def get_cookies(url):
# 获取 cookies
resp = requests.get(url, headers=headers)
for k, v in resp.cookies.items():
headers[k] = v
resp.encoding = 'utf-8'
return resp.text def display(topic):
"""
topic: 字典,键值有 topic info comment
topic key 主题名
info key 主题介绍
comment key 相关评论
"""
print("主题:\n", topic['topic'])
print("主题介绍:\n", topic['info'])
print("主题评论:\n")
for item in topic['comment']:
for k, v in item.items():
print(k, '\n')
print("\t城市:", v['city'], '\n')
print('\t头像:', v['avator'], '\n')
print('\t评论:', v['body'], '\n') def main(url):
html = get_cookies(url)
soup = BeautifulSoup(html, 'lxml')
topic = {}
# 设置 json 接口的 host, JUTE_TOKEN, page 先设为占位符
topic['topic'] = soup.select('#topic-con > div.brief > h2 > a')[0].text
topic['info'] = soup.select('#topic-con > div.brief > p')[0].text
js_url = '{}/feeds/list?JUTE_TOKEN={}&type=0&page={}&size=20'.format(url, headers['JUTE_TOKEN'], '{}')
topic['comment'] = get_json_data(js_url)
display(topic) if __name__ == '__main__':
url = 'http://i.dxy.cn/topic/admerahealthcollege'
main(url)

结果图

参考资料

Beautifulsoup提取特定丁香园帖子回复的更多相关文章

  1. DDD实践问题之 - 关于论坛的帖子回复统计信息的更新的思考

    之前,在用ENode开发forum案例时,遇到了关于如何实现论坛帖子的回复的统计信息如何更新的问题.后来找到了自己认为比较合理的解决方案,分享给大家.也希望能和大家交流,擦出更多的火花. 论坛核心领域 ...

  2. 论文系统Step1:从日志记录中提取特定信息

    论文系统Step1:从日志记录中提取特定信息 前言 论文数据需要,需要实现从服务器日志中提取出用户的特定交互行为信息.日志内容如下: 自己需要获取"请求数据包一行的信息"及&quo ...

  3. 一个通用的php正则表达式匹配或检测或提取特定字符类

      在php开发时,日常不可或缺地会用到正则表达式,可每次都要重新写,有时忘记了某一函数还要翻查手册,所以,抽空写了一个关于日常所用到的正则表达式区配类,便于随便移置调用.(^_^有点偷懒). /*/ ...

  4. 使用Beautifulsoup去除特定标签

    使用Beautifulsoup去除特定标签 试用了Beautifulsoup,的确是个神器. 在抓取到网页时,会出现很多不想要的内容,例如<script>标签,利用beautifulsou ...

  5. python beautifulsoup获取特定html源码

    beautifulsoup 获取特定html源码(无需登录页面) import refrom bs4 import BeautifulSoupimport urllib2 url = 'http:// ...

  6. Java用来进行批量文件重命名,批量提取特定类型文件

    原因: 因为在网上下载视频教程,有的名字特别长,一般都是机构或者网站的宣传,不方便直接看到视频的简介,所以做了下面的第一个功能. 因为老师发的课件中,文件夹太多,想把docx都放在同一个文件夹下面,一 ...

  7. jmeter正则表达式提取器提取特定字符串后的全部内容

    jmeter进行JDBC请求时,请求后的响应结果在传递给下一个请求使用时,需要用到关联,也在jmeter中,关联通过正则表达式提取器实现. 但是,在JDBC请求后的响应结果中,往往需要关联的内容是只有 ...

  8. python 利用正则表达的式提取特定数据如手机号

    import re file=open('1.txt','r') listfile=file.readlines() listfile=','.join(listfile)#合并文本 listfile ...

  9. js 提取特定的时间区间段

    项目中遇到问题,需要根据用户的选择提取出一个时间的区间段,然后对后台进行请求. 基本思路,先根据new Date()对象求出start_time和end_time时间戳,然后把时间戳转化成new Da ...

随机推荐

  1. SharePoint 2013 关闭 customErrors

    在SharePoint 2013上做开发时,如果不把customErrors 关掉,那调试起来那真叫一个费劲.在2013里,关闭customErrors 和2010一样,只要把文件路径改成15目录下即 ...

  2. @RestController注解的使用

    示例代码:/*@ResponseBody@Controller*/@RestControllerpublic class HelloController { @RequestMapping(" ...

  3. 【NOIP2018】为什么这么无力啊

    菜鸡又要爆零了 辛辛苦苦背板子结果考时候脑子一片空白 第一题线段树调了半小时 看完三道题两道写暴搜一道写暴力(说是暴搜,觉得更像写了个背包) 别提暴搜还忘记剪枝. . . . . . 我觉得考场上最菜 ...

  4. 移植DirectFB于SOC3210(龙芯)【转】

    本文转载自:http://blog.chinaunix.net/uid-25298908-id-120188.html 编译平台:龙芯.中标普华Linux桌面5 目标平台:SOC3210 一.获取源码 ...

  5. B4010 菜肴制作 拓扑排序(附随机跳题代码)

    今天写了一个自己的随机跳题小程序,第一次试发现跳的全是不可做题,但是在周围我一眼看见了这个题,不能说一眼看出来,但是也是比较有思路,所以就做他了! 做得比较顺利,做完之后美滋滋,突然发现样例第三组过不 ...

  6. Error-Java-IJ:Imported project refers to unknown jdks JavaSE-1.7

    ylbtech-Error-Java-IJ:Imported project refers to unknown jdks JavaSE-1.7 Import from EclipseImported ...

  7. 第14课 SourceTree程序操作介绍

    http://www.atlassian.com/software/sourcetree/overview https://www.microsoft.com/net/framework/versio ...

  8. 0605-类的继承、重写、parent、final

    定义一个子类(man) //定义一个类 class renlei{ var $name = '王五'; var $age = ''; var $sex = ''; var $todo = ''; fu ...

  9. 【LuoguP5004】 专心OI - 跳房子

    首先这是一道计数类DP,那我们得先推式子,经过瞎掰乱凑,经过认真分析,我们可以得到这样的方程 F(N)=F(0)+F(1)+....+F(N-M-1) 所有F初值为1,F(1)=2 ANS=F(N+M ...

  10. 每日算法——新型在线LCA

    在线LCA一般大家都会用倍增吧,时间复杂度O(nlogn),空间复杂度O(nlogn),都是非常严格的复杂度限制,并且各种边界处理比较麻烦,有没有更快更好的办法呢? 我们发现,在树链剖分时,我们不经意 ...