数学建模社区-数学中国

标题: Python爬虫仅需一行代码----crawl第三方库 [打印本页]

作者: zhangtt123    时间: 2020-6-2 16:00
标题: Python爬虫仅需一行代码----crawl第三方库
仅需一行代码写爬虫–simple_crawl
8 `7 i6 t5 U, n$ O5 c& j2 D9 nsimple_crawl4 C) G- S/ j1 l: I- A
仅需一行代码即可达到爬虫效果( |; r& e7 b( M3 C
项目地址(欢迎star):https://github.com/Amiee-well/crawl9 k; K" P# p& X" B* K
使用方法/ x3 e2 L% T* z
pip install simple_crawl3 t; }. Q2 w6 B# m4 z/ N/ K3 v7 f

' _% f. ]* m8 W& r  e0 k" t### 以下源代码为简单介绍,详细功能介绍再源代码之下
/ n( O9 L; u5 e2 b0 F1 qfrom simple_crawl import request
" |4 A* s7 I( F5 m, B. irequest.parse(4 p& S/ s% R% |& E& e* r( B/ X
        # status 参数为运行状态,支持单线程多线程多进程协程以及联合
% [* v1 f' W/ A        status="aiohttp"," I; @2 N( W9 ^. K4 J
        # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式  R6 X, ?: f  q0 {
        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
+ A9 k/ {; W- c. g) w' p        # login 参数为获取登陆信息,如淘宝等网址需要登陆信息
9 H0 i1 j" z3 ?2 _) ^    #login="taobao"," H5 ?' ]& E% A. b4 C  f; J: N
    # type_url 参数为返回源代码格式,支持text和json,默认返回text
4 m4 p- d; a( b; `/ M) S' `! ?    type_url = "text",# Z0 ~. r4 P+ r2 T
    # Parsing 参数为解析方法,支持re、xpath和beautifulsoup
