QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4869|回复: 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( ~6 k  w1 N/ w1 Q1 N
    simple_crawl6 @$ X3 J2 S- ~4 T" j2 ^  P) C: H8 q
    仅需一行代码即可达到爬虫效果% k7 n; o0 z+ p% E$ |5 L. N& V
    项目地址(欢迎star):https://github.com/Amiee-well/crawl) z- }3 ]; X5 @2 ~  `: u: c: }# i
    使用方法+ |3 W/ g" i9 ^) ~! U! V
    pip install simple_crawl
    $ v6 S. y9 ]( Q, F9 n- J2 j9 r& A: n) a; z
    ### 以下源代码为简单介绍,详细功能介绍再源代码之下
    ; Q* \' r7 G2 h' M/ {from simple_crawl import request
    , ]7 u  L1 T" t2 I/ H1 L; mrequest.parse(
    5 d2 r2 X5 P: F- }2 k        # status 参数为运行状态,支持单线程多线程多进程协程以及联合! j, g1 O# }+ e: q
            status="aiohttp",; E2 E  q) O+ a
            # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式4 u- J- U8 t1 z% V: T* A8 k
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],: t0 U. S/ g# o4 [% O
            # login 参数为获取登陆信息,如淘宝等网址需要登陆信息
    " s- k, u2 _9 \/ U! n    #login="taobao",: r6 `* f  D0 u) H9 N, ?
        # type_url 参数为返回源代码格式,支持text和json,默认返回text4 w) g& S& M. T
        type_url = "text",
    5 i& t: e6 P1 g    # Parsing 参数为解析方法,支持re、xpath和beautifulsoup4 ]! ]. \' ]. S7 R' h
        Parsing = 'xpath',
    " k8 p9 _( a. @3 v  P9 T    # label 参数为爬虫解析过程,字典格式,详情见下方
    2 I- ?' X5 |+ X    label = {
    % M. F0 Q* ?0 ]' N            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],2 u" T" r* u* N( ~: j. i
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],5 p/ z, J: q1 p2 n
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]7 ^" t) e# Z1 q' K& K
         },3 P; w$ V2 T& \0 O* J; X' T
         # write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱, f3 }' e& J& m& K% j+ g: ?" N$ c
         write='result.txt',
    4 V. C& o2 ^' c  {* g     # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫
    ( [3 _6 a: \, ]1 v; ^% C2 b     next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
      v- O: l! [7 j! D/ |/ _     # page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫0 W9 h4 _5 ~' g2 C* f4 Z' w* D6 W
         page=[True,"now_url.txt"],- I, P% W' f7 m! M
         # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息
    - @& }% A( R$ S! ]) K6 {+ r; I     #clean=True,& A- r; N" H0 S8 G
         # texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序7 f! V2 n- J& o8 X2 g/ _; [
         texting=True,: e! [( X& D' a# _/ N& W
         # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态2 P/ z6 u, [! n' y
         Thread_num=3,
    9 e0 ~1 C% W' a% t1 r  L     # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态& D+ t$ \/ V0 n: B
         cpu_count=1,, ~0 d& H! X" o/ M) T* ~
         # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态1 r/ M1 |! X4 q# S% D
         sem=5,# B. V0 v; i- l4 R- B5 g: U
         # write_SQL 为是否写入数据库,默认否5 t& g/ Z0 ^  y) h# H: c
         # host 参数默认localhost
    1 M* W* g2 ^1 ^3 t1 h) ^     # post 参数默认3306* i8 F5 I  Z( @
         # user 参数默认root. H% f) J3 `5 O) \+ U
         # password 参数必填,必须正确* R' u' k5 v! O; ?  @- s
         # db 参数为即将存入的数据库名,若不存在自动创建6 C3 h6 J# v9 R
         # table 参数为即将存入的数据表名,若不存在自动创建
    $ O6 n+ m+ A1 l! |     write_SQL={
    2 c1 T) L+ r/ x7 |# u/ @, k" z0 _, a         'host':'localhost',
    * v' ~& W" m2 D9 h4 o         'post':'3306',
    / l6 T1 M: ~* o; U, k+ w         'user':'root',$ W* j6 _: q" V0 P) I, n" }/ Y$ Q
             'password':'123456',
    / _' B, O  c' ?6 X! e0 \         'db':'example',- x/ v1 u! C3 k$ |  N
             'table':'example'% j. h) g& I; |9 c' R
          }* P3 D' ]6 W9 o* ]- H
    ).run()
    / o# r/ V; d$ G3 F( i( U
    7 F: S3 m- D% i) g7 B  n  }1 I介绍一下crawl参数设置:
    1 L6 u: g( V, v4 T0 N
    7 r+ |$ X3 x2 L7 e'''
    2 t2 J/ S1 V. Q) Q单行代码爬虫程序执行
    . Y! ^5 ]9 s5 }9 J) {. J:param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档! D; A0 e0 K. f: _( K8 q$ K' F
    :param url:即将请求的url地址,仅支持get请求
    9 X/ \" L' v4 i9 x' R:param type_url:请求url后返回格式,支持text和json格式返回, ]3 R0 \) E% m) V/ D1 [
    :param Thread_num:即将启动多线程个数,默认为1单线程
    / J; @8 J( o  O! Y8 }: }:param sem:协程信号量,控制协程数,防止爬的过快,默认为5
    . L9 B% I: }6 |$ e6 C:param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半
    & q. a4 V# u- n1 W- C:param login:模拟网站登陆,保存登陆信息
      X% o1 E4 V- B9 E1 w+ X' \:param Parsing:爬虫方式,支持re、xpath以及bs4方法
    , `* q0 K+ S: G* {! Y, Z:param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,
    3 `, d  j3 o3 {1 P$ ?% V                       多次报错结束程序,默认否
    - L& p0 x4 b2 V* Q6 J:param label:选择器内容,字典格式保存,
    & ?5 t2 r# Q1 g8 k                     字典值为列表格式,第一个参数为选择器,第二个参数为转换类型
    4 J+ [2 Y! v. Z* e                     第一个参数必填,第二个参数默认str类型
    # R5 H0 Q5 Q% P7 E9 t9 S:param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否* T% ^! f0 I* l
    :param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫
    ( O8 ^+ ^" ~6 x8 l:param page:是否选择断续笔记接手下次爬虫处理,默认否
    - k) ]+ C3 Y# A8 l4 I:param clean:是否进行简单类型数据清洗,默认否  G- @! W+ u' }: H2 p
    :param write_sql:是否写入数据库,默认否
    1 g( I% F5 u0 O- l! g9 \8 t                         'host'默认为'localhost','post'默认'3306','user'默认'root',
    2 t9 ]5 V7 }' b- c( m9 {                         'password':'密码','db':'数据库','table':'数据表',
    - N. r( p# a5 R0 s/ Q  F                         检测库是否存在,若不存在则创建,若存在则直接插入," f  W9 r( G0 J: Y6 Q
                             检测表是否存在,若不存在则创建,若存在则直接插入( u5 `! g7 x, V% d: H6 p& X
    :return True
    $ [) [/ K- N' V) x5 l'''
    : B) g* `& e! @3 i7 b* q介绍玩法
    9 F2 K' f! k3 X+ \  n5 s6 U接下来介绍的均为调用第三方库的情况下运行:
    ( L- _4 C; F/ ~) U# b4 X
      F% I4 a0 W- F% [, g; e. Cfrom simple_crawl import request
    & ]+ O" v6 K+ V  l5 Q" Y& Z第一种玩法:输出源代码
    3 N7 y4 R3 O% E( {4 A调用requests库进行源代码请求。7 r; F: {% ?' p: R0 e7 v( g
    ! P6 D: v! r* r# {
    特点:
    . y8 V8 h) g8 v  p请求失败则调用ip池处理重新请求访问,
    # B" K+ _; O4 _# C出现五次失败默认网址输入错误。
    * }1 h* K- g( f' Z+ C! [- G支持text以及json字符串返回。默认text。8 p) s: K# F& H( Z

    ( h" A- b( _+ z缺点:
    ' m# H  I3 Q9 k暂时只能进行get请求,不支持post访问+ E0 u1 d" v: N5 F* G" l* r  l

      a" l, `9 i2 K8 k4 @; O9 [:return text or json& z$ U0 _) l/ i3 `" i$ M
    - E; I5 n( j: U  p% }( M. O! s
    request.parse($ Y( r- s$ A3 @( p6 w2 Y
            url = "https://www.douban.com/group/explore",& Y8 a. Y$ i. o/ ^; B% \
            type_url = "text"
    * F) I; F8 F4 E9 H) ]( D- N).run()1 C3 N9 B0 c$ `* Z" r1 O5 D
    # return text3 i# ~. _* F# u# N7 I. w
    , H" A7 S$ ]. i2 X
    第二种玩法:模拟网站登陆并保存信息+ M/ B9 K4 u" q; E3 @
    调用DecryptLogin库请求登陆访问。) h" p0 M* C# q; l6 s
    / M' u7 Z0 _0 S7 ^/ d6 ^  V
    ps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源5 f/ _0 ~* W& l0 ^; R* P5 n2 a/ t
    在此放出文档地址, `5 f- ~8 {, H
    DecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/% b  g+ v8 }  c

    : Z" X/ A4 O. \! _$ S+ J5 }特点:
    3 _3 C+ V& x5 c( _- l将DecryptLogin库中二维码继承到此库(非二次开发)6 @( @% |. v+ [' X! Z" G
    支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆)
    % x% x0 B; b9 k, ^  z3 Z保存session.pkl信息到本地方便下次登陆运行
    % k" }! h! [* X, K! z/ }! e5 _( u* F+ C6 r# s5 h( @
    缺点:
    ' X5 V1 D3 T& w, m! Xsession.pkl登陆信息过时无法自动删除。
    - I- E- J! k# H2 R导致下次登陆疑似cookie无法正常登陆。' R2 K! T) j  `; z1 J7 S$ p- J
    5 G9 D+ p# M' ]' [
    :return session) L* W) I" o2 Q% ~1 }  |

      s* t- G7 b9 q+ qrequest.parse(
    : R" y, S; Q9 f2 f        # 臭不要脸的推广一下我的店铺
    ) A6 w( C, M6 L# ~; y3 f4 Z. T        url="https://shop574805287.taobao.com/",3 S6 U  i5 q" a3 P; }7 G( ]: H
            login="taobao"
    . X! V. N$ I1 O2 h& J( l& U).run()/ {1 `) v! C. u, @/ |7 M
    # return text
    % B+ t) Q. j3 `; j6 p) \6 g; q4 O5 |. m2 }' J3 {, X/ x% P8 M: k
    第三种玩法:爬取网站信息
    5 g  _1 A- Z3 c$ Y% Q3 ?爬虫库自然少不了爬虫的过程
    " M1 U% {, c! ]0 p: G( q  y1 m8 u
    * X4 P7 V- g6 z& e! t特点:, g5 z. C+ Z4 E( z$ N
    支持re库,xpath解析以及bs4选择器。
    1 M0 e; t& |- Q# B/ m6 m爬取方法为字典格式。单方面输出。0 W- e4 @: T! {* d3 S3 }3 G( \
    字典键为保存的字段名称。
    4 d9 J9 ?2 }2 G5 b+ D2 z7 ]字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。
    4 f" @. R5 q% V6 r( I
    ! k9 T+ L, f- K6 \9 ^; K4 v缺点:暂无(等待小伙伴们发现)
    3 F+ y! Z. K3 {
    * k3 c3 b1 o# U$ ~, C; x:return reptile_results
      M- S$ u' w% I4 z/ r1 I6 D+ L2 F& f) R+ E8 g
    request.parse(% T1 I: J$ a; r' X- p( E5 _3 @
            url='https://www.douban.com/group/explore',+ U# O3 k' ~4 F
            # 字符串格式,选择器方法。
    # f3 d: T1 W+ m2 s    Parsing = 'xpath',# D  l* C4 F& h$ p7 h) ]8 {
        # 字典格式,参数如上。6 Z! \0 A. k, _" h' k; o! T
        label = {( n0 G5 J& \! j: {3 Y
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    ' F. g. j) L) b0 M        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],( D4 a9 ^* |  \  q! ]+ q; K
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]" U1 B* k8 t# R7 l0 t- S- o+ q, G
            }
    " Z$ ^. p; a/ }$ U).run()
    . B1 h& o3 Q7 e( G4 O4 C# return reptile_results(list)
    0 m) U0 H- a# m5 W$ c3 k; \- O# F
    : w* w$ l, F) I1 }2 R第四种玩法:自由保存信息
    # g5 ?" n: o! `4 e4 x目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。
    * J" f- W5 ^& h& ]
    , V3 ?# X- {0 b8 M2 B特点:6 O% s4 n" ]/ q; R# _% s7 h% I; M
    写入文件均为数据格式传入文件。. q) x# n3 W& ]6 |
    且输入格式规范方便阅读and省事。
    * K+ g0 Y5 u* [, n% i; X  I3 ?9 j; e- A" Z; w. ?5 a
    缺点:
    , a2 P( l% z( ?, y" A! Q( C) l保存格式仅四种,
      m2 N1 P. c+ u1 W不方便用户之后读写操作。
    " b) h" D, n  F! s0 `+ n- F( i
    ; {$ o6 y* ~* X" i$ v: ~:return file
    ( _2 ?( j2 }$ ?) X
    - U& d' Y$ X' q5 L: e5 |request.parse(  f5 C- f( v0 T
            url='https://www.douban.com/group/explore',
    4 D6 E$ p4 \/ @/ O$ n; p% o" u, S    Parsing = 'xpath',
    $ y: n$ J) o# k0 T/ t$ I    label = {' \3 s8 J9 l1 o( n4 l* _, G2 A
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],7 \8 o5 D  n6 X* I! e
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    6 k7 z" }( m3 f9 ]$ ^% ~& o        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    0 N" T7 ^/ a; T5 q6 s: U        },4 D9 c. @3 E1 D" @7 I$ u. `
        # 字符串格式,具体保存位置填写1 {% i( @6 p8 d! N7 p) q
        write='result.pkl'
    ) J1 m  l+ n. e) q" K).run()5 p' {/ O- B# z, ]
    # return file8 Y" u5 ~. o1 a% [

    2 P; d+ ?9 L4 K( R/ M; R9 G第五种玩法:读取下一页 url 地址继续爬虫
    8 _# I1 u! e4 I7 U这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~5 x& x0 b6 w" u

    ; b0 f- Z7 R+ B6 Q) |$ E$ C+ p特点:
    $ Y0 B) `0 l) W; x7 Y( z继承之前的Parsing参数选择器选择方法。
    + K+ _, B4 j0 Y: a- U" v+ J在这里可读取到解析后的下一页 url 网址。' p: m( q$ y; i) \1 @0 v7 [
    方可继续进行爬虫处理。方便用户使用。$ Z+ I: h! Q7 _( r2 H
    + Q2 ^# x2 q/ h) B3 k: d
    缺点:
    3 s6 t! \2 r4 S若爬虫时下一页 url 地址改变,便结束爬虫。
    ! I% [5 D$ w# a) s9 O+ D0 k只能爬取所给 url 地址中的信息。
    . R: d; \# q  H无法进行某一界面的多个网页爬取返回。
    ( B: z: c6 \1 _  A2 ^, i. k1 H6 @造成访问页面单一流失。7 P! Y, y* ?% s* X& O
    . [* D5 U9 }  T9 h# Q
    :return None  ]  ~5 Z+ D( s. `! s' X/ h

    # i! q/ G7 I8 d! I9 z+ N' trequest.parse(
    ( A2 f$ w  }/ m  K- `        url='https://www.douban.com/group/explore',5 F6 i) Y5 ]6 O, A, b$ O6 ]( @
        Parsing = 'xpath',
    $ d: g3 Z4 F- _, [# Y  R  j+ J    label = {
    + v) u  U0 M' p& C4 O: M- ?2 F6 F        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    * G) s/ [# r4 w  y5 E/ e* c        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    ; z+ A$ t* O* I3 A: }+ A% l4 P3 z        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    % v5 P: ^! U: p8 y0 |        },5 ]& l+ `/ X% Z" U
        write='result.pkl',, o# i: L$ t* q" C7 w( U( z9 B" T
        # 字符串格式,根据Parsing方法继续请求下一页a中href, v# h% w/ S0 U  J$ G
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    ) V2 a6 E& s) Y8 B8 I2 d0 Q).run()
    6 _6 Z# O4 }, z7 F# return None ( @& ?3 O  R* Y
    1 h8 M$ |! \3 G) N4 ]8 C; I, o
    第六种玩法:爬虫网页保存
    + g! `$ o3 c' N" `2 \听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!2 ^& w4 p8 I4 H- V; S
    % S0 e" O) t6 M6 ?0 a' t4 }
    特点:( z/ U/ [4 e/ C+ g" Q% l
    持续输出断续笔记。
    ! S& U  o2 c+ M$ C) K5 B将此次爬虫的 url 地址保存到一个文本文档内部。
    8 a' }8 R4 G, e* y下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。
    ' V+ x# h' J: ?1 t0 c
    2 j9 i4 Z! F3 k! G  s0 Q缺点:" W7 t( `7 ?3 ~  I/ s! F% b4 q3 ]
    读取内容不单一。
    9 b  e$ Q* A  l( |1 C* u! X7 o导致下次爬虫无法正确读取上次爬虫留下的痕迹。3 y; B( _7 a. p. W, J

    / T: Y9 L# f: {1 z# F:return url_file
    3 E9 T* m, D, W1 V! }  q/ G
    : {( Q1 \2 d4 m/ frequest.parse(: O; y9 }- H8 X9 ~# ]
        url='https://www.douban.com/group/explore',
    8 u2 J* I6 `; ~9 @$ e0 U+ X! U    type_url='text',
    % n8 T* e4 p0 y$ \$ E    #login='taobao',
    8 l, B+ M$ q6 L  q  `    Parsing = 'xpath',  ?$ V& {- Y6 n- N) i6 C( @& {
        label = {
    # ~9 `8 U# U# x        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],4 C6 \" Z& S( E5 o
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    8 @1 G8 X4 K% F/ F5 Y! `        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    1 n5 R0 H! I4 \- P- S7 e+ o& k        },
    - p" S9 ^" ]) m9 e) S    write='result.pkl',% D; z! P+ g/ W* }/ K$ }3 I
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    6 |: |! H3 K2 M8 l: V4 @2 ~    # 第一个参数为是否需要断续笔记。
    & h7 U; ~; D7 M1 D5 Z' D' l    # 第二个参数为断续笔记保存位置。
    * l5 m% f1 R: w3 |    page=[True,'url_page.txt']
    9 U% r2 C! f, h; g; m; w" }5 U. H).run()
    & y0 r5 `0 v' t2 F  D# return url_file# Y& N+ l, L' R. \4 ^: y, O9 |4 f
    ! C$ h! t8 O2 e2 F( `& B
    第七种玩法:简单数据清洗
    3 d) }; w; U. j, q9 c" O数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。
    % u1 {3 b* x$ w; c; k' {2 m, Q+ r/ Q  M3 b- o9 Z
    特点:
    * L$ i" n# g' b$ J1 f本人曾写过一个底层数据清洗。
    , U4 }' N. s9 g9 y0 ?( l  T能将列表格式数据进行归分清洗。
    ( P" j' @% n3 X& n' E主要内容请参考另一篇文章) N- o- O, q( R  Y  S* s' E) C8 X
    如下连接:数据清洗& m2 o% ~3 B3 A; j+ b

    2 V4 i/ N+ o1 b+ X8 L缺点:' D9 z0 K6 e- ^9 K
    数据清洗格式简单。
    4 B# G3 F8 v, Y& Y' q3 a- T数据清洗内容单一。
    2 c" {* n# |, `2 ?& h6 Z5 @# n无法完全做到绝对清洗。
    7 n/ m( Y- O, U0 i4 }# t& z有待改善。+ }' P) k. [+ n! z
    4 J& |" `9 |8 @' K5 j
    :return keyword_list, value_list
    * A2 Z6 q# s* u7 m, Z: c
    ! E5 W* i0 O9 A2 Trequest.parse(. S- t% E8 j$ A" X
        url='https://www.douban.com/group/explore',& Y' p; n9 T! Q. r2 f& [/ M
        Parsing = 'xpath',
    + \$ n) \: Z; M' I$ }3 r$ V    label = {' N- y( o3 R$ ]/ P2 N
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],5 l, t" b" D+ g$ }) E9 S# T
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],% i& }5 v# c3 z# s' H& \$ U
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    0 D2 F6 ~& {9 {        },6 b! ~2 s, J) H
        write='result.pkl',
    3 k1 t  D- `4 t) s    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    / o0 \) b8 K) _) a1 `5 M- V+ A1 Q    page=[True,'url_page.txt'],( ~/ D6 ^0 N$ @- `' ~( C
        # bool类型,默认不清洗$ _& t3 `; k9 }4 Y3 Z6 o/ d# n5 Q1 j+ c
        clean=True1 J* G. u1 _& ]& g3 |/ B% Q% Y
    ).run()4 C) p# p5 J9 W' @" V
    . H5 h! t1 z/ c" y+ N& c% k" |1 S% L$ h
    第八种玩法:爬虫存入数据库
    4 S' Z+ b4 S. v, ^% E5 M存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。' t& Z* R/ b3 k5 c. b, Z
    # H, V* u' y. q( S# |
    特点:
    0 [  Y% _& j/ r信息存入MySQL数据库。  w. V2 y( z5 }$ V4 ~
    可连接docker远程数据库。
    3 o4 U  E5 {% R7 i$ y$ A: O, R数据库的库名可以不存在。
    4 a0 E2 k. ?0 r- A) s0 `& O, h数据库的表名可以不存在。5 g, e+ G& Z2 [1 ~  P' A5 a# S- p
    根据之前传入字典键与值参数判断表类型。7 e4 a9 I0 {! f5 b. _; P: B
    自由建立数据表传入信息。
    8 m' \) X) s2 ]' \: x5 l8 ~
    8 h8 u5 N+ B+ U8 J* Z0 m% E缺点:
    ) }4 ~; O* j$ ~8 F9 b, ^% U/ h仅支持MySQL数据库。6 E6 }0 q% Z0 a$ ^5 V. I5 d% T

    + Y  d( Y0 p3 Z& z+ i:return SQL
    3 z# M2 q! A+ v: J' r
    : Q, x* ]1 o5 e# B* `$ N2 crequest.parse(1 b: c, i9 |& T9 D
        url='https://www.douban.com/group/explore',
    $ `0 o7 S6 N9 `0 ]& H& x) n    Parsing = 'xpath',
    % r$ Z4 h6 ~. Q4 N' g; e! N    label = {
    1 s* a3 V; @  ^        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],; L" {4 u- a0 X/ s7 g9 n0 d% L
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    - T; o* k8 X, A9 R        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]1 g2 ~/ l* P6 {) D9 Q: U6 E' f5 A
            },
    2 S# x- X8 f( v    write='result.pkl',
    6 e5 V! H( L& _5 N- B    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    6 H- h) G( r/ o; z8 @. E    page=[True,'url_page.txt'],/ W) t$ Z, D# |6 T
        clean=True,& q9 [1 n& U5 b5 v- o
        # 字典格式,
    2 T# w4 A6 w4 A3 u8 D    # host可有可无,默认localhost
    ! ?' r& x# B: k4 R* Z+ v8 x    # post可有可无,默认3306* T+ L) a# f; }+ b
        # user可有可无,默认root; {+ O' b0 T% C/ f4 u
        # password必要参数,数据库连接密码
    8 U$ l) X: K- e& Q, x9 O1 ?5 ]    # db必要参数,数据库即将存入的库名+ c$ q8 z/ L' A5 \
        # table必要参数,数据库即将存入的表名
    8 r" T. @3 i5 D6 B* s    write_SQL={8 X" }: @+ q9 B- Z, _
            'host':'localhost',
    " v- K, t: V7 K* ^3 F. a3 @        'post':'3306',
    , D: X. B! J6 K& O0 v* p6 E' k2 G. V        'user':'root',% r5 U$ L" b, w: Z, a( y9 p2 o" D
            'password':'123456',
    ! Q1 f* J) q: x- @/ }        'db':'example'," i2 l) S% t/ p( [' T, ]
            'table':'example'
    ' a1 J$ H4 l8 n9 Z  A        }
    . V/ n8 d% t: ]! ?6 z    ).run()3 w! B1 m# f& Q! Q. G4 u5 O  x. {
      q- d4 i# p. _" v, N/ u
    第九种玩法:重新启动爬虫" ~  H3 }/ u& Y) ~! q& p1 f; ~
    爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。
    " y6 S* g" v- O, V# ~7 n7 b0 a+ B4 `  E
    特点:
    ' Q' Q# t: X- ?检测报错重新启动爬虫
    # x- \/ a9 G7 Q. o3 N0 ]无需手动处理错误信息! d8 z" \9 a1 X. x& \( d6 B
    0 d/ [+ N. W$ J0 O9 {
    缺点:: r. m4 c6 h* G6 w8 h4 A) R0 q  s
    无法收集子线程错误。
    - x; O3 _* S  P# K) H7 ^8 T( }5 R- f7 U* k
    :return None8 ?3 K' o3 a) o. r/ j# f

    * ?0 C$ R* h& X% g1 brequest.parse(
    8 y, j* W0 u! Z9 ~) L# f        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],$ ^5 m6 `; n, w: ~8 B" }
            #login="taobao",
    # R# I2 ], @* G( d, P        type_url = "text",3 T7 k. W0 D/ N, \* ^. B
            Parsing = 'xpath',
    1 r/ E9 D' o2 B3 ]% N( }4 p. ^6 v        label = {+ I1 x/ C- B' |0 |( D; L
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],# y) k6 H& E; B) A) f
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    # |, c3 ?# h2 v& S4 }4 l) o3 Y            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]; g% z5 i5 r4 @) |
                },
    6 ?) r8 e  n9 J' e7 {        write='result.txt',
    $ c4 C; I6 B' Q1 ?        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',# G' m) s0 `' t" ]  K# o
            page=[True,"now_url.txt"],
    9 Z6 I1 p8 {# j% I        # texting 参数为是否启用连续爬虫
    - o; O- {2 r6 _- w$ m        # 爬虫程序异常报错后重新启动爬虫
    . Q* J' w" J6 f# C4 ?' [5 B        texting=True,# F4 h7 Q: a& F& V* t: O, ~
            ###
    + l4 [& H/ b+ v( T! K" t8 S+ z        write_SQL={
    $ V5 c/ ^6 z& r4 @            'host':'localhost',& O( }! O. t: a$ l: e" m0 v
                'post':'3306',8 D2 I) ?- `( p1 C( F! m+ \
                'user':'root',* e+ `$ f& q% [
                'password':'123456',1 D' W0 H. ?% R2 R* Z. v$ h& ]
                'db':'example',
    ' E+ r2 t' m5 p, ~( i            'table':'example'
    ' l7 B# P* x! S/ g9 k- `4 x3 f2 F4 l* s1 y            }* R+ h7 n! l$ I' z1 Q9 t
    ).run()$ ~$ Q8 |3 b; F* \; G% u

    4 \' F# ?2 S. V5 N  _/ F第十种玩法:多线程爬虫. S) G+ w) m9 A5 t" `* l$ j
    特点:: U0 J( a" B* {/ \+ D: G
    爬虫速度加快,# q; M5 t' Z" i9 @
    更好的利用了线程。
    # R0 E4 d1 Q0 ~' @9 `3 Q8 |8 _$ g$ ?2 r! z$ M; d, N& s6 ^; U
    缺点:暂无( r  \, F. ]. t  \1 f
    + U# C: q6 i1 i9 Q* w
    :return None& y+ a# B; e! R% f8 J  `" v) O
    4 |* x7 M8 s& j) U. H9 p+ H
    request.parse(2 }, I. h  y. J* `& y- I
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    1 M0 A' p. {2 v9 V2 ]' J        #login="taobao",
    1 ?: B8 e+ Q% v1 N/ S  k5 {        type_url = "text",
    9 h) Z) s0 U) Q0 f$ C8 R1 K        Parsing = 'xpath',
    ' T- ~7 B3 _; @        label = {8 M! v/ L7 Y6 \( j2 f7 R
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    ) o3 M6 r) Y7 b& G$ w            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],0 V- B7 i( @. @
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]$ \3 p' y7 J' g( c
                },3 j+ t; e9 m, |# k: n
            write='result.txt',; {1 C; `- V8 x8 J5 x/ {
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',/ R0 W" [: K' j$ P' g" b/ p' J3 L# D( X
            page=[True,"now_url.txt"],
    + j6 j4 w0 J5 }, P; S  s        #clean=True,
    & Q+ f8 H% l/ I! V4 T        texting=True,
    ) v! ^) {9 g2 {1 R        # status="threads" 启用多线程爬虫! M6 d% z. E+ W, _0 g3 V; ~
            # Thread_num 为线程数目,默认为1 单线程0 d( r- Z  D+ |. Y( r7 d7 {
            status="threads",# P+ w) S$ C4 {# y
            Thread_num=3,% k, Z$ V# e+ u( ?. ~" j
            ###
    ( G: S; w: }. r+ L, m0 R! Q        write_SQL={6 B# M4 G" W6 G) s6 U
                'host':'localhost',
    " \3 D, d; G7 w- Z5 a2 Y            'post':'3306',
    * k/ L8 n7 V$ s; ^. m7 U            'user':'root',
    - \/ z7 L3 `. T- k8 a( R            'password':'123456',6 k4 S- Z; ?1 g8 W
                'db':'example',
    3 g0 r$ Y+ a, i( ~4 q* ?            'table':'example'
    1 Q6 u$ o9 S6 @8 G; z  g9 y            }$ v9 ?* |1 P: p& N/ z
    ).run()3 }' n6 d% |* J8 z  E
    & d) M* B& c# y! P0 V, G4 Y
    第十一种玩法:多进程爬虫
    5 V4 J9 p( m1 q3 n' |, P特点:
    $ ^' K. L8 m, y( c1 Y5 T爬虫速度加快,
    ' J/ d9 f5 g9 e+ Z2 u( q/ C更好的利用了进程。
    5 H' [/ u' A# _" d7 g/ T
    , ^9 E  y/ x3 Q$ E缺点:暂无
    7 u+ X* {3 s$ Y* a, j$ d5 y5 w% P' u8 A" ~; F6 n. }
    :return None
    ( v+ F" B0 j- \% B& I  q, F! C: {0 C8 p
    from simple_crawl import request: Y5 W9 N7 P* y( t& N
    request.parse(
    2 r; ?  Y& f5 \- x; u4 w2 Y        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    $ H/ }3 }# R6 x' n( \        #login="taobao",2 j6 m& }% j3 W
            type_url = "text",4 g! y; p0 P$ |
            Parsing = 'xpath',
    8 c; [) u' L7 ^8 ~) M/ o+ Z' a        label = {
    0 d# E- _# V* a$ g5 ^6 o            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],2 R8 ^2 Y/ s3 T* ^7 |
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],* ~$ |' k. \' d8 {
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]" \$ h* g1 p6 T: T
                },7 V) Q- c: @  @: T
            write='result.txt',3 M  e2 t; ~* `0 ]
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    8 j' ~3 c* `1 i  j* h$ C3 a        page=[True,"now_url.txt"],
    . n: o/ u4 n3 j3 U  `- w        #clean=True,
    2 ^: [, p$ _3 \8 A        texting=True,! z- ~5 C; z- {) R3 m4 |
            # status="multiprocessing" 启用多进程爬虫
    . t5 b9 t6 e1 {* N+ Y        # cpu_count 为启动代码核心数,默认为系统核数一半5 c' M* |) B% G, n3 [7 {/ k
            status="multiprocessing",
    2 y$ u2 J$ d$ b, {& v: e0 Q! ]        cpu_count=2,' x# Y# P3 A, {6 R6 K) x
            ###( n; m# U4 ^/ h7 X  G
            write_SQL={
    3 O4 W7 n  U# k& b6 D            'host':'localhost',
    % q. S/ A7 R( e% K6 l5 I" n0 `2 M            'post':'3306',$ [! G  I* q. I2 Y' H) ~$ q( N
                'user':'root',
    $ p  G! c- I4 C  n( w; L- m) @2 U            'password':'123456',0 _; ~8 _  T' ^
                'db':'example',
    / p& S: e2 P0 k8 s6 E+ a9 Q' `7 J            'table':'example'
    / o$ a; p7 R8 {7 k& z            }
    # `# w9 l5 h  @# ]& G  K7 r7 P3 z).run(): I* X, `, f1 e6 Y6 W
    8 A& Y) P: p' `
    第十二种玩法:异步多线程爬虫
    6 M8 a8 ~2 w! a  ~% K5 F/ m: X3 ]- d特点:5 S" V1 `$ u3 s) `( j, P/ C
    爬虫速度加快,
    0 P/ J9 H4 N% p& ^异步使得爬虫无等待时间,
    + y, Y8 \4 Y' g6 }, S同时使用多线程速度明显加快。
    1 B& w+ h5 O5 C' j# k! F' b* R2 A1 `8 T: n0 O: d, i
    缺点:暂无# ]0 a3 i- Y3 P4 |9 ]
    ( k4 R' J6 \- S7 a, }: [* e0 T
    :return None' w0 c, g. P5 Q6 I3 h' \- W

    ) o% [; e- H: s; nfrom simple_crawl import request: H$ I# h/ a: `" l4 }
    request.parse(
    : j% L' g4 j! `; a! }        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],8 T2 \, e7 y6 S2 h
            #login="taobao",/ S) A, y- T. l
            type_url = "text",& a$ ^; l8 \$ X  E. O  @
            Parsing = 'xpath',/ u7 i6 M+ {) B& n7 U
            label = {
    4 `- T6 T2 Q- a: n            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],: D5 v4 p% X$ y7 [! M
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    ; [8 l+ n* ?4 q            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    4 B" @/ M5 f: B: X( G; C            },
    ! v- ]) t) k; F& a2 ?        write='result.txt',
    ; E3 Y' t4 c( n- |* ]        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',6 q8 Y/ D9 L8 i
            page=[True,"now_url.txt"],
    " P: U5 L9 i' `  D" h( }        #clean=True,
    4 f3 M; ^4 T1 r, A$ s1 T        texting=True," a8 d  `6 U: ]8 P( l8 H
            # sem 参数为异步引擎数目,默认为5$ b: j7 q8 F! j
            # 其他参数同上
    " N) P3 T; j/ K, ?2 `        status="aiohttp",; M9 f$ j  O/ |: l: r: _  s# E& R
            Thread_num=3,
    0 i. r8 W( Q; N8 M" @( o' y6 }        sem=5,6 y8 ^9 q) \5 q% ^  H
            ###
    " b: z+ ?. j7 ?; x        write_SQL={
    " n4 h' j  s: B" T2 Y* ?1 z            'host':'localhost',
    8 ^3 Q& Y, @, U5 O' M            'post':'3306',- ]! {* t8 R# D: k6 P/ s
                'user':'root',
    ) ~) }) ]3 X% {, B) h' j# w$ \            'password':'123456',  m1 c. O# Q. }3 J2 L4 A  _- w0 {
                'db':'example',
    * f$ ^, O1 `5 h# C4 `4 v            'table':'example'+ o. m8 n$ z& u% g$ J
                }
    " I# J/ y8 O, m6 `).run()
    ; M- o+ b' {/ u8 j  M3 a2 G! J3 `+ N0 f4 B
    第十三种玩法:异步多进程爬虫
    7 j9 n# J+ q/ W/ |# K# c% A/ C6 c特点:% ?. Z. _  U* g4 o
    爬虫速度加快,* }* m8 ]6 G9 m2 O( p
    异步使得爬虫无等待时间,
    / `! j/ ^6 w$ S同时使用多进程速度明显加快。
    " j; \, C4 h3 [! K1 Y. [/ b% K# X! w. Q$ ^) a& l! m
    缺点:暂无
    ! i1 e$ L/ o6 x7 J% N/ d1 f6 g- }3 N: o, V
    :return None
    , \- m( e' W- H2 j6 i! ~' V( D1 b. h6 E" V% }+ o* h8 t! {; }
    from simple_crawl import request5 q& L! S: k7 ^$ P6 B
    request.parse(* r# n) d. L+ z& p9 V% k
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    6 d6 P( r2 a! w4 _! R        #login="taobao",9 [& \8 U/ Y% ~5 y
            type_url = "text",  m' z# [8 ~9 X" Z- T7 _2 w3 A/ n
            Parsing = 'xpath',$ T* I) _! g8 l- y# O
            label = {
    0 b( a: b8 u- W$ V% Q' B8 E            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    6 c& K- V3 y6 Z) u            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],. j- G/ j' d- r  C
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    1 M2 e3 Z4 \9 E- J) L' U            },) z) C2 }; O0 C9 Q% d
            write='result.txt',- O% Y, B3 h8 m4 j( q( ^1 `8 W4 ?
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    - ]7 I6 @6 f, k5 E& c1 O        page=[True,"now_url.txt"],; E; }3 D4 D4 }( j
            #clean=True,
    # V6 l' z8 h+ A        texting=True,7 g0 H( A+ h  m3 z
            # 参数如上
    $ C6 y6 l& a8 a+ O6 b: G        status="between",% a* _5 k, Y" e: N! X) }  Z
            cpu_count=1,
    % n9 e9 b- r& h$ K6 c+ v; p        sem=5,( ^8 D& A2 u" }; v4 g
            ###9 I" i& v) C6 \
            write_SQL={
    ; E* h% w  e* C2 A; f9 A' P; j            'host':'localhost'," i  ^7 ~! p/ D# [) B3 }5 ]
                'post':'3306',+ A: z4 y9 X2 z7 _; ?$ g( o: U
                'user':'root',
    ! ^8 l- {' |) Y! A7 y& ]            'password':'123456',
    0 z  Z, r9 l* X            'db':'example',
    2 E3 f! d3 ~* o, t8 o            'table':'example'* A! o* V& d- s/ v" u
                }% U7 A7 b( r% M) u# O+ g
    ).run(): c% G7 Y+ t, y5 ^3 b
    ' a% y7 C3 t0 X! d# i
    9 ]; T9 e" G. {8 j+ e( y0 W
    功能介绍完毕🤞
    8 k# X7 T+ b; _  @最后还是希望你们能给我点一波小小的关注。
    " _2 a$ K; i3 k2 N0 O% s+ O奉上自己诚挚的爱心💖; Q' T, u  [' w  |& U
    ————————————————$ f1 U1 ~9 b0 C- B0 G. |
    版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    " X: W& A6 O9 a* `) D( L: ?原文链接:https://blog.csdn.net/qq_45414559/article/details/106005684
    2 T# N1 h. D; q  c: p' \! A% o: [
    $ ?  x, k+ k  S" R3 o; B. f& f
    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, 2025-9-24 04:40 , Processed in 0.889666 second(s), 56 queries .

    回顶部