ao3如何创建合集(我是怎样得到AO3内容的)
ao3如何创建合集(我是怎样得到AO3内容的)
2024-06-02 07:27:54  作者:情侣童佳倩  网址:https://m.xinb2b.cn/tech/qkj135655.html

和大家之前说过,相关代码我会放出来,现在代码已经上传了去Github搜索 czw90130/AO3_DataAnalyze,我也和大家讲解一下实现方法,希望能激发大家学习编程兴趣,今天小编就来说说关于ao3如何创建合集?下面更多详细答案一起来看看吧!

ao3如何创建合集(我是怎样得到AO3内容的)

ao3如何创建合集

和大家之前说过,相关代码我会放出来,现在代码已经上传了去Github搜索 czw90130/AO3_DataAnalyze,我也和大家讲解一下实现方法,希望能激发大家学习编程兴趣。

这里先讲解爬虫是怎么实现的,至于文本分析器。下周有空再写吧,实在是肝不动了!

先说一下我的配置环境:

操作系统:Ubuntu 18.04Python环境:conda 4.8.2 Python 3.7.6编辑器使用的是 Jupyter Notebook 代码也是ipynb格式。想学python或者数据分析的可以用这个,适合组织文章。

使用到的 Python 库有:

sys os time 不解释了re 正则表达式解析tqdm 进度条selenuim 自动化测试/爬虫BeautifulSoup html 标签解析器

文章分析器使用的库也在这里说一下:

jieba 结巴中文分词,就是吧文章拆分成一个个词语wordcloud 词云生成器matplotlib 图表绘制库numpy python数学运算库(这个其实就是做了个计数器~)

都是非常常用的库,对 Python 和数据分析有兴趣的朋友可以照着这个表看看。(操作系统不熟Windows也可以) 对AO3的爬取并不复杂,但还是有一些难度的。经过我一系列的测试发现,Request并不能有效的爬取AO3的信息,因此就选择了selenium。对于Selenium的介绍,我就过多不多描述了,有很多技术文介绍。大家可以自行搜索。我这里给大家一些关键词,方便大家搜索。

selenium配置chromedriverselenium元素定位方法

首先加载要用到的库

import sysimport reimport osimport timefrom tqdm import tqdmfrom selenium import webdriverfrom bs4 import BeautifulSoupimport random

爬取AO3的中文文章其实并不复杂:

1、我们进入AO3首页,点击 “Search” 然后点击 “Edit Your Search” 进入高级搜索模式

2、在Language里选择中文,点击“Search”

3、把滚动条拉倒最下面,点第二页

4、把浏览起里面的地址复制下来

我们仔细查看这个url请求,发现这个请求的参数还是非常清晰的,让我们来看看works/后面的参数:

search?commit=Search&page=后面跟着一个数字2,我们点击其第三页,这个数字也变成了3。所以可以断定这个参数指的是页码&work_search[language_id]= 后面跟着zh字样,可以判这个参数是控制语言的。

同理&work_search[rating_ids]=控制的是分级

其他字段也是类似的,大家有兴趣可以自己试验,我就不再叙述了,值得一提的是,我在爬取时并没有用到分级标签功能,只是在搜索里面翻文章。通过多次搜索我发现AO3的搜索结果有一定的随机性,并没有主动干预搜索结果,这一点还是很良心的。

其他字段也是类似的,大家有兴趣可以自己试验,我就不再叙述了,值得一提的是,我在爬取时并没有用到分级标签功能,只是在搜索里面翻文章。通过多次搜索我发现AO3的搜索结果有一定的随机性,并没有主动干预搜索结果,这一点还是很良心的。

#获取搜索页面def make_search_url(page=1, langu="zh", rating_key=""): rating = { "": "", "Not_Rated": 9, "General_Audiences": 10, #一般观众 "Teen_And_Up_Audiences": 11, #青少年及以上观众 "Mature": 12, #成熟 "Explicit": 13, #明确的 } base_loc = 'https://xxx.org/works/' #网站地址大家自己查这里我用 xxx 替代了 base_loc = "search?commit=Search&page=" str(page) "&utf8=✓" #搜索页 base_loc = "&work_search[bookmarks_count]=" base_loc = "&work_search[character_names]=" base_loc = "&work_search[comments_count]=" base_loc = "&work_search[complete]=" base_loc = "&work_search[creators]=" base_loc = "&work_search[crossover]=" base_loc = "&work_search[fandom_names]=" base_loc = "&work_search[freeform_names]=" base_loc = "&work_search[hits]=" base_loc = "&work_search[kudos_count]=" base_loc = "&work_search[language_id]=" langu #语言 base_loc = "&work_search[query]=" base_loc = "&work_search[rating_ids]=" rating[rating_key] #分级 base_loc = "&work_search[relationship_names]=" base_loc = "&work_search[revised_at]=" base_loc = "&work_search[single_chapter]=0" base_loc = "&work_search[sort_column]=_score" base_loc = "&work_search[sort_direction]=desc" base_loc = "&work_search[title]=" base_loc = "&work_search[word_count]=" return base_loc