1 W4 h" k/ G5 G" L' I9 T    Parsing = 'xpath',
4 B- B: H5 O# ^. P( ^, o    # label 参数为爬虫解析过程,字典格式,详情见下方
, R# {; j% Q: T1 G; E3 U! l7 k    label = {0 R2 o; Y/ |( d$ y+ M* N0 H: m
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
: V6 v" z+ l: r  b6 x  U4 Q, z            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],+ r, S$ I! p, o- S! j* Q! W
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]$ v0 R! [9 V( j# j$ B9 K; M
     },
1 ?- a# s: _; ]3 R     # write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱, B' i6 r! k# V+ P7 W2 |: L6 J
     write='result.txt',% N6 C7 J3 S" Z- e  W
     # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫
7 z' r, j* ~$ r8 d) f     next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',* U) Z- `/ u- ^5 Z& S/ z
     # page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫
' W. h2 J: A1 `; x2 V     page=[True,"now_url.txt"],
. k8 c6 ]3 G* Q( P6 R  [; g     # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息
2 I) ]2 m( S, l! x     #clean=True,: d. {* s8 t0 R2 s; G9 c" f: z
     # texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序
8 p; K( s7 X; V6 s1 l6 d. f. }     texting=True,
& ~& m/ p. K% `7 W5 B     # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态8 o' u$ F4 S& j
     Thread_num=3,
0 n; ]2 U( Z6 s     # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态% o- h0 i3 M  Q! F. O  B' H+ A- U
     cpu_count=1,
  ?- t  o9 c. }; k! Z" l/ I     # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态
* L, R0 N. ]$ T* G# D2 K: f7 L     sem=5,
. k* a' \9 x6 F  G     # write_SQL 为是否写入数据库,默认否
" Z2 h1 t# H: [4 N$ ]     # host 参数默认localhost
+ p6 C: _  Y4 l6 V8 ^$ E/ i) @     # post 参数默认33068 ^3 m: A4 ^5 v' F0 b/ G, o
     # user 参数默认root
$ G: ]5 {& h4 S3 A     # password 参数必填,必须正确
7 G  B/ |2 u& L/ q: t; ?, w     # db 参数为即将存入的数据库名,若不存在自动创建9 s0 i$ [1 X0 a0 z4 A
     # table 参数为即将存入的数据表名,若不存在自动创建
, ]1 T3 w$ _2 I9 Q6 Q! F6 g* ]5 t( n     write_SQL={
! j! ^: b5 u& K# [' T6 L, m! Z0 f- d, Y         'host':'localhost',- n2 A" M: L7 I. s3 h4 L: l
         'post':'3306',5 Q, I& p4 g; A& v
         'user':'root',% s% a+ m6 A4 G& V$ {8 O  v
         'password':'123456',
0 f, d2 [4 f+ o- m9 u         'db':'example',
4 T' X& m& Y3 H4 M$ s: L9 c- ^, L: I         'table':'example'
. W7 S5 k% R/ j6 M# p, T' U      }
( [; c9 D& ~1 u& g% ?/ u% r$ v  F" p).run()5 g* o; E& G2 ]2 z% N
7 k; ]& o' [2 E1 o
介绍一下crawl参数设置:
+ X- a9 O* H( i3 @) o8 k$ c
" N  u- h. K" F, [9 @* v! K3 h8 V2 S& ?'''
7 k6 m0 b% n( F: b+ S6 Q! {7 l0 i单行代码爬虫程序执行9 i; P( g1 v9 J! j. [
:param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档% g( N1 Y* r3 [% Y; f; g: i
:param url:即将请求的url地址,仅支持get请求
$ f/ W0 |; I$ o: c! D:param type_url:请求url后返回格式,支持text和json格式返回1 P# F6 K  S/ I
:param Thread_num:即将启动多线程个数,默认为1单线程! c7 T9 V. c2 ]1 q! \
:param sem:协程信号量,控制协程数,防止爬的过快,默认为5$ R6 N% E, p& d, h; j) G3 S# e3 W
:param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半
4 n' t3 X* X( e% [, [: f:param login:模拟网站登陆,保存登陆信息- k; u3 B) T' S: T0 P2 L- }; p
:param Parsing:爬虫方式,支持re、xpath以及bs4方法
4 E5 |( z( x- O, [2 P1 ^:param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,
" j% z* t6 E" ~$ o6 s! N                       多次报错结束程序,默认否
9 ?$ J7 {2 h) o% R( C& @! a8 J:param label:选择器内容,字典格式保存,& L1 [. t4 y$ ?- h, f9 h
                     字典值为列表格式,第一个参数为选择器,第二个参数为转换类型8 N- p6 z/ T  d( f; l' n
                     第一个参数必填,第二个参数默认str类型
# L8 X  U" A+ P$ t; \$ y1 C8 d:param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否# [5 z# L7 ?' @- }; h
:param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫
3 {3 f4 T& P: `' h* f* w:param page:是否选择断续笔记接手下次爬虫处理,默认否
7 J5 w0 _, @; `3 M9 N1 U:param clean:是否进行简单类型数据清洗,默认否
. Y6 p! P+ T5 B5 }! X: ?1 Z:param write_sql:是否写入数据库,默认否' ?, p2 k7 h5 K/ x( N( c9 {0 d! ~
                         'host'默认为'localhost','post'默认'3306','user'默认'root',; \$ w* l. K% B1 A+ q# F( d) ^5 x
                         'password':'密码','db':'数据库','table':'数据表',
1 S$ }+ s% L" `! S8 L                         检测库是否存在,若不存在则创建,若存在则直接插入,' ?3 j$ r$ `* E  C$ l) p
                         检测表是否存在,若不存在则创建,若存在则直接插入3 p* s' s4 w: I
:return True' Y1 y: ], W: ~: a$ w, l6 R! {
'''6 X: R6 J1 s! p- r
介绍玩法6 k5 G/ a' R+ K8 Z0 H
接下来介绍的均为调用第三方库的情况下运行:
2 r+ H7 W! l" J5 x
9 L* @% q, W% q4 sfrom simple_crawl import request
3 B! z6 L, G( d8 {  z8 S9 y第一种玩法:输出源代码2 @/ ^: R( l5 T6 b% E" G0 B
调用requests库进行源代码请求。
  r( v+ r2 ?$ H8 z, F+ {8 J6 T- I& ?% E4 O
特点:
: J1 h) M( [) A& U3 j/ t, ^请求失败则调用ip池处理重新请求访问,3 k/ A$ j4 }0 F2 Q
出现五次失败默认网址输入错误。
9 N4 m: W/ I* K7 `; U* _2 I6 q支持text以及json字符串返回。默认text。
5 E" E" ^' }5 u: `: A, L0 f, F& R4 g! D5 W; G' \
缺点:$ f# z  T2 c3 @/ u  o5 f! s) Z6 s' v
暂时只能进行get请求,不支持post访问
2 z( l- i6 p. H, I% z2 h6 y: U, M9 [( N& w8 k3 P" I$ n0 r  f+ E
:return text or json
, N  v- F+ U9 K" ?9 N3 |/ Z# R2 v2 R8 w- N" Z3 c! E! W' t- l/ a
request.parse(
0 T: P2 d6 `) V" v$ p        url = "https://www.douban.com/group/explore",
; b4 U4 S, j! b1 Q        type_url = "text"
0 r  h# i/ M# v& c0 j* K).run()" }4 X" f1 g' }- @0 P/ k3 r
# return text
5 f" y/ X* p8 p" H2 A
' A: S) d4 [/ U第二种玩法:模拟网站登陆并保存信息
# d$ j) i9 `" I9 N9 ~+ z- G调用DecryptLogin库请求登陆访问。
. R. n% S: X' g
! p8 {. t) I- t+ Tps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源
, N1 }6 H( I6 H& \9 f6 `在此放出文档地址" H& d$ `# o. P& o5 ~' \1 G
DecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/$ K7 d/ C" X1 {6 P! c
: X9 }! ^! S; |, t
特点:& W$ K3 {6 [  G4 f: E! e% s
将DecryptLogin库中二维码继承到此库(非二次开发)( o7 M9 _9 ?+ N8 E1 T+ ]
支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆), O  g  a' R! s6 Y- V1 n' W5 B
保存session.pkl信息到本地方便下次登陆运行% L- x: W9 ]" t7 H# }/ U& A

' X$ D# {! O7 \! [1 X' T缺点:1 e/ z% y0 ^! m9 c: ?1 E
session.pkl登陆信息过时无法自动删除。
% F, H: g* M' l+ S4 w$ d( @2 \  U4 a2 \导致下次登陆疑似cookie无法正常登陆。
" R# ?/ t- B- b; S' B
! z- z2 j% Z2 E0 X9 O:return session
1 |4 V7 V3 k9 |! ^# q* r' u" _* Z# B; f. k' D% E/ T2 Z7 w9 k
request.parse(% B/ v. a* j9 ~9 E. b0 O' }/ `
        # 臭不要脸的推广一下我的店铺' F! v1 t( [* c" [
        url="https://shop574805287.taobao.com/",
: b7 B4 m; K5 ]6 M3 [4 f& I        login="taobao"
1 T' d- o: O3 w# G8 i).run()0 k" p5 i: J0 S6 e
# return text. m; T" y4 G" q, ^2 l

* \6 V5 X9 S6 r( o; }2 N第三种玩法:爬取网站信息
5 Q+ y5 @- v6 E# w爬虫库自然少不了爬虫的过程2 s" E. ?& S! A0 s* u0 [6 @/ {

) W5 C; P1 R1 F! U0 o  E特点:
+ {( q) {# n/ g: }: B) T$ I支持re库,xpath解析以及bs4选择器。4 @  |# Y5 B+ ^  n& r- q. ]2 a
爬取方法为字典格式。单方面输出。
' G/ u& }+ D6 p- W字典键为保存的字段名称。3 Q9 n' N+ g7 n
字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。0 d& M5 Z9 `$ r4 H8 Y
* }8 C& L' w+ d/ d* l+ n
缺点:暂无(等待小伙伴们发现)
$ X1 M% q* B+ @& e
- `- S; i9 x- `8 x) |* X:return reptile_results3 d% m, \5 z; W7 r

; r1 `3 Z0 g; u. f7 xrequest.parse(
1 q& D  D* t6 ]$ R8 }% b" h3 @        url='https://www.douban.com/group/explore',& E+ _! `1 y8 E( [
        # 字符串格式,选择器方法。, ^8 ^$ ^: J8 t% N& l5 r
    Parsing = 'xpath',% G7 w$ ], T2 C
    # 字典格式,参数如上。
1 A# e" P3 v% R0 u    label = {/ P; L) y8 e- i, n& A0 e
        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
$ r7 J4 Z$ J! z! `( x        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],+ a8 w3 p  b9 H
        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
) `: Z, p& ~) n) x- G' t        }* M1 a1 R2 n! Z0 N0 F4 i8 c
).run()
% v. _2 V( r" n# return reptile_results(list): c3 w! ~; |2 h6 `5 _- R
# f! a5 N1 l7 W% }
第四种玩法:自由保存信息4 J/ M# w8 G: j. _+ V; O
目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。
# k, A3 ?5 z2 Z6 E4 @: a
& b" M# b% \; W( K6 u( u( U特点:3 ^3 ]  T9 b/ e4 p. s
写入文件均为数据格式传入文件。
+ b1 ?0 {, j) Q8 U/ Z9 T且输入格式规范方便阅读and省事。
2 |$ R: |. _* e% R: q' M* e8 r( s+ H1 G3 x' z) k; J; D
缺点:& r0 O  t1 [% Y9 a! C( X3 l7 x
保存格式仅四种,
  d2 n% C+ O& Q不方便用户之后读写操作。' f: ]3 n- E& x( p% B8 q3 m& _
5 R: V: B/ O, _  T  `2 V5 s
:return file
' o$ `& u# ^  Q$ @5 d; Y" [" @8 M0 U: N  y
request.parse(
: r5 ^7 H2 V4 A4 R' k3 U        url='https://www.douban.com/group/explore',4 b  \/ \& {3 O, N$ h0 t
    Parsing = 'xpath',6 q) R) E+ L0 ]
    label = {$ y9 U( S# Z" S: L
        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
/ p$ D1 K9 g6 ]: N        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
# n$ {/ b4 I6 _/ [  |, w" p        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]- [" h0 T# i! y# M, p1 H
        },- L) x( {* q+ w: F* o) n' l
    # 字符串格式,具体保存位置填写
6 }3 u; X- g: |    write='result.pkl'! ]$ R; e8 [+ O6 L  h; I
).run()2 G: v0 {' F. ?6 v9 J
# return file; K7 g) f2 K3 Z; p$ X
9 t' u' z9 l8 B& V
第五种玩法:读取下一页 url 地址继续爬虫
! v0 |& Z! U4 ~9 Z; R0 B/ p这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~
& d% S' [1 H( M+ R" j' h# F" I/ ]
+ s. i- L' m% k3 a' l2 P特点:
7 ]/ Y- S/ p1 S; a% g继承之前的Parsing参数选择器选择方法。& k& \$ H! \! D
在这里可读取到解析后的下一页 url 网址。
$ Z- W& A5 M/ B. g% T$ h方可继续进行爬虫处理。方便用户使用。
' ~6 X$ _: ^' G8 [0 B' Q( K( q1 V0 v! ?" L$ y  t! C
缺点:
& [! S2 `' D/ r: u1 H8 V若爬虫时下一页 url 地址改变,便结束爬虫。7 P* u7 f" p$ O+ z3 N; V8 |& ~
只能爬取所给 url 地址中的信息。6 M6 \2 {1 Y( B. T
无法进行某一界面的多个网页爬取返回。% N; j2 |' s# b" A2 p. h( f
造成访问页面单一流失。
# x$ }$ O5 c1 M7 e& h9 j* b- D! U/ J1 V0 Y
:return None4 A! S- [# r* ]" P. a; _
! C% H0 K0 L. r8 s/ I- d
request.parse(  F8 _1 ^, X, j7 t$ D; {; c
        url='https://www.douban.com/group/explore',* i6 {9 n. {+ |' J4 ^$ a
    Parsing = 'xpath',
) |" |) |. z8 A+ E- @    label = {2 }- t  D3 Y# }- m5 t4 D' o% M; f/ s
        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
+ M; Z- Q1 s+ D1 X' A8 [  z5 s4 w        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],5 i# ?4 ]6 [& \, X9 S
        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
/ ^  b% u) t& c* f9 N3 u        },5 `) f& D+ e$ r* K" j6 I) |
    write='result.pkl',
" E9 s6 f3 E" W- Q+ \* R% Q    # 字符串格式,根据Parsing方法继续请求下一页a中href
5 H$ h* i, }8 F7 M& K* h6 G# q    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',! r4 V( V2 ?, [9 |
).run()
* Q' i5 U! f4 o/ J. H" r# return None " \0 b; T! K+ w2 }/ @! x1 A" c2 ?
' l, l, \$ m: K/ U( p2 Q4 q+ K
第六种玩法:爬虫网页保存3 t4 x+ }. Q& h. B+ u1 ^4 i
听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!: b3 n# ^- ~1 P- g7 G& S( Y

1 ]) @0 `7 C( c9 G特点:. ~" r' Z" C, `; v
持续输出断续笔记。) B. U1 t- w3 o# m/ ]
将此次爬虫的 url 地址保存到一个文本文档内部。) _! _- X; _6 S4 D4 y
下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。
+ b( h' _9 G; `4 C$ W6 L4 K/ v' ~. `. P/ J
缺点:
! C- \. q6 {  ^读取内容不单一。& L8 Q3 E+ B$ _0 Z! N8 R" `3 I
导致下次爬虫无法正确读取上次爬虫留下的痕迹。  o- L& {! h7 ~0 f$ r( I! B

3 T9 |9 c5 q0 E, R:return url_file
$ o" v% m( s- M+ v) u6 U8 ]! ^8 g* ?6 i2 O
request.parse(+ z7 f% }7 @9 C5 L0 [
    url='https://www.douban.com/group/explore',
( P6 R/ n2 d$ G' H    type_url='text',. q' Z& h% t% d1 F9 u
    #login='taobao',) k& x6 G7 W, Q8 Q# O" `
    Parsing = 'xpath',7 h3 ?: J1 o  [( M( p) }7 q" F. x
    label = {
7 S2 H. N# N4 @        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],# h9 m* k6 Z& r- d
        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],6 L: f# h# Q; v! x  Y6 w4 p+ T
        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
; i1 W5 d" u+ _& i6 j7 Q        }," p; r7 y0 `6 ?+ ]
    write='result.pkl',
+ Y7 S  ?! P" `5 k1 u6 U# q' z9 Q3 ~    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',+ f* r3 o5 n2 Y) |  F0 Q
    # 第一个参数为是否需要断续笔记。
4 z  N6 k9 C2 i0 n  O, @: P    # 第二个参数为断续笔记保存位置。# F3 B/ C0 o- W& s& L: y
    page=[True,'url_page.txt']
) f' z  m) Z& o6 H) E! M5 G" u( w).run()$ @7 T, E9 P) C) i* `5 G5 X
# return url_file/ ^7 i: e( \8 q3 F
' l0 @3 j, _+ d7 ]
第七种玩法:简单数据清洗
! B& o% M+ v$ N/ W0 Q3 J数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。
+ g+ c4 C7 u, m$ o! b( A, j3 u, |. j3 ~
特点:) I2 \& R0 J! m3 a3 a
本人曾写过一个底层数据清洗。
: x( Y# `8 S  E9 X2 t1 p4 S9 D: ~能将列表格式数据进行归分清洗。
) U8 b/ F6 V' G2 ?# G: F主要内容请参考另一篇文章
- P& R/ p( ~! t7 x如下连接:数据清洗
# }4 j: K) `9 O; k& D3 G. c, r, U
: _8 ^# ]/ N- W' z: Y1 e1 F6 {/ N: W缺点:
7 t; ?4 z/ _4 Q& z) _8 ^& @数据清洗格式简单。& T  M+ q7 x2 I# N
数据清洗内容单一。5 P. ~! F. i1 r6 d$ T8 t& N
无法完全做到绝对清洗。* }& F9 q& S# e3 ?1 B) @& x& v
有待改善。) n% I% Z$ K8 D9 O2 W  s7 l9 l8 v+ u
( \1 ~; e* W8 q6 i' I1 v& x
:return keyword_list, value_list
( A1 t, z" `- I- V6 C2 j& N* v- u
8 i3 U1 h' I8 r7 e  e4 f; Y$ ?1 Hrequest.parse(6 o( j$ c* Y9 V' |  Y& _7 Q
    url='https://www.douban.com/group/explore',/ ^% l& z, s# @: x" }
    Parsing = 'xpath',  W! W; ~0 B0 c1 D& S3 N" |3 C, n
    label = {5 |9 |/ `% I+ X) r' X+ f/ e! I
        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],$ h8 m5 ]  J8 ?  d
        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],# O& V7 B1 j7 O9 w
        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
$ w) c# h. }+ s: n1 G, J        },
) Z+ v% |* ~, \+ ?( F. _3 [, K    write='result.pkl',
3 }2 w) p9 v/ p$ ~) p' n. a    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',: O) H2 ]; \! `1 [/ h6 w7 L
    page=[True,'url_page.txt'],
: X) F6 M# u4 U+ v6 N& R    # bool类型,默认不清洗- g( T5 ~! g" ~- m- }6 x! T0 I/ A5 ]
    clean=True
! f1 e$ M  c& t4 G1 u. T9 N).run()
* c& E% f3 h, i. c% h4 {9 A& D  y5 h" J) @
第八种玩法:爬虫存入数据库
  v4 d9 V) ~5 g- W% ?  s. W存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。8 `9 Q* q8 Y2 e1 O

6 `. l% z! r8 s) ^& ^' q特点:0 f4 U9 e9 U: C. u5 S$ b$ r
信息存入MySQL数据库。7 |+ _/ B' S+ c' Q% h1 A
可连接docker远程数据库。; t. b' X( B; r8 U, @  L
数据库的库名可以不存在。' ]% {0 s& S5 ^; b1 y
数据库的表名可以不存在。" b' J: i) t" h. O! h
根据之前传入字典键与值参数判断表类型。- A2 {" a  D3 D% I* R1 D( S
自由建立数据表传入信息。
+ e9 U: W8 I5 P# {! i* ^' R- [5 y4 M! |4 _% |
缺点:
- f: _: q7 O6 V仅支持MySQL数据库。# {3 u3 D) l8 A

0 v: x) U7 ]0 O7 I. u- R& k:return SQL
4 D- ~- M( I* W4 f+ d9 B/ N
& J! i8 |& C3 W3 {request.parse(
. K' ]4 H) }6 q    url='https://www.douban.com/group/explore',' O, t/ v0 D: G- q  y
    Parsing = 'xpath',3 s7 m% ^' V5 a* H, `7 o7 ]
    label = {
- u* p" f1 b- h6 v        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],% k- ^% I% a, k* q$ ]+ n7 {4 `5 o
        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
- R2 X2 G  h" y/ Q# T        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]3 I/ U1 r6 Q2 B, }! x5 o) T
        },, a* ~# V- M4 y% p; I% D
    write='result.pkl',! ]5 o8 [6 |, W' l  A
    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',' N- S2 O9 r% J
    page=[True,'url_page.txt'],$ C' t* q, `' p" r
    clean=True,
' m. r$ ?0 L8 ^# x5 ]5 J    # 字典格式,
4 l0 \+ h* n, x  q( u) e4 E7 n    # host可有可无,默认localhost
: u# \! s7 \$ k# }2 q; s( C    # post可有可无,默认33060 U/ J: m4 f, l6 o
    # user可有可无,默认root
; `9 h0 [5 j; f% E. k    # password必要参数,数据库连接密码. j6 R  z! O, |, F9 ]
    # db必要参数,数据库即将存入的库名  \* f: }0 v) I2 Q$ A' z: K
    # table必要参数,数据库即将存入的表名2 J& `7 ~2 g4 Q0 j3 y
    write_SQL={
1 Y1 x2 g7 E  G  b5 }+ G        'host':'localhost',- k, o' h1 X1 A5 R: V% N& F3 l
        'post':'3306',
! D3 O7 Y  i5 }7 o; O        'user':'root',
% O% ~# `+ g+ j2 Q6 ^; f& |' F1 w        'password':'123456',4 j% r" O4 X/ K# R2 D* w
        'db':'example',  k0 \" Z" n/ H7 e, n2 Q
        'table':'example'
! i- B3 T" n# m# k6 d        }
: e! {" e1 F) O8 c    ).run()  C5 N3 W6 V& Z" m5 y

5 O5 z: ]; g2 ^# c; i$ x. `第九种玩法:重新启动爬虫" A; `+ [" j6 ~
爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。# L' h  p2 D. F; q" A0 M% H: J- a
) l  M4 j) @4 K1 w5 e
特点:, I2 O9 h3 `! C7 t
检测报错重新启动爬虫: H/ T6 `  g4 i; s' p% U9 j4 v
无需手动处理错误信息
' E' L( [8 s6 T, {2 u3 {, c. D
缺点:( h% ?. I" `4 G1 z
无法收集子线程错误。  w7 b  z' S- w, j& J
; p- w; ?7 y& }2 ?& o# X$ \
:return None. d4 {: @8 I- }' }9 |* Z

/ l8 R4 c+ U5 I% ^4 K' Arequest.parse(
; R1 j7 t) u+ j9 b        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
3 s* k) F, o0 I, A( S5 t        #login="taobao",
" U2 T. q0 m3 s        type_url = "text",
, w1 X3 X/ P3 ?! [        Parsing = 'xpath',
5 A! V% k9 O) t: a        label = {
  g& s5 _) C. N; a. v% G% G            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
* w% M% A, L+ y$ f# T1 z; J2 I            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
% d# {( }/ c% ]            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]+ M+ z( s4 `) x3 f
            },7 X2 P4 J0 z* E2 d3 \8 q
        write='result.txt',
, Q% H: @, d" U+ U7 E& O        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',2 f$ R- X$ e/ L+ h0 }9 u- h
        page=[True,"now_url.txt"],
( T) N! B: D1 ?        # texting 参数为是否启用连续爬虫3 \2 Q) \4 r+ o- k! D
        # 爬虫程序异常报错后重新启动爬虫
2 l4 h. P& {5 ]6 j        texting=True,
0 j/ ]+ n6 ?3 @- i        ###/ \0 `# m% _) J. @4 G# @9 k
        write_SQL={3 ?) c' [+ N7 M" V  F# K* U% N
            'host':'localhost',
$ @$ g4 M6 _* k+ i, j% x            'post':'3306',
6 o9 i" r5 b2 @            'user':'root',5 K3 q; w/ B' B; r
            'password':'123456',6 y; k. a3 y' e# ^. h1 J. {
            'db':'example',
( U. C# v+ q. I" J# G            'table':'example'' I% r+ k& z; }$ |
            }; ]5 g6 p: v6 B+ F, n
).run()
) W+ `; S+ l) R9 Q
+ e! z( @+ v' H( H5 n/ K% x6 a$ ?第十种玩法:多线程爬虫
9 W6 @0 i: K$ |特点:& I0 u# o4 K1 F, }! O" Y, L. S# ?. L% [9 H
爬虫速度加快,3 b9 M  }9 G) j. k  W5 v
更好的利用了线程。( Z0 q, Q- C: q" b/ U3 N. D
4 o' t; w. |5 w! ^3 f, Z
缺点:暂无
, G) O/ }; X' r& F4 g1 ]6 v$ v  S, v
:return None2 L0 W; w% g. e' W8 l

9 C9 i7 N9 \. F, @% Erequest.parse(
( n6 h, `$ T; Q+ h        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],( \9 |0 N# P, M& P8 f
        #login="taobao",+ |! e+ y7 T& V( M5 V% ^6 r2 o
        type_url = "text",
' i4 b9 N" b6 R2 h" p        Parsing = 'xpath',
/ o; L8 f' }6 m: U        label = {
- V# a; _# G; _2 q1 \/ M            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
! [& o. o1 Y- {" p! m- @            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
3 l0 T* e/ H( i" C/ T            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
' l% m8 a* d4 J; Y& _& U            },2 {+ W' T8 {( \  B
        write='result.txt',+ A2 p; b  B. W% F+ i! J
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
+ o# z4 {: w$ y3 r% Z4 y% @        page=[True,"now_url.txt"],' w2 b/ U0 l  z" Y
        #clean=True,
/ v; t; i# j! ^/ e        texting=True,
5 D+ P% y% L. y& N3 ~3 M        # status="threads" 启用多线程爬虫
# h4 l0 H; p$ {0 }        # Thread_num 为线程数目,默认为1 单线程
( x/ L, P: Z" j8 V' `1 D, Q        status="threads",2 Q3 e: G8 d9 Y+ T5 k$ T! N
        Thread_num=3,8 F) O2 w# |. B0 N- t/ e8 t
        ###
1 }$ f! W3 L1 i" }: q4 f9 S        write_SQL={9 ^+ ]1 n0 Z* s/ ?
            'host':'localhost',. g0 X8 ~' n( I: x5 z1 y$ n- i
            'post':'3306',
) \6 f( a' j) W            'user':'root',
5 t0 Y- K+ d! k3 R! S4 X            'password':'123456',
2 C1 x$ w) F: L* g2 q  L  p/ Z+ p            'db':'example',7 o- b. P$ _3 w4 ^! c4 X
            'table':'example'
: n+ U+ ]  l" a1 j* `            }' t* n: A/ H: l
).run()
9 R. c5 K4 D' ^4 H! U( b# k' e; X1 u7 G. s( I
第十一种玩法:多进程爬虫
* r. e. H% |* j特点:* E/ \  e8 m7 F1 o& B, ]# E( t
爬虫速度加快,
: `& N: x2 i% Q1 l更好的利用了进程。
' d% T$ t) Y* c* r- ]; V7 i' e3 t" R2 x! y8 |( c
缺点:暂无2 t! k# L6 N2 N2 x/ G# g
7 S! L) D" y- P/ B( |
:return None$ {0 W' s# ^5 Q* B, C4 g! u+ a
2 U& R# ~# x# l, M2 c
from simple_crawl import request0 l9 \% w% X1 ~. f
request.parse(8 Z/ a/ ^' M0 ?" Y! A
        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)]," M- O) ?  N+ d; n, s
        #login="taobao",
; E- \% n3 q, G& r& _6 P        type_url = "text",
1 C# o+ R4 X/ y0 P# u        Parsing = 'xpath',
! W- h+ j* t4 f        label = {. B0 H' V: a8 L7 |5 k
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
, H$ c2 {8 D" v4 Y/ @8 M/ p: `  m            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
2 a; `' G3 U8 z            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
: T. c! t* [/ r" l            },
9 y/ I+ V0 Q$ L0 l) q# d0 w) f        write='result.txt',4 O! B' Q& i% x* W* Q7 g$ f( i
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
* y1 @% A& ^( s( u, A* C* r0 h        page=[True,"now_url.txt"],% A+ V) d7 ?$ V8 \- G- @
        #clean=True,
% c7 O9 y, a$ r0 l        texting=True,
( E  }$ X4 a+ C& ^" Y        # status="multiprocessing" 启用多进程爬虫) y; e4 i# X% p4 Z
        # cpu_count 为启动代码核心数,默认为系统核数一半
2 T4 d* P9 e' o8 W        status="multiprocessing",
+ u1 o' w) _8 n1 L. J) E" R# Q4 e        cpu_count=2,6 E8 g! \2 f! h8 r0 N3 x
        ###( t5 U; r! f" J. o/ K% H7 y! Z' C
        write_SQL={- R, H" C2 t1 j1 o; v3 ?# X
            'host':'localhost',
3 k" K5 B2 B: v- A, U- X/ b            'post':'3306',) H3 v1 @' Y2 E# e8 a  y
            'user':'root',9 l: W. ^$ ]' U9 @- Q. z/ {8 G
            'password':'123456',
1 t3 F3 ]* j) j. A! G( t$ w5 I            'db':'example',
1 O  S& S( ~9 Z5 j! P, {- N3 m" }            'table':'example'
+ r- M* h6 w- S* }( e3 o& y; c            }2 ~4 E8 b* R9 T' l! @
).run()
6 W& L6 n" @# B$ G% w; B2 \! l4 _4 T1 k( M  V1 g) P
第十二种玩法:异步多线程爬虫
7 x$ v" O0 ^: P9 O; u特点:  W* ~% R& S  k4 d* \7 C
爬虫速度加快,' W6 J  c2 n- d1 E0 x. s' f
异步使得爬虫无等待时间,8 @" a( Y# R3 @! X
同时使用多线程速度明显加快。
% z: I. [. {1 z9 ]* y( s9 X+ K9 F9 a$ a' l( c" Z
缺点:暂无
) q* a; Z* @' ~9 @* y! k
; H5 a0 w/ Q# z: o:return None6 N! E- p* a' i( t, H4 Q( }4 y7 F
; R1 @) w8 ~8 P
from simple_crawl import request( o3 X4 j* e6 |! [. ~3 V
request.parse(0 r$ Z0 M/ P% R7 A
        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
3 n+ Q7 R& U7 ]* x        #login="taobao",
5 r$ H7 E: q: e8 ?: E        type_url = "text",4 k+ X1 b. V& \2 E7 V
        Parsing = 'xpath',
- |. ^' J+ E& [- m$ B; M        label = {2 M/ S, T3 W7 w* @% R) w5 ]
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],/ U  c% s) }+ H
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],( O3 t* ?) P3 J' R' W0 @$ e1 i
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]( m! ~8 L  T9 p" K
            },  U5 w, {2 F7 C3 e
        write='result.txt',
4 T  V) Z4 r: y& g7 C9 S; I& ]        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
: F" y- a) {: B( |) w; H, ~) `        page=[True,"now_url.txt"],1 R. y# ?4 t" U$ F! g5 Y" c
        #clean=True,
& m+ x0 ^2 }8 A) X        texting=True,
$ z. u5 b! l# Z  d3 f% f" R        # sem 参数为异步引擎数目,默认为5
5 `2 z% p; s0 g% }* o$ q, @$ g        # 其他参数同上9 U! V; e- i1 k5 Y. b7 u: m* L
        status="aiohttp",% k$ J% o9 F6 T3 @# Z) }8 B( [
        Thread_num=3,, P- V) |* L2 P
        sem=5,
6 w; D6 s- H$ A3 ^        ###0 n8 H" `1 F) l3 ~$ G0 q
        write_SQL={
4 J+ K4 F% @2 i/ A( q0 B' j5 X; o            'host':'localhost',
9 U1 {; }' R$ _7 Z            'post':'3306',! A$ f6 m9 G3 g1 {
            'user':'root',
5 h5 r0 b, X2 y  V: X- Q            'password':'123456',
! R% r: d* E0 Y. g            'db':'example',
% }2 g/ U) i7 L" r5 B* K            'table':'example'
" w3 U# l7 ]7 v, c6 Q            }
& T4 K( n5 b0 O).run()
# I% D+ t) Z9 i& F0 j; Z/ s, H
. D9 {* e6 P* x% q! C第十三种玩法:异步多进程爬虫
3 a6 E0 R$ f! W+ D' o# O2 R  y特点:
6 E* r9 ?6 ?3 O' Z2 @0 k* x* T爬虫速度加快,: ~' t- t: `7 @% @8 Z; q1 O* q/ k
异步使得爬虫无等待时间,
* v0 x1 k) P7 c3 w  J, D同时使用多进程速度明显加快。
5 p2 j8 t' S) U: n
  y# s- b9 G. H' S4 t4 W缺点:暂无
4 I9 Y3 w8 I/ S- n4 R1 r& g3 ?. n
:return None) m. d* d; Y4 ]) D, ]! E4 i

- ?8 N: U$ f, h( j+ h- nfrom simple_crawl import request, G6 h& |' P: R& T
request.parse(2 \' W! X4 ?6 j% M6 u
        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
+ e. g$ h- A- y1 |        #login="taobao",' j$ W( I8 _: F) c* l" t
        type_url = "text",  ?! D; i$ I7 b/ h+ G) M! s$ v: L
        Parsing = 'xpath',6 z; I) M% M1 v
        label = {# R/ U, r, I, i' m$ t
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
) T- A( K2 X6 \9 `; o+ G- @            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
% m/ f& H( e* |4 B) x; l            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]( R1 @- j2 e/ G. g: G
            },& P4 Q$ \* [' s: N4 B
        write='result.txt',8 @& a( N: _1 T! `
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',- r, p: C' s! [6 j* D) a1 y
        page=[True,"now_url.txt"],+ k0 G: g8 ~: \% z
        #clean=True,+ m5 a8 G; O; {3 ~2 G; `' I
        texting=True,
" q' @) f: n- Z! Q" i        # 参数如上/ M" d& w8 o# Y# s3 p( H0 \1 P) H
        status="between",
( K7 v+ }* l: C: X: T        cpu_count=1,
4 {+ U. ~0 a+ ~" z$ [# \! d        sem=5,
7 e& d9 I, F* w        ###* V; O6 I5 S7 u5 K
        write_SQL={. {; l8 `/ k6 ?3 _! q, v
            'host':'localhost',1 g7 c4 S* D& g  ]& ]2 k, }
            'post':'3306',
- X9 r0 B& L, ]! R: N$ c! E& c            'user':'root',
" Z& n/ C. j8 p, n' X' {# u: |  R% l            'password':'123456',3 n3 m' a# v) z4 H$ u' n5 h
            'db':'example',( f8 c! T. m2 ?, Q
            'table':'example'
. g* a- \3 e. }& m+ F            }! Q- A6 D8 v$ o
).run()
) N6 \/ V9 p* R. X( W) Y  C: e2 j# A' l! Q, [, W) J/ q
+ D2 F% c5 Q8 N
功能介绍完毕🤞
  r+ }, V. N. y: [" A最后还是希望你们能给我点一波小小的关注。
! `( M3 |7 n0 S; y! M* g0 R5 X奉上自己诚挚的爱心💖* C; V- Z# I  i0 l9 \
————————————————
( |9 ?+ m% ~  D& A版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。" C+ z8 a/ w  g* b: I5 O, F
原文链接:https://blog.csdn.net/qq_45414559/article/details/106005684
" u% Y3 @0 Q. e$ C4 p$ W% j4 m9 Q$ ~1 ]3 E5 c
+ o6 F8 m8 m5 y6 f3 S

作者: 738391227    时间: 2022-2-19 15:34
666666666666666666666666666667 n& H' Y7 S0 L) c  l: Y3 x/ e





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5