QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5540|回复: 1
打印 上一主题 下一主题

[个人总经验] Python爬虫仅需一行代码----crawl第三方库

[复制链接]
字体大小: 正常 放大

326

主题

32

听众

1万

积分

  • TA的每日心情
    慵懒
    2020-7-12 09:52
  • 签到天数: 116 天

    [LV.6]常住居民II

    管理员

    群组2018教师培训(呼和浩

    群组2017-05-04 量化投资实

    群组2017“草原杯”夏令营

    群组2018美赛冲刺培训

    群组2017 田老师国赛冲刺课

    跳转到指定楼层
    1#
    发表于 2020-6-2 16:00 |只看该作者 |正序浏览
    |招呼Ta 关注Ta
    仅需一行代码写爬虫–simple_crawl
    ! K& N6 O) K4 a7 a+ Bsimple_crawl
    / k! x7 Q  \9 w! X仅需一行代码即可达到爬虫效果* N8 ]  K9 o  N
    项目地址(欢迎star):https://github.com/Amiee-well/crawl
    5 c3 ]* x' Y" P( j! n使用方法3 y! a% u+ r# N* n8 B" z' D
    pip install simple_crawl. d$ F. j3 [* h# B' A- c

    ( ?, j8 `7 T: B7 h4 C* I9 p### 以下源代码为简单介绍,详细功能介绍再源代码之下( }* F/ `) E. d& k/ e* `# c
    from simple_crawl import request
    ! e/ k" [- k. `' y. f0 j' rrequest.parse(
    , V7 Z6 y2 x0 x: K        # status 参数为运行状态,支持单线程多线程多进程协程以及联合3 d4 i$ I7 {3 s, T# J3 w, P6 f3 F
            status="aiohttp",! E% t, b" T( z4 {/ ~: v- q
            # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式% @: n0 \! Q7 z- J' x
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],3 ]' H; |, [0 K& k+ I
            # login 参数为获取登陆信息,如淘宝等网址需要登陆信息% o; t! X, k5 @: C
        #login="taobao",. I6 N/ a  h+ S
        # type_url 参数为返回源代码格式,支持text和json,默认返回text
    9 ~( u4 P0 |" Q2 }8 K6 A, |0 ^    type_url = "text",
    ; f, ]) g0 J- l    # Parsing 参数为解析方法,支持re、xpath和beautifulsoup
    # Q8 M  t0 q* W& x& o- g# N    Parsing = 'xpath',/ P0 k% U8 w% W* T/ Z. W
        # label 参数为爬虫解析过程,字典格式,详情见下方
      {& X0 W7 i7 {: |! s    label = {; H+ b1 y# f7 ]6 I
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    7 `7 w1 Y% x/ h            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],% ~7 ^, d4 z1 l3 v8 }; O1 _- t
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]+ d. J& q% H2 p% F7 v- {
         },! t0 H: U6 s2 l+ f
         # write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱* Z, T: B7 ]9 B# v
         write='result.txt',, {/ l* }* I" T* `4 ~
         # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫
    6 U$ _" Q% [8 m2 J0 s, ~: e     next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    ) W, z6 ]% v+ w: P4 ^9 g     # page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫! n  U/ A, s- \. J3 k) O
         page=[True,"now_url.txt"],4 }4 s7 h( C6 c8 \3 {; ~! R
         # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息6 Y. c2 h7 ^, i
         #clean=True,
    1 K2 m- A% r4 `4 Q4 T! m, ?     # texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序  W! }7 h5 G' [3 {) `1 u# I% x
         texting=True,: w) r7 p0 z& l% v- `; k4 f8 E
         # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态: E2 _4 B& T5 Q1 g) N( i
         Thread_num=3,- N5 Q3 q7 U: Z8 O6 \+ v
         # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态  x; L. m3 R( }, J8 y. Z
         cpu_count=1,
    # m8 c0 [& ~" e/ h     # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态& W. K7 X* }, I( v# I
         sem=5,3 g0 p' W2 E5 y* D. Y
         # write_SQL 为是否写入数据库,默认否9 M2 ^& f! `  I6 g  q" I! H( J2 ]" b
         # host 参数默认localhost' x- f; Z# G( K7 h# w9 @
         # post 参数默认3306* h' A+ [% W/ l% L0 N0 p9 j
         # user 参数默认root/ D! b7 i. T' b( L% J
         # password 参数必填,必须正确
    5 j8 Z' w; @" `( b- Z     # db 参数为即将存入的数据库名,若不存在自动创建
    $ ]. S/ ~) j9 G: i8 I/ F     # table 参数为即将存入的数据表名,若不存在自动创建
    ; Y* M9 g/ |& k( a: n$ Z& F7 q1 {     write_SQL={$ d1 r$ ?% U0 H# D/ r
             'host':'localhost',' P9 x7 y. b% M6 F4 h
             'post':'3306',
    0 `; B% O* Q# ^* r6 s6 }         'user':'root',5 ?& B  ]$ ]/ a
             'password':'123456',
    / i% @# d# e$ E6 t* z! _; z" f3 e         'db':'example',
    + ?( @# p1 `" q0 `; A& N, s         'table':'example'
    8 E4 w4 u" C# P4 Y. C      }$ U5 F+ b2 M0 E1 [/ U. e- p. o
    ).run()" Y7 u3 A) k1 h! m/ c( P5 L
    / U/ R) N( a7 b: J( J! |! I
    介绍一下crawl参数设置:) l( B; W* T8 x0 H

    ) {: p# ]3 }' Y/ F& V'''
    9 A# \: s2 s6 t% g" l: }/ b$ b单行代码爬虫程序执行
    / o5 i: ?' w" g# m) w" }:param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档
    - H  ]8 L) A+ j8 U1 q/ h$ S# Z:param url:即将请求的url地址,仅支持get请求
    . [3 \$ n2 I/ }9 K, w:param type_url:请求url后返回格式,支持text和json格式返回9 T* i4 a( {( m) s  ?- E
    :param Thread_num:即将启动多线程个数,默认为1单线程
      ?- P. ]' {! X+ i  c- a6 |:param sem:协程信号量,控制协程数,防止爬的过快,默认为5
    / I( u% `3 l- r  B' Z:param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半& v5 |3 F1 j$ p! c# k8 r6 f. D
    :param login:模拟网站登陆,保存登陆信息
    2 B6 g! }; J2 b! `9 I:param Parsing:爬虫方式,支持re、xpath以及bs4方法/ s* }; [  t$ N1 U
    :param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,
    0 i, E) l8 }: ~/ R% }0 X                       多次报错结束程序,默认否. x7 b1 j9 O- f% T5 }5 n: E1 i  V
    :param label:选择器内容,字典格式保存,
    6 k& z: f0 t' F5 Q                     字典值为列表格式,第一个参数为选择器,第二个参数为转换类型6 {9 K" ]6 r/ E$ N" }
                         第一个参数必填,第二个参数默认str类型
    2 B, x2 e" L# Z0 e( O1 _! g$ _:param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否
    ! X: y* e, t, @+ I9 g: P:param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫
    9 O6 M0 w7 o7 v5 S: K* F$ ^:param page:是否选择断续笔记接手下次爬虫处理,默认否
    7 ]- X/ A0 `' `7 v7 g1 `% _:param clean:是否进行简单类型数据清洗,默认否! @+ }. U0 g0 G/ K- t- M5 K6 T: M
    :param write_sql:是否写入数据库,默认否4 W8 W. j% N9 ^
                             'host'默认为'localhost','post'默认'3306','user'默认'root',
    1 {* ?5 a/ O5 f$ n) P5 H                         'password':'密码','db':'数据库','table':'数据表',$ Z+ U2 `  x4 I- ~$ c1 _
                             检测库是否存在,若不存在则创建,若存在则直接插入,
    5 t% t( W6 X+ ]  G                         检测表是否存在,若不存在则创建,若存在则直接插入2 u: q2 Z& F5 ?) l
    :return True
    9 n# Q0 M3 Y6 n- f5 v" U'''5 u3 J2 [' `' l9 G8 C
    介绍玩法
    ' H& _9 n! |2 \- x接下来介绍的均为调用第三方库的情况下运行:
      G! K! [, d4 F$ K1 z
    / Y  A2 O$ R( U6 c" gfrom simple_crawl import request
    9 Z* B# v4 q8 \第一种玩法:输出源代码3 n; y' q4 _% e  B2 ?! B" L
    调用requests库进行源代码请求。0 ~% Y. k- m. s

    ! d! F9 Q" I, ]( n% Y特点:/ Y% Z- ~% ~5 q6 R
    请求失败则调用ip池处理重新请求访问,
    1 t- [0 l' {* `: S" X出现五次失败默认网址输入错误。
    7 v6 [! I: v3 T1 w  U3 b* a3 [% x支持text以及json字符串返回。默认text。
    & S- Z4 q+ u1 t5 p( g6 d1 q% w( a5 g% g! d! u: q$ ^" H5 R
    缺点:
      k- G4 w) P4 F2 M3 m- C7 p暂时只能进行get请求,不支持post访问' ^% i, _, [3 @+ E

    : j  e/ C* j) {+ o9 h* g9 @: [! B:return text or json- G; W% B" |6 e$ h( ?
    ' R+ {2 [( x  B
    request.parse(; ~/ D. I. y3 M# K9 c# D9 i
            url = "https://www.douban.com/group/explore",3 L. k* W) N) M, b- a
            type_url = "text"
    7 E5 T# l2 Y. {, b).run()
    0 \* O% q' [) v% D, V& e+ `$ x# return text
    6 H: z+ `. Z( R- a, n8 b  o
    3 U8 @# V6 U- S第二种玩法:模拟网站登陆并保存信息* P1 E5 y9 a6 G" h0 B! ]
    调用DecryptLogin库请求登陆访问。
    1 t2 O% c  w* Y1 t) S9 d+ x
    & J" ~  M: H# r$ V% I8 V' R2 Z* Ops:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源% a5 L% J) [, _; h; v/ ]% v
    在此放出文档地址
    $ o9 S' v" R4 fDecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/# K4 `6 k- k% |8 t% x2 W9 Q
    $ {* i3 {6 B0 i
    特点:7 \: N5 J! `2 k
    将DecryptLogin库中二维码继承到此库(非二次开发)
    ! g0 k; v) s2 H1 J7 u支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆)
    0 S& ?5 ]# H" @2 |# }保存session.pkl信息到本地方便下次登陆运行! u* d5 W, n  I, l7 O
    ' e: g' g$ o' _
    缺点:8 z1 x& M- ?' C6 n' ~) e: ~
    session.pkl登陆信息过时无法自动删除。
    ' `+ E& b6 R4 e- m导致下次登陆疑似cookie无法正常登陆。* y2 U0 h$ A' E" B- x

    * `  ?! o) P# W* X1 n, q: R1 \1 S; V:return session6 U$ z( f% u6 h3 P* `

    6 {- M6 m  M2 |- X. T' M, Xrequest.parse(' a0 _# Y* H/ _1 E' B
            # 臭不要脸的推广一下我的店铺
    5 s# E2 k& l) A5 R% ?# y9 o+ ]        url="https://shop574805287.taobao.com/",
    * ^8 _# F( T5 C( X& ~        login="taobao"
    9 m( A0 U2 }* _! n4 y+ k! M).run()
    / O, ^# r1 {8 t$ Y2 p' b: g# return text3 p: X3 U0 {) D. Q8 S( G
    , _% ]% g7 r- L" I2 V- l5 H
    第三种玩法:爬取网站信息9 b; y; d: Y% L* ]  b2 ~
    爬虫库自然少不了爬虫的过程
    # F- D; Q# H2 ]4 J0 Z- @
    - ~, i6 r/ j5 m% G3 U  R$ h- U- H. f特点:- j) U: X2 R+ }. x" Z7 x
    支持re库,xpath解析以及bs4选择器。
    * S# z% |+ }9 B! R6 N爬取方法为字典格式。单方面输出。, N: W' |0 j; c6 d3 r8 Y& P: g
    字典键为保存的字段名称。
    3 G- {9 C, z) l6 N  V字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。
    - k# ^) G: o8 V$ [6 U
    5 d/ p) L; u& G! k: X缺点:暂无(等待小伙伴们发现)
    * W! p* _$ t; c  F7 Y# j
    # I( h1 u. y% n: r1 ]7 ^! `- h:return reptile_results
    5 s: X+ b% m+ P8 v; |
    ; W1 g5 r8 N1 arequest.parse(
    ! ?! c( }6 x$ S0 g        url='https://www.douban.com/group/explore',) y3 x* i, Z( Q$ E$ H
            # 字符串格式,选择器方法。
    2 i) E/ [% v9 l1 y. J9 R/ k! ^    Parsing = 'xpath',) r( {+ M3 b) \. i4 M6 j& M: s
        # 字典格式,参数如上。
    ) l) x# f2 C7 O+ Y    label = {
    9 \* N: E! V2 o7 }- T( _) n, t        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],7 H7 q% c$ K  @8 p- X1 W1 k7 u
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    5 s2 z' x3 Z, V/ J4 Y' {2 w  |        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    , s$ ]3 m# \; q( H        }. L, y! a7 H$ o& t* y) c: k
    ).run(): a: t( u: {' c9 G' Q  a% ^  y3 C
    # return reptile_results(list)* a+ ?* {# K2 m+ a& v
    $ b8 x1 i6 h* Y2 t  m
    第四种玩法:自由保存信息* x$ B; b. a2 z# A
    目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。
      o5 ^$ k) \* [$ R8 C5 C9 S
    . P% N4 F* S/ L特点:
    ( ?" M: [; F8 Z& D; r8 X4 y/ X! M写入文件均为数据格式传入文件。
      _* W; {1 \/ G* \( C- t且输入格式规范方便阅读and省事。" H# y  I( y% C7 A* ~
    7 V+ }: g' u) w; U9 Z3 ~- B
    缺点:
    ) H9 M6 ?9 e2 `# @保存格式仅四种," O7 f: O+ k* t# A0 S7 b
    不方便用户之后读写操作。
    5 _' n, C) }: V8 b$ V$ l& i9 N" c7 Z( E0 p1 b( }& c$ P
    :return file
    * p0 g9 I, f+ ~8 w& t
    & H4 U1 j4 H" _9 ?& @request.parse(
    + s2 X* s- L* W' ?- f7 I        url='https://www.douban.com/group/explore',* v/ r/ F6 f& \4 a. g1 I# \
        Parsing = 'xpath',5 z9 N7 n" g: j1 |  k
        label = {
    ; M( w6 |: t. W% a. ~        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    ' j: n6 h$ W% f! U( U' Q        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],0 S* X% t: `+ r3 a- l5 \
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    : K9 [" ], ~2 W# C) Y+ h        },/ P+ M0 h7 |2 y# m, s" M- \
        # 字符串格式,具体保存位置填写
      g2 ^4 ^) \5 w4 y    write='result.pkl'
    # W, V1 Z" z+ \( y8 |* \% Q).run()
    8 ]' U7 A. P/ N% t" B) G+ O/ k7 L5 Z# return file
    & [# E0 Y8 R3 s+ }
    " g5 M) J$ Q9 `- A# C, V* _. P& L1 ?第五种玩法:读取下一页 url 地址继续爬虫8 o9 p: |, E1 Y$ ?
    这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~/ d5 R. |+ w" \' ^1 U  J- G
    / z& G1 J/ e6 F) R% B* K
    特点:9 B1 T* h6 a! s& Y+ L
    继承之前的Parsing参数选择器选择方法。" `- [) i8 r& C7 y7 B' B
    在这里可读取到解析后的下一页 url 网址。7 P% z9 R2 j! B
    方可继续进行爬虫处理。方便用户使用。
    " F0 Y, C! |9 |! J/ [( g( U' ~: N  x
    $ }0 o5 J. g3 Y缺点:/ O; J& U$ D$ \+ T0 x( x: m
    若爬虫时下一页 url 地址改变,便结束爬虫。1 x0 z& D+ W: k# t& \) @1 f5 r2 n) }
    只能爬取所给 url 地址中的信息。3 I/ s& }3 @+ I( D( V
    无法进行某一界面的多个网页爬取返回。: x6 N' l' C. h$ s7 d- y
    造成访问页面单一流失。
    + |! a, X' f, s7 I- A" q
    & {& s/ s/ b) ]- P2 c:return None
    1 m- J# k# n0 K4 ~: N  Y* t- U2 Q7 Z( ?; l
    request.parse(
      Z3 u. G# G; C4 k  O3 H        url='https://www.douban.com/group/explore',8 P, I" I; }9 r3 v3 B
        Parsing = 'xpath',, F: O3 N; K3 m
        label = {, [1 A; Y0 h) i( e% q
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],/ y3 z2 j0 {' }! i
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],9 m8 G) F  b/ A" b* V# d
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]6 _7 n& U3 d0 _) m+ q
            },6 C' t" @# y, [( Z/ ^) U, Z
        write='result.pkl',2 L# \; G/ I& J" y0 K1 D
        # 字符串格式,根据Parsing方法继续请求下一页a中href
    + k  ]( r# d( D( Z$ k: N7 U    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',7 @7 W9 I: K) x4 I" q/ {6 O7 ?
    ).run()
    . P8 I& W) }& a% ~2 Q0 `( x/ ]# return None / d" o3 ~) }2 k) }' a
    % v9 D) ~* V$ b3 U6 T! a, \
    第六种玩法:爬虫网页保存* v: b. H8 g7 `8 p, m$ s/ u2 k% r% w
    听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!1 @% N) O- h; V# ~0 P" C" i

    ' [, `  X( R: A: x7 }特点:
    / x9 Z; p5 b0 h2 Z0 G持续输出断续笔记。1 m& G' d5 q6 R9 a
    将此次爬虫的 url 地址保存到一个文本文档内部。' ~9 ~4 @5 y/ r
    下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。& ~% Q' g3 I. O# K2 Y
    . N7 E2 X6 _) o$ Z% R8 F$ k* h# q
    缺点:
    - b" p" X. Q  `) Z9 U; K; O, j读取内容不单一。
    $ K% G8 y+ d$ C导致下次爬虫无法正确读取上次爬虫留下的痕迹。  F" G: y. w$ v: a& \. a5 L

    5 m6 l& `# S+ Y5 `:return url_file
    # e0 O3 s; W1 g& Z& Y: Z( P/ e9 B/ L6 n5 G0 \& `) T0 k0 }3 H( m( N. ~
    request.parse(
    ' c; T! V" y  c    url='https://www.douban.com/group/explore',
    ' y2 Z  w. h9 T, I5 W) J    type_url='text',# a1 E) h# K0 ]8 c) D6 z; h1 O" H- e
        #login='taobao',
    $ ], @/ j; ]# i0 q7 j6 P1 ~) N    Parsing = 'xpath',4 j) ^0 P/ U! {& d* Y% k5 q
        label = {
    " \8 X* `  a: b: G5 J+ h. X3 ^& G        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    6 O8 ~1 X) {3 b9 G' D5 I  @        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    5 v5 m, K! L. f3 e4 d        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]9 u9 [( k& \" y& B: m
            },9 K! B5 _. F" g+ w) n
        write='result.pkl',8 E" y5 }2 }; p$ `" ?9 R
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    7 c5 L1 e  j% g$ s" V- e    # 第一个参数为是否需要断续笔记。! o5 Q! f5 X& `9 M$ {
        # 第二个参数为断续笔记保存位置。
    ; e* ?2 t, T9 \2 x8 p8 M    page=[True,'url_page.txt']
    9 R/ B* W. C5 _- S9 y).run(), D! i1 j2 q' Z$ B7 r
    # return url_file# Q$ w9 _, d8 T2 e3 K

    0 z/ H" B2 q0 C2 a9 d6 l第七种玩法:简单数据清洗* c' V8 k- M% O+ y$ ^7 m
    数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。
    7 }5 ~9 {3 X' U2 t: }* y. ^' k5 J7 L( J8 {( s  t8 Q7 l" a
    特点:1 @3 r7 d5 t9 B3 [% x
    本人曾写过一个底层数据清洗。2 [  z3 m3 e* T/ d, ^
    能将列表格式数据进行归分清洗。  P' U# v2 l2 ~  U8 H# x8 M; e- r
    主要内容请参考另一篇文章
    * d1 L: _9 Y0 A& ~0 M( U# i; s  g如下连接:数据清洗' Y/ A+ B' g' J' U( q' z: o
    " e* C* K( N; r- R1 c! K
    缺点:
    * M6 q1 e0 v4 B* A4 ?+ G) w6 l; w3 T数据清洗格式简单。
    1 J. j9 l, K: m" `$ Y数据清洗内容单一。, C! k4 O! N) H& _! I: ?
    无法完全做到绝对清洗。- v- q  v/ E* L. S8 T
    有待改善。
    ! v' j) |8 M4 S' `7 p+ [6 I1 D5 M+ f5 Y) `7 x3 u1 U
    :return keyword_list, value_list
    ( U( W+ f0 e+ S5 N- h) C5 v+ N- a
    $ T4 M1 b  v  |/ W, d1 jrequest.parse(. D  d8 p* d/ }# R" K
        url='https://www.douban.com/group/explore',8 W1 X6 r  y2 y" M! ?
        Parsing = 'xpath',9 c- [* R% Z2 P, w& A$ _
        label = {
      G2 L4 m6 G1 q  m# D; {5 {        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],) L3 X& Z" W8 k& M$ l
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    # {. b. B* P  l1 J        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    : O8 E* G2 b/ K) D8 o3 X# Z        },+ @) y$ c# G; M3 P
        write='result.pkl',( D3 N! `0 {% G9 \. ~# d) v! Y6 B
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',- V! N6 f1 u9 z( ~5 ?6 J
        page=[True,'url_page.txt'],1 T: C7 W" F2 g! G2 O9 B
        # bool类型,默认不清洗5 X+ B) H! g$ k& v+ S$ o
        clean=True* f2 Y/ T1 H2 B0 \* h5 t* b5 D
    ).run()3 ^4 q9 @7 l- u& y8 ^' t! I

    1 U5 C7 K* t8 @: q- H第八种玩法:爬虫存入数据库4 k' a' ~5 L. `; x2 w/ g" a: x- R
    存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。
    6 v2 v; c$ M( R0 z$ k
    : k& G, V4 h( }5 ~* f0 A2 t特点:( P. x9 @  Q, \% d( ?
    信息存入MySQL数据库。3 p# Z" L( U! F! K" X  l
    可连接docker远程数据库。/ }$ ?3 y* y- ^# A' ^) x
    数据库的库名可以不存在。
    8 m5 Q; b) ~& v数据库的表名可以不存在。
    : Y: J! W* H4 F, e( }$ g根据之前传入字典键与值参数判断表类型。
    2 [) V0 q: Y6 Z& t  P6 T自由建立数据表传入信息。
    ( r! {3 l& X4 I! p" h4 |
    . P6 z8 c5 M) m0 n9 e2 k缺点:. b" I$ d7 c6 ?8 y+ q
    仅支持MySQL数据库。
    6 l/ ~+ b/ \5 }" u  z, e; S
    $ y; m9 f- F/ p$ T4 J7 x9 J2 d:return SQL9 t% Y1 Q2 ?5 [0 P  A( c* U

    5 J, l2 U; ^9 a+ ]request.parse(
    + E4 q1 }! R: S' R( @' J# h    url='https://www.douban.com/group/explore',
    * b7 C9 `) b3 L9 M6 U    Parsing = 'xpath',
    6 P% Z& N% _! z, F. S    label = {  z- z* \5 v8 j  c9 ?1 S
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    : A% o' z% z% Z9 k- ~% q& k        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    5 Z  P8 I; h( o. l$ i! K  z$ f        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    3 V) X, h- b) j7 I/ W' q4 ?        },8 Q  N& X! A1 W
        write='result.pkl',3 O( A; u' _& y7 ~/ D; {
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',  A5 H, j0 d5 C( A  x
        page=[True,'url_page.txt'],
    2 E* `+ s# U: F4 W4 t* ]; u    clean=True,
    6 r/ m# V7 U$ V/ \    # 字典格式,% X( R9 e  s/ _7 S+ ^
        # host可有可无,默认localhost1 B8 P& O+ v1 y' b1 d
        # post可有可无,默认3306
    ; n: T8 s4 g2 }1 M    # user可有可无,默认root, i' W$ v; C0 I  v1 u7 u% D
        # password必要参数,数据库连接密码
    . I1 I' a) v* G9 k% {    # db必要参数,数据库即将存入的库名" @3 J8 |! K6 a+ D: H
        # table必要参数,数据库即将存入的表名
    4 Z. Y9 l2 A5 a+ c( X+ I- u9 E1 c    write_SQL={5 E# O! G7 T! z: X- t1 g0 R$ o
            'host':'localhost',* n' Z, W# ^0 ^% S2 _. r5 q
            'post':'3306',
    : x/ K% ?$ W8 F1 m1 [* W        'user':'root',$ D9 d3 {; i" @: u8 o$ x
            'password':'123456',
    8 p4 i) D9 D" o  N7 l  u1 i' ~8 m        'db':'example',0 I+ v, W/ ]' f3 ^2 M
            'table':'example'
    ! e4 |1 ~0 g5 \; J; Q( I8 G        }; C% m8 H+ @% V' j+ V; }" @
        ).run()# k5 h6 S  H5 n1 Z9 T/ P
    , K1 X4 B+ r' @- y
    第九种玩法:重新启动爬虫' Z. c9 v+ Q4 `
    爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。9 F1 A4 Y4 S1 t1 U- W
    ( T+ Y9 A( F/ S) q5 z. w; j8 a% b5 {
    特点:
    + C, C+ J' M, z" `$ k: z检测报错重新启动爬虫$ o+ F  P# r. s6 N! W
    无需手动处理错误信息. }3 C+ X$ y& M

    4 ]  }" F$ ?6 ?7 w缺点:7 D. H; J- ]' r4 S! T1 r$ f3 F
    无法收集子线程错误。
    6 d- ?) |* a7 C& z5 n1 N' Y8 o& t" i3 |7 i$ e, i: {2 ^( x
    :return None. |/ v9 ]% q1 s) E" U* F% n
      E2 K( m' P' F4 ~" T
    request.parse(
    - S, @3 C% C% B" t8 Z! a        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],* E0 V- H" Q/ X) P7 X8 L% `
            #login="taobao",+ l8 t# H5 s) {% l6 l  p  k3 m. x
            type_url = "text",
    . p! m" m5 u/ |7 T  L0 y" O( a        Parsing = 'xpath',( A6 R4 K, t3 j# s9 V
            label = {9 _0 h3 n; Q; `6 R3 Q0 u5 w
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    4 I! [/ o5 ?6 p; V# F) n            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],9 Y) R1 ~2 c7 B: E& I. t$ I
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
      C1 @/ |' {; m  g$ ^9 y4 C0 n            },
    $ X3 _- U* M' g( P# o# M        write='result.txt',
    ' b2 T- {$ l1 ^$ h, ?7 \! A        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href'," h1 w, c0 ~3 o. K, z0 l
            page=[True,"now_url.txt"],
    / E5 J  ?% e0 q. ?  I% f9 Y        # texting 参数为是否启用连续爬虫- ~' x' j) }- i4 k/ s
            # 爬虫程序异常报错后重新启动爬虫9 Y" F/ c" C: y
            texting=True,: ^: T# k" B, {
            ###
    6 M4 M% J' v* ]$ p9 G# x        write_SQL={
    8 F% X# K3 U. n5 e            'host':'localhost',
    % |. _# k# }2 t6 A2 ?            'post':'3306',
    * A/ ?: `9 ]$ B" w4 I7 C' _            'user':'root',
    - j! `0 j  |+ L2 W) l; Z            'password':'123456',) F( H% _; ]6 v3 {" Q( q" y+ R: S
                'db':'example',5 {9 H3 N) A- B# t: K
                'table':'example'
    ' B" x& `- s: Y; ~9 @$ K0 l/ ~            }8 r- N) ~8 J" `
    ).run()
      a3 I& ]0 n( V6 X! Z. k
    7 s  c* g. y) `( D第十种玩法:多线程爬虫
    , t2 F3 k0 [, J# \+ W特点:
    + y6 e) U) K8 l  a7 `$ x- ]/ O8 t爬虫速度加快,9 s0 ~: H8 `* P* o4 |7 I4 ]3 ^
    更好的利用了线程。
      E' z' q0 B/ @. ?1 s& v& t$ o! [, Z$ x
    缺点:暂无
    & C% S3 |6 K% d' C$ ~3 a2 _
    9 M$ w5 z8 d- S! I7 M! r/ i. }:return None
    ( k9 D/ a0 w0 A4 M' t& ^( J3 v/ N/ {1 {' D( P
    request.parse(
    7 A$ i& H7 |& p" c0 S        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    , K2 f, ]. X3 w        #login="taobao",7 J0 t+ Y- B% j( m. h# z
            type_url = "text",
    ; N* q5 ^/ r1 R& ~( ^        Parsing = 'xpath',- X4 J& f% T0 u5 B' l9 m" }6 i
            label = {
    5 \. ]1 c1 w0 G+ H- H            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],+ w6 d  G. }1 j7 e2 e
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    ' r- c" h7 \9 j            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]5 T0 ]% a9 `4 d7 [; V9 p3 w
                },# F& s& O6 A5 c9 s8 y0 M2 [: `
            write='result.txt',
    % g' `, y( }/ D4 h4 s. r! N) _        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',7 j% X- d/ ^) O1 |
            page=[True,"now_url.txt"],
    * e2 ~3 B  [9 E3 l6 y- u5 G8 ~" o) Y        #clean=True," |3 ^- |) U! n7 Y+ X# L' C+ X
            texting=True,
    ) ]& l1 M! I# {  e        # status="threads" 启用多线程爬虫4 _$ g* R! A, \7 [
            # Thread_num 为线程数目,默认为1 单线程
    " z0 w6 q: {, _! j5 h        status="threads",/ I5 S- y7 X6 `9 {
            Thread_num=3,
    2 _1 s# d" U4 t$ |. \        ###) L+ M7 @) T: w( e' `) Z7 i
            write_SQL={- E7 ~/ O  U% c4 R* K: X( ^8 ]
                'host':'localhost',- Q) h( v, D$ X- n& X! N) ?( }7 O
                'post':'3306',
    * W0 a; j' O9 i4 M3 s            'user':'root',
    2 I3 I6 a; i; Q/ F            'password':'123456',
      ?: W4 W+ P: {: X6 b            'db':'example',
    $ v2 \" e, q+ i7 Z8 z+ f            'table':'example'- h4 M# _2 c8 D; a" N9 g+ c: B8 P
                }
    : L7 t: n7 s% y" ?" [1 }).run()
    " Y6 j' Z9 k. _
    + u$ I, e7 T) s- U1 A第十一种玩法:多进程爬虫+ {! Z; c$ d3 h. E0 _) s% B# z! |
    特点:
    6 y5 S' B+ P; [3 B7 v  M8 R8 w* {爬虫速度加快,% T: `, \3 b* t3 r; P# h
    更好的利用了进程。
    8 t: W, `+ F8 U# ~% ?  k# S2 G" f- K+ s" \% M7 a5 B
    缺点:暂无
    + z- i$ T" u+ d
    & W, l8 `, H% N3 t1 s/ `2 f& F:return None) x& @! U) p  P2 L, {$ I2 c
      y8 O% a; x: `/ r
    from simple_crawl import request- K+ f  N$ v, g9 m( v3 j; Y% K, C
    request.parse(
    ' f0 T2 [( Q# r  A. P# I        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],) c, Y: z# p0 I5 h6 H+ c) \
            #login="taobao",2 M2 U5 t) L8 [4 ^
            type_url = "text",1 E; x. h, a/ I% L1 y- A2 F
            Parsing = 'xpath',
    ! @3 y% _/ f5 }        label = {
    1 G! k; J7 M) j            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    1 J5 T. f. E- F  X. a* L            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    1 F! L, }4 h' t            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    6 m+ l+ N8 q9 m0 q+ t! o5 `% `            },
    ' f. U2 X; ~9 Z+ x$ p& g% b        write='result.txt',6 t/ P: F! A! _2 X/ S
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    8 {# V6 q6 W3 Z1 O        page=[True,"now_url.txt"],
    / i, a2 W( t' {3 Y& n% j        #clean=True,
    " d" \! \. N7 v7 |- ?, K7 a2 v        texting=True,' T0 o4 _/ C- ?
            # status="multiprocessing" 启用多进程爬虫
    6 b) x8 r& k/ G9 M        # cpu_count 为启动代码核心数,默认为系统核数一半" ^/ t' Z6 {2 [: V+ ^
            status="multiprocessing",
    9 k; [: C  y% z* `3 ]0 C( y        cpu_count=2,9 `9 d5 m3 T# |7 b& Y/ r% ?
            ###
    ( V1 e8 k& g' V        write_SQL={5 B- Z# J# Q) |
                'host':'localhost',
    0 f+ m" Q8 Y1 L/ q. D            'post':'3306',7 v+ ]7 c( U( r1 l; [
                'user':'root',
    / Z% U- B3 M6 e$ _' l0 U2 m            'password':'123456',
    ; C$ k5 S) F- T% o' Z            'db':'example',
    . C6 K/ @6 g4 u$ @' O0 j0 h            'table':'example'
    8 W; s0 f, M3 V- [/ s            }
    8 U( G; r: ?9 w2 c/ f; P).run()
    0 u' S, b( h: q6 s
    * h: L7 S* a0 b4 t. j3 r9 v第十二种玩法:异步多线程爬虫
    : p2 O( g3 Z2 m: x$ d& c  P/ ^1 }特点:
    " w! Z' ?. j3 f# N2 k爬虫速度加快,3 X8 @& _/ i* T3 T% L3 @
    异步使得爬虫无等待时间,
    . P4 y: U+ k% ], W! W' d同时使用多线程速度明显加快。
    ; e" h6 E: B/ n: x
    - y' l0 \, O( `( {0 R缺点:暂无/ j8 W* l! R: X, C' L
    & j" u, n: F1 c/ J; j, \6 H- F
    :return None
    ) N' k. S$ `: e, o0 [5 V6 v
    : q; a8 ~7 \8 j! \from simple_crawl import request6 t' k  \8 u# d4 g
    request.parse(# E( O/ P$ A1 ^+ D9 I) @/ S
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    6 R3 t9 Z; o6 Z6 k, F        #login="taobao",
    + Q& k" I5 N! y, t        type_url = "text",
    7 u( s/ F1 t9 p# x  c# [        Parsing = 'xpath'," G, `8 G# x& c5 T2 l8 c! p" m
            label = {
    + |3 o' |  }) x1 V, v8 z            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    : m" v" ^4 \' C/ T4 r+ x# e. J            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],  `6 O6 s( J6 ~3 Z
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]: i5 m8 G$ J- z/ @, l
                },( F' X9 I7 Y  J! y6 q4 C
            write='result.txt',! ~# @: W- N1 R* }0 c
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',- Z  k" u* `% _8 H4 U( q
            page=[True,"now_url.txt"],; g2 a- K' Z# w  f  A: N- ^$ r
            #clean=True,+ B  g% n- W6 P' J6 \& I5 S3 s
            texting=True,
    9 {3 w* e& f: g$ B: S% S, T        # sem 参数为异步引擎数目,默认为55 a9 E' r4 A  W8 b
            # 其他参数同上
    3 d* v' Q% d+ X        status="aiohttp",8 \7 K( J( Y/ L4 L$ D
            Thread_num=3,) Y4 N  x7 {3 r, T
            sem=5,/ Z) y. y( X0 \, }
            ###
    # g9 E' t/ v2 ~+ e6 [        write_SQL={
    ' d! U# Z/ V% V  q            'host':'localhost',
    6 }) Q+ }. Q( T            'post':'3306',- D# a  r3 i. }
                'user':'root'," E" L* ]8 t' m* |7 |' {
                'password':'123456',* p$ U# F5 ^2 d7 M- E/ `
                'db':'example',) Y' p' u, @0 X2 I) E, u
                'table':'example', C6 C6 b. S; m* |, {
                }3 ]% P; F. k) s9 M1 d
    ).run()
    % h( J9 o* s) H  `' {- M) E1 c- M: s$ Z+ x6 U7 {
    第十三种玩法:异步多进程爬虫
    - s/ O% m% a# ?# v7 p, V特点:2 Q* f6 @( U# k
    爬虫速度加快,% ~( {% Z4 K5 s! m7 P& f% V& p
    异步使得爬虫无等待时间,9 l4 ~* q8 F& @, W: o+ k
    同时使用多进程速度明显加快。
    & t0 K) ]+ u& D/ @# n+ ]' m4 _* t; j$ j4 q7 N5 g
    缺点:暂无
    * t7 Q& W1 Q  P" Q; M8 h
    7 G; ]) y8 b5 Y$ f( n:return None) {& g. {' f6 V7 J' ~+ |7 n

    ) }3 T$ C. n, x. U9 s) c* Bfrom simple_crawl import request
    / h- E  u  b& R4 F* g- V# Drequest.parse(  Q, f$ v- Y# y5 Z
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    % z, I: {/ S( N' |        #login="taobao",
    # o! Z7 j6 R- ^7 I. S  Y# h- F8 r% G        type_url = "text",
    ! Z( m* n9 [/ i4 j; v0 t        Parsing = 'xpath',
    6 k* R& X, |2 P6 [' o* G, Q        label = {. f* C* [, D+ u
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    . k1 f( o3 n/ P( r            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    4 j3 ~$ a: d9 A( h            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    9 E# F+ V. `" L* W3 h  G            },# i3 E/ ]$ d0 F
            write='result.txt',& P. H* n: N3 i9 o6 n9 w
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    # [/ O8 d# w7 U        page=[True,"now_url.txt"],
    . G) p3 P: A9 z! z        #clean=True,
    4 F/ k9 |. i9 c, |# \& V        texting=True,% N5 u! ]8 E  s, ?$ D* s! {
            # 参数如上
    / J: a7 z4 Y: l% T* H        status="between",
    $ _+ e# t4 B  T  c& b5 K! g, `        cpu_count=1,' }& J! L7 M! K( `+ t# o
            sem=5,2 U% w, f' Z' N3 n! l/ s9 J
            ###$ a9 k8 x+ W. B: h6 S1 ]# b' ^, a
            write_SQL={
    , [& j$ H3 c* X' i# v3 x9 z            'host':'localhost',
      ~* S/ t+ x. `& ~            'post':'3306',
    ( I2 a4 {* w; r$ F- y            'user':'root',
    : q& N0 c! c6 y2 J            'password':'123456',
    5 M7 k! t+ l" p' F, ?            'db':'example',
    8 J7 B4 W. N4 `+ W/ W6 o            'table':'example'$ _1 o* s  h- x: o. ?, V; |" Y
                }/ ~& r/ h, J5 G
    ).run()
    & X0 S, J" Z  J- b' y* X5 z. Y# a3 d; e) |5 A( n: `
    3 y8 D, K; I* p" l0 M/ T4 M
    功能介绍完毕🤞% ]4 R7 a/ f7 S! R: \7 ~% o
    最后还是希望你们能给我点一波小小的关注。, `% {1 c6 n6 h! ]; m4 z4 v
    奉上自己诚挚的爱心💖$ f" Y+ C3 H' h, J6 e
    ————————————————
    * H; c: y$ c( I5 C7 S# J( v4 M版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。, U* r: h& K* @3 @0 X
    原文链接:https://blog.csdn.net/qq_45414559/article/details/106005684
    ; `! R3 u7 E9 [) V; V2 M; c, g+ N% T, M  z6 V- n: I: k

    8 f8 v6 A7 w+ T: f4 v
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    738391227        

    0

    主题

    6

    听众

    32

    积分

    升级  28.42%

  • TA的每日心情

    2022-2-20 17:52
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    自我介绍
    哈哈哈哈
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-9-22 23:44 , Processed in 0.322534 second(s), 56 queries .

    回顶部