下面我们看看搜索页面的html,在Chrome中可以按F12打开开发者工具。 Ctrl Shift C 使用元素选择工具点击一下文章标题,查看后发现所有的搜索结果都在 <ol class=work index group>标签下,并且在li标签的id中记录了文章的id。

我们点击进入一篇文章,查看文章的url发现文章url与上面的id是一一对应的。这样,我们就可以通过分析搜索页得到文章的地址。

这样,通过BeautifulSoup抓取相应标签获得li标签的id,就可以得到该搜索页下面所有的文章地址了。

#获取文章链接def get_work_id_from_search(html): old_list = [] soup = BeautifulSoup(html, 'html.parser') ol = soup.find('ol', attrs={'class': 'work index group'}) work_blurb_groups = ol.findAll('li', attrs={'class': 'work blurb group'}) for wbg in work_blurb_groups: if wbg["id"] not in old_list: old_list.append(wbg["id"]) return old_list

做好这些准备工作下面我们就开始正式爬取数据

save_path = "fulltext/" #存储文章的文件夹#5000页中文内容,这里可以先取较小的数字做测试start_p = 1end_p = 5000pbar = tqdm(range(start_p, end_p))

具体思路是这样的:

打开一个浏览器,需要注意的我这里使用了代理,否则无法浏览到AO3;通过selenium find_element_by_id 功能找到相应按钮自动点击,同意网站条款;进入循环,通过make_search_url函数组合出搜索页的链接,遍历页码;将搜索页的html传入函数get_work_id_from_search提取出所有文章id;遍历文章id通过文章id组合出文章地址并访问,最后保存文章页面的html。

这其中有两个注意事项:

当进入限制级文章时,网站会提示再次同意浏览条款,当检测到条款关键字时,使用find_element_by_link_text('Proceed').click()点击确认即可;频繁访问后,网站会拒绝访问请求出现‘Retry later’页面,当检测到这种情况后,进行异常处理,关闭当前的浏览器,等待一分钟后重新访问。(这也是爬取文章速度比较慢的原因,有大神知道怎么解决的请赐教)

c_service = webdriver.chrome.service.Service('/usr/bin/chromedriver')c_service.command_line_args()c_service.start()chrome_options = webdriver.ChromeOptions()chrome_options.add_argument('--proxy-server=socks5://localhost:1080')browser = webdriver.Chrome(chrome_options=chrome_options) # 调用Chrome浏览器browser.get("https://xxx.org/") # 网址用xxx替代time.sleep(3)browser.find_element_by_id('tos_agree').click()time.sleep(1)browser.find_element_by_id('accept_tos').click()time.sleep(1)for page in pbar: search_url = make_search_url(page) #生成搜寻页面链接 browser.get(search_url) # 请求页面,打开一个浏览器 html_text = browser.page_source # 获得页面代码 try: work_list = get_work_id_from_search(html_text) #获得文章的id for work in work_list: work_path = os.path.join(save_path, work ".html") if os.path.exists(work_path): continue work_url = "https://xxx.org/works/" work.split("_")[1] #创建文章URL 网址用xxx替代 browser.get(work_url) html_text = browser.page_source #获得页面代码 if "If you accept cookies from our site and you choose \"Proceed\"" in html_text: #无法获取正文则点击Proceed browser.find_element_by_link_text('Proceed').click() time.sleep(1) browser.get(work_url) html_text = browser.page_source if "Retry later" in html_text: raise AttributeError if "<!--chapter content-->" in html_text: pbar.set_description("saving: " work) fh = open(work_path, 'w') #保存页面 fh.write(html_text) #写入内容 fh.close() #关闭 time.sleep(float(random.randint(10,50))/10) #随机延时 except AttributeError as e: print(e) time.sleep(3) browser.get("http://www.toutiao.com") time.sleep(3) browser.quit() c_service.stop() time.sleep(60) c_service.start() browser = webdriver.Chrome(chrome_options=chrome_options) #调用Chrome浏览器 browser.get("https://xxx.org/") # 网址用xxx替代 time.sleep(5) browser.find_element_by_id('tos_agree').click() time.sleep(2) browser.find_element_by_id('accept_tos').click() time.sleep(3) time.sleep(float(random.randint(10,50))/10) #随机延时

以上就是AO3爬虫的所有代码,爬虫会将文章都保存在 fulltext 文件夹下等待分析,这里的内容都在 AO3_spider.ipynb 中,都是开源的,大家可以自行 clone 拿去修改玩耍。

