TA的每日心情 | 开心 2020-5-22 23:45 |
---|
签到天数: 126 天 [LV.7]常住居民III
|
本帖最后由 水货姐姐家QD 于 2018-6-22 22:41 编辑
- ?" C- P3 R3 a4 b$ u A1 t. g( q" u6 M2 B8 |8 j) U6 s7 ~1 o+ Z! @# A
首先,这篇帖子的作者就是我: X6 w) T8 z+ ]
水货姐姐家的QD
% A' W! P- E! r/ }/ W6 K' i- S也叫(QQending/QD)
8 w4 a' J5 v: h$ }" M' u. o$ K3 j' T9 J0 Q- h- \
非小白向,是因为我最近可能考研,但是因为一些原因,还是把这个能获得比较正常抓取结果,但是过程不成熟和规范化的东西发出来了,原因后面补。$ |" _4 x/ G/ y) A P
/ T4 c8 E d+ p3 a& J5 I9 p
Python工作环境:官方3.6.5 + Beautiful Soup4最新版 或 Anonconda最新版(对应的Python应该是3.6.4)都可以。
4 O3 g. s6 R! Y* Z# U" c" V) g" CMac OSX系统注意在文件的抬头添加!\user\bin\env
. _; {% f. A7 G" w* r3 ~鉴于鄙人没有苹果电脑,工作环境也没有人能提供我苹果系统,自己也没装黑苹果,所以抬头除了强制utf-8,并没写苹果默认的环境配置。+ Q; f# L! @- ?# a" [! j3 Q; V
其他没有什么特殊要注意的。
& X+ R2 R% w, f& d% T0 U. l9 M9 I% c7 t( H( v! q: w& r. \
7 ]9 u: \4 @+ F6 k( s9 U
最初我的想法是,直接对每一个想要的单词书进行url记录,并爬取,事实上也这么做过。' C* o8 t6 @! b5 v
其主要目的是因为,扇贝网的单词书里面混杂了很多至少自己用不到的单词书。
* G. e2 Q' K6 h0 A& z T2 H1 `" K* b$ Q4 A4 q
扇贝网单词书首页:
! k' n- ?) r) o9 G( ?0 mhttps://www.shanbay.com/wordbook/+ p$ c$ }5 X2 K. E x
! i# O1 v2 U! { r" \& D3 k$ P
其结果就是……看的太累了,毕竟每个词单甚至要一个一个点开进去看简介。 U. h9 I u" W
就算现在是百兆甚至千兆光纤,但是光响应时间,也是个事,对吧。
3 K% n" o$ H- A0 B& w0 p
. k; i5 }( N- n/ ]9 K: K# l所以,在经过多番提取url后……我选择……
$ c% j, @( r z4 V4 K. P- {首先根据扇贝网的单词书分类
/ {) _+ g: J( F' J1 R比如( L) C$ g9 v/ r7 d& B4 Y# ]8 O9 ~+ R
考研
" j1 g8 |% ]' u8 R/ @" ehttps://www.shanbay.com/wordbook/category/10/
7 C8 s, ?# S; N+ bcategory后面是10
+ H4 u) P; S$ f7 A不同单词书分类后面的不同,关于这个,我就干脆手动把分类记录在了一个txt里* A1 T( p/ q* b6 v: r" x, p
: c4 W# L) n0 ? Z3 y8 w7 W
见附件。抓取也会用到. c) `, u" s/ @0 p+ j
然后让抓取脚本使用requests函数进行抓取,当然这里你们使用urlib3, urlib2都可以。2 a6 x. x: c# l
其实扇贝网对抓取的限制似乎并不严格,只要间歇稍微大一点,至少把这些词单抓完是不会被封号的。
% F) F2 f6 o) q* z7 X+ i6 |! y. A但是如果多进程或者多线程抓取间隔太小,那么就会被ban了。
3 d/ T- ^$ M: m6 m3 Q; p8 Y我代码里面的Proxiey其实真正用到的只有我自己的SS套餐的代理(本地127.0.0.1那个,其他的并不能使用……)我还真不知道有什么适合爬虫的IP池可用。
9 l; ?( v/ B' a0 p
& s) C @& {8 p- G. C8 h6 P) H F5 J/ m/ h' {5 c( O
以下就是抓取列表和根据列表抓取词单的两份代码了。
3 _0 t" v+ m8 l
5 e3 _: Z$ e* _; |这个附件的两个脚本都放在同一个文件夹内。7 C' k9 L) r2 R" i2 `5 O& y
然后在这个文件夹内新建一个input文件夹,将第一个脚本内的txt扔进去……% Y7 y, c' h& T9 @$ `- w
然后用python运行shanbay_crawl_list.py就可以得到分类的url
" P" m0 q- K6 [# \注意,这些url将在一个叫做output的文件夹内出现
8 {& M( L6 A5 i1 A3 c }/ \- p我的这两份代码,都稍微进行了文件夹命名的处理。9 W/ P% A" G$ D/ j5 R8 l
你可以将这些url完全合并到一个txt里,然后用shanbay_crawl_new.py进行抓取
; k6 G5 t/ K* C! `# e& T0 u" `也可以按需选择性的合并。
! O4 t- t/ n4 p0 r1 ^. e( m
# \' r( |2 V k% @6 |. ?category:** 这个不是每份文件信息前必备的* i. C$ L$ o. s7 i9 v1 n
这个只是用来记录分类的$ x. ]$ o8 P9 R
而且你可以自己定义category的名称- X' @ }3 Z" H9 }. E9 y
但是如果后面的category与前面的不同,那么你就需要重新添加一行category:**了
( y0 G% ?' D9 E( x8 `2 _, m: f, H4 r# U: a Y
最后将合并好的文件命名为shanbay_url_list.txt r9 u5 T8 W9 T5 y1 f# Z
放入input文件夹内,运行shanbay_crawl_new_url.py; E; _; B Y% Q; }
6 |5 o/ R+ e. v5 N9 Y! r当然,如果稍微懂一些python的,就知道我说了很多废话
) @( @# D6 K! Y+ e( r$ X( r. P代码很简单,除了我个人写的丑和不专业化,其他应该真的不难理解吧。(我是指代码部分), a) E: P1 u/ R1 w8 {6 @
3 A9 C) E5 Y9 ~; I+ F+ {, z
关于多线程和多进程。
% y- I# Y: }1 @$ b: R. E廖雪峰老师简单的说是多线程如果崩溃,那么就完全崩溃了。
; n7 E& b; T& ?% m: b) d但是我之前抓过一个论坛,抓了差不多几万个帖子的小说吧,利用try except Exception,反正是没让多线程崩溃。) D8 H+ b/ C# o
多进程则效率低点,这份代码使用的就是多进程的,讲真……一共也没多少。而且还是建立在我怕单IP被封,多设置了一些延迟的基础上。还有IP被封,估计也就12小时,有IP池的可以测试一下被封的上限是多少,没有的就老老实实的用这个延迟吧。. l- U9 N6 d }1 D
* a1 W5 C. s! `5 \1 X7 K6 y* i) f% ?" N) E2 y
其实我抓扇贝,主要还是为了抓个不同考试的单词范围……
- ^6 c M) y, C3 f' ?6 v3 P结果将各种词单合并后……
0 K) w4 y+ U! r4 `根据单词出现在不同词单中的频率,根据词单关键字(比如大纲,必备,热词,高频之类的)进行二次分析,效果还是一般。
* v7 e$ N/ G$ p% U$ t反正托福,雅思都是能合并出接近2万单词量那种,不过不排除是因为未进行lemmatization(词性还原)将派生词之类的还原回去的缘故。& v4 N* w% N; d8 u! d8 v
这个就比较复杂了。
/ D5 [" y' u: B1 E% R! R8 x% @- @0 x; y/ ~
好吧,这个帖子主要还是说抓扇贝的单词的……
' h' W2 O3 @ Y/ y6 V我是真的至少将绝大部分词单都抓下来了。
. X7 D8 R4 j4 ~8 E, e8 E* j单词加释义,释义使用\n分割的,如果看着不舒服的,可以批量替换了。毕竟\n本身代替的也是换行的意思,只不过我强制使其不发生转义显示出来了。
- O! l3 @( b/ a. ]$ i& d; s9 @% O9 b
. S4 u1 w q7 K8 _+ e
+ S. u7 A0 G% \. w" b我做url_list抓取的时候,其实还记录了owner(词单拥有者), wordcount(词单单词数), brief(简介)
/ o) L8 {( Z0 z. m# u简介为了快速人工识别所需的url,owner和wordcount,是因为有的词单名称一样,如果直接命名title,那么就会被覆盖……当然,可以多一步检测文件是否存在,并存为filename_n这种操作。9 j) a+ q1 Z3 a6 R
再有,方便直接看,到底是谁的词单,毕竟shanbay自己的更稳点嘛。
' T/ U; t' G) i1 R% o$ S6 _
6 Y% t* m8 f6 {* Y7 q其实做这个本来的目的也是为了做考试单词的统计,这是我人工筛选后,进行代码合并后的结果,如下图
: u l( ~+ g# K
0 n, D! k u0 g3 x5 ]2 X/ [; f% N, c8 O! J
" ~+ n5 F% k1 U
其中分为单独的词单出现频率数对应的单词数,以及加上关键词(大纲,热词,高频这类的)
( w% w% E8 w+ T! P! d9 ?% B然后统计出的词单单词数……+ X3 U/ V% O& P+ r/ p* {
这部分也是有脚本的,当然,如果要再进行说明……就要再开贴了。- M; L' ]' O" j4 [+ m- T
" n4 N1 D% b5 h' a R! F
还有……我本来是通过论坛的资源,抓取了四本含有词频的学习型词典的词频,配合COCA BNC iWeb等语料库,想做个合集的mdx
$ ?+ e; N! g5 a5 v4 {2 dmdx现在还没做出来。
" N/ _/ L+ t8 M; V& @' ]; Y抓取了挺久的了,其实最早语料库也是抓取的论坛的资源……6 X7 j* d8 e: ^0 s) N! w0 |, A
但是发现,如果不考虑有没有Freq(具体词频)的情况下,语料库来源网站的sample好像足以了,而且有2017年等新的资料。
9 r" [9 Y$ `) F/ `3 M% M
$ u+ O, H" ^8 _7 g: R* j7 Y! v6 t& [$ V1 h1 ?- P" u4 n
也做出了整合,这是合并词性(Part of Speech)的或者叫无词性的版本" p4 ]6 x+ k4 [1 M# O
有词性的,其实每份单独的也都抓取出来了,而且大体上的代码也写出来了,稍微改改……: d4 _4 P5 F/ h
就可以去制作mdx了。. y. a/ z$ P5 w u
大概这份mdx也主要是以表格的形式体现# N+ Q* d9 }. b1 N# x" Y
分为有词性和无词性的显示方法。
2 b% a+ U0 p8 B# o2 w) R具体就需要再开一贴了……
! m+ \: i/ J+ K# X/ G! b/ H0 O( j, s2 j* U
9 T% z f3 S y, S L5 W: ]! j3 y. F现在,我做出来了一个另一个作用的东西,就是可以把两个词单分析出差异,到底差异在什么部分……0 ?% s+ C# M" {0 R+ t
词单本身和差异部分用语料库和词典词频进行划分7 m( @4 ^6 N. Q/ M
: L e; X; W; X8 t
: \1 a' G5 t6 x7 q' [1 a
+ c* `9 ^/ C5 D o( b
帖子初版上传的代码有点问题……/ y5 R2 @; f$ O" r3 G
因为我抓取url_list的格式改了好几个版本,最后的url形式是临时凑活用的,所以从url_list根据正则表达式读取信息的代码略微有点问题,这次更新了。3 _. o) `3 i4 w6 v% ~
$ l: e$ U/ w, m+ J4 B9 x |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?免费注册
x
评分
-
5
查看全部评分
-
|