再次说明一下,因为是利用周末时间写的东西,语法格式也是比较飘逸,我自己也并不是爬虫和数据分析方面的专家。所以很多地方还是有些笨拙的。希望大神们也能帮忙指点。

  • 拉链坏了怎么修理图解(拉链坏了的4种情况)
  • 2024-06-02拉链坏了的4种情况我们买到这些带拉链的物品,遇到拉链不灵活拉不开、爆开、缺齿等烦心问题,该怎么办呢?落落整理了一些生活小技巧带你去看看吧!1拉链不灵活衣服、包包、裤子拉链受潮或生锈、氧化后拉动时不畅通我们该怎么办解决办。
  • 5g网络架构sa和nsa是什么意思(5G什么是独立SA)
  • 2024-06-025G什么是独立SA根据3GPP最新发布的涵盖5G网络的15版标准,第一批网络和设备将被归类为非独立网络(NSA),也就是说5G网络将由现有的4G基础设施支持在这里,支持5G的智能手机将连接到5G频率以提高数据吞吐量,但。
  • 中年女人对你好感的表现(中年女人动心了)
  • 2024-06-02中年女人动心了无论是年轻的时候,还是人到中年,一个女人的爱情,都是难以隐藏的,只要爱了,便一定会留下一个痕迹只是,年轻时,对待感情冲动不顾一切,对一个男人动心了以后,可以无所顾忌的去爱但是,女人到了中年,对待爱情就。
  • 湖南女子学院招男生(今年起湖南女子学院男女生兼招)
  • 2024-06-02今年起湖南女子学院男女生兼招三湘都市报·新湖南客户端5月31日讯(全媒体记者杨斯涵刘镇东黄京)“不是女子学院吗,为何要招收男生呢?”“招收男生后,对学校的专业特色会不会有影响?”近日,湖南女子学院在2022年招生章程中表明“学校。
  • 怀念汪曾祺 再见汪曾祺
  • 2024-06-02怀念汪曾祺 再见汪曾祺“大一”听汪曾祺先生讲座后,再次见到汪先生,是四年以后其时我已大学毕业,在一家报社供职我所在的副刊部主任士是闽南人,元旦省亲返京,带回许多水仙球,准备送给几位作家,藉此联络感情对于送水仙球之任务,我当。
  • 吴镇宇张家辉古天乐再聚首(吴镇宇普通话切换粤语失败)
  • 2024-06-02吴镇宇普通话切换粤语失败吴镇宇普通话切换粤语失败,古天乐频频提示,张家辉:我笑不出来《使徒行者》是由古天乐,张家辉,吴镇宇等主演,影片讲述一对兄弟幼时失散,30年后因一桩罪案相见,随着对罪案调查的深入,一个多年来隐于幕后的恐。
  • 火龙果嫁接蟹爪兰固定方法(用火龙果的枝条嫁接蟹爪兰)
  • 2024-06-02用火龙果的枝条嫁接蟹爪兰火龙果只要环境适宜,给多一点光照,给点粪肥,加上排水好和温暖微润的环境,火龙果能不断长出分枝,无论是盆栽还是地栽养护的火龙果,都要搭设支架,后期枝条长得比较多了,就可以用来嫁接蟹爪兰了上图为盆栽的火龙。
  • 帕金森病治疗的最好锻炼方法(世界帕金森日7种康复运动)
  • 2024-06-02世界帕金森日7种康复运动编者按:4月11日是“世界帕金森日”,“帕金森病”已经不是一个陌生的名词从周围的普通老人,到数学家陈景润、文学家巴金、拳王阿里、凯瑟琳·赫本、希特勒……我们都看到了“它”的寻在制服它,似乎还缺少更成熟。
  • ios跟ios怎么传送软件(iOS13超级有用的功能)
  • 2024-06-02iOS13超级有用的功能今天就不讲手机越狱消息了,主要分享一个关于「iOS13系统传输文件与电脑同步」的方法,该方法对于经常传送文件的朋友较为有用,这样就不用QQ和微信传文件,赶紧收藏了我相信还有部分用户是使用QQ或者微信传。
  • 长沙城轨站内换乘地铁(长沙这个地铁站旁已增设公交站)
  • 2024-06-02长沙这个地铁站旁已增设公交站长沙晚报掌上长沙7月15日讯(全媒体记者聂映荣实习生苏虹)日前,《长沙晚报》报道,长沙地铁6号线象鼻窝站离相邻的公交站太远,两个方向的公交站与地铁站出入口分别相隔450米及652米乘客换乘极为不便,在。
  • 胸肌和背阔肌的训练方法(胸背超级组训练法)
  • 2024-06-02胸背超级组训练法很多人都想要拥有性感有型的倒三角身材,其中,宽阔厚实的胸大肌以及背阔肌必不可少,在健身训练中必须要重视加强胸肌和背部肌肉的锻炼八届奥赛冠军健美先生施瓦辛格是很多人崇拜的健身偶像,他的身材无比壮硕健美,。