QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4368|回复: 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_crawl9 q& c4 J; r6 b9 ]6 E0 A
    simple_crawl& Z( w6 x. Y* i" X) n
    仅需一行代码即可达到爬虫效果
    ) t9 T+ b# c! b$ v( [2 |8 Q项目地址(欢迎star):https://github.com/Amiee-well/crawl- g, I9 R/ e9 M2 z# b3 P
    使用方法4 {3 w5 [5 j6 W6 @, V
    pip install simple_crawl
    # B. r6 ~5 V# |- _5 I4 G
    6 o" h) s3 h- G$ [### 以下源代码为简单介绍,详细功能介绍再源代码之下
    $ w7 N+ x8 R- M5 T! {from simple_crawl import request
      [5 x$ d- V4 |2 y- Nrequest.parse(
    + d0 v. @$ K- S        # status 参数为运行状态,支持单线程多线程多进程协程以及联合* T1 V% b( k- E- ?8 z& I
            status="aiohttp",* \! @* v* m" u' V# Y  J
            # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式
    ) N9 D5 p; k* w4 @" h        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],$ I" K& I4 n3 s+ k
            # login 参数为获取登陆信息,如淘宝等网址需要登陆信息$ h! G! e1 P  e1 G
        #login="taobao",* f/ v+ T' B% o6 E2 K& Z  M; o  I. H9 ]" W
        # type_url 参数为返回源代码格式,支持text和json,默认返回text
    6 l# e( v8 v* Y5 T4 r! S: c    type_url = "text",: S) M5 b  @/ \& p* V8 l4 N: a
        # Parsing 参数为解析方法,支持re、xpath和beautifulsoup
    5 @, {" y# u) t    Parsing = 'xpath',
    # [. O2 z% c: r8 Q7 z    # label 参数为爬虫解析过程,字典格式,详情见下方  n2 r2 Z2 M2 D# Z0 C. \
        label = {
    - }- H9 k" |7 o0 ^% [% U            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],$ m+ z0 g2 ^' B" _4 w3 v
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],* _3 }& ~8 P6 N* d3 y  h
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]2 F3 A( n7 r5 T, a6 f8 q; ^# W
         },9 u$ X! z7 n6 B0 s
         # write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱$ X5 J( z6 q8 @7 j  @
         write='result.txt',
    * M! Q6 M) B6 U+ r* U/ z     # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫, u# t' l  W  ?! Y9 ?
         next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    " F7 O6 M9 L, X- T$ R8 Y     # page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫
    3 _! V( H1 K0 C& X# e1 S     page=[True,"now_url.txt"],
    + ?7 v+ V3 V' _4 J: H     # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息
    3 P1 j3 Q) Q/ `) L7 i6 _     #clean=True,: B# |& l5 \" x1 G
         # texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序
    + ]* {! ^9 E9 F3 F' G6 n     texting=True,
    6 z* {$ t- K$ e" r     # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态+ @$ N. i) k) _1 L% i
         Thread_num=3,1 p$ G& l& c; T6 ]8 I
         # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态
    , C: P! Z4 a+ g+ z3 {     cpu_count=1,0 r2 ~  i7 a; h. G
         # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态0 ~: h+ V9 ^; f# I5 o1 c& V! l7 ]
         sem=5,, C8 J* Q& ~8 T) l$ _3 M0 d
         # write_SQL 为是否写入数据库,默认否$ S  r( `+ B/ m& A, [  F0 e4 p8 C( O
         # host 参数默认localhost6 P0 Y# Z9 Q6 i( Z' u  M
         # post 参数默认3306
    & h$ N; {4 ^; u0 Y5 ?& U5 y     # user 参数默认root
    7 l+ v7 M. j. S' f4 P+ J2 F     # password 参数必填,必须正确
    + B; z+ q7 D( V* L9 ]: P     # db 参数为即将存入的数据库名,若不存在自动创建
    ! A" `' S9 {* Q( |3 G/ K     # table 参数为即将存入的数据表名,若不存在自动创建
    7 {% g: X2 P" w     write_SQL={, D3 w1 k8 c" Z; ]  U2 \  I
             'host':'localhost',
    $ t$ x; \5 B+ s( v4 _& ?, h3 B7 U         'post':'3306',
    2 W& {/ X+ ^6 ^+ m8 k- k% y; A! \. G         'user':'root',8 h7 Y0 f+ n( s, U! d
             'password':'123456',
    % W* L; c1 ]! n, N) b; B! w, y         'db':'example',
    * x3 i1 Y* H3 @6 r         'table':'example'% m/ C. u$ F% I& g! s( L! v4 O
          }! j3 F9 p  D0 ~
    ).run()
    5 B$ ?5 u0 z6 t4 |8 t1 M
    3 ]; U/ i, @. Y5 O1 W. n! D介绍一下crawl参数设置:6 |+ O/ K! X8 J/ X8 \7 J
    . N$ c) Y- l- _
    '''' k* i# G) `7 e5 R- J2 o* K" i
    单行代码爬虫程序执行; L1 B& u) u6 Z6 @. v; ^: w( v
    :param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档
    4 }" ]* u) q  t:param url:即将请求的url地址,仅支持get请求4 |+ E5 d( \+ q# a1 s7 ?$ b4 a& _9 L
    :param type_url:请求url后返回格式,支持text和json格式返回
    8 h& C7 s5 X0 m; m) s$ O' h! q# N: B:param Thread_num:即将启动多线程个数,默认为1单线程4 O; ~+ c/ n, d! J2 Z! c
    :param sem:协程信号量,控制协程数,防止爬的过快,默认为5
    ; n! X1 M/ e3 G1 \:param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半+ s' o* F+ J* s  x; a) H5 o
    :param login:模拟网站登陆,保存登陆信息
    / b2 M; w) k2 A- p! Y4 B' w:param Parsing:爬虫方式,支持re、xpath以及bs4方法
    0 L/ j* \8 y9 S* Z8 L. t:param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,( }8 H. V5 w5 ~, z
                           多次报错结束程序,默认否6 h# f$ F$ ~" N. S9 J4 A3 j, m( ?2 z
    :param label:选择器内容,字典格式保存,; s. Z4 \# ^; M* c0 ]
                         字典值为列表格式,第一个参数为选择器,第二个参数为转换类型+ D4 W* L+ I: F; L" O0 R/ i
                         第一个参数必填,第二个参数默认str类型
    5 j5 }4 }4 V& n2 x:param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否( z  X5 h5 _: |" i5 H* f
    :param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫
    8 q' l: ~% y/ i. m1 ~* g:param page:是否选择断续笔记接手下次爬虫处理,默认否. C: ^0 ~/ A- @: T/ m9 l. L# G
    :param clean:是否进行简单类型数据清洗,默认否
    * u( _7 U! M( \* L; ^2 y  U:param write_sql:是否写入数据库,默认否. b+ S& H6 [& j! |0 X
                             'host'默认为'localhost','post'默认'3306','user'默认'root',& ]; y8 f4 g# q5 P
                             'password':'密码','db':'数据库','table':'数据表',: z4 I# Z. J9 R# `' y+ q
                             检测库是否存在,若不存在则创建,若存在则直接插入,/ t5 r& V" P3 p8 Y1 S
                             检测表是否存在,若不存在则创建,若存在则直接插入0 [; C, d' Y+ T, ~1 o2 I  H
    :return True
    ! \# y  f  s$ h) O3 Q1 X! i" \'''
    9 V! y' @7 S+ [9 H# X- v介绍玩法4 i4 f4 M; ]5 e% Z' C' W9 K
    接下来介绍的均为调用第三方库的情况下运行:
    # n1 j' j  X1 W9 P' f8 u# I7 t- S8 P9 `
    from simple_crawl import request# X( x) N( ~  o- l0 r) X0 ^2 H" Y8 l
    第一种玩法:输出源代码0 ^  U: {- i* C, Q( s3 H2 e, {& ?
    调用requests库进行源代码请求。
    % f( B! ]+ `2 o- m- D
    : M4 J- H" q3 e, \特点:
    % n. ~! I2 `2 n- w# F! o# e请求失败则调用ip池处理重新请求访问,
    5 r, f- D# G0 R( ]; g出现五次失败默认网址输入错误。+ I) {& T( w: h7 q+ y* F
    支持text以及json字符串返回。默认text。
    % n. \6 a0 A5 f7 h. b) E. T
    + m1 R9 X; z4 `2 U缺点:
    0 P& d" I+ C! S! u* ]暂时只能进行get请求,不支持post访问% q1 k" Y( c; U& l7 w" P( D
    : m, \- P3 {! T+ S; Q) a3 s) T
    :return text or json3 R5 z, F) m; N" Q* F. g# ~
    # c4 M  \6 ~* U' `" z
    request.parse(
    % p( x' J: N; k+ U; M; c        url = "https://www.douban.com/group/explore",- g/ r0 `5 {2 m: `+ K, ?- A
            type_url = "text"
    2 `: P/ {8 @7 w: @& f/ N* v).run()9 i2 h& p2 [5 N9 K3 Y) n1 X
    # return text( h+ d' L+ B  A; w. ^
    9 L3 t3 e* j1 X
    第二种玩法:模拟网站登陆并保存信息
    / A$ h$ I! F* V# }. j调用DecryptLogin库请求登陆访问。
    5 I# Y. f* s! C; H
    - V/ k* q5 I/ jps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源
    / G7 g- L/ T0 m% Y7 q在此放出文档地址
    0 _: {+ ~; I  b2 D2 h. wDecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/
    ; k/ d+ m# `/ ?
    7 `% f; J( w* F. W1 D, p! L6 G特点:
    ( x( ?0 `0 y; z2 ]$ M0 [将DecryptLogin库中二维码继承到此库(非二次开发)& J- r! |) F" O' I6 |# Y3 T9 v
    支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆)' k- ]3 y" Z; U6 z
    保存session.pkl信息到本地方便下次登陆运行
    ; C3 @* K$ S" N$ \& `3 i8 y7 z
    缺点:
    4 H; l9 W. e- X0 Lsession.pkl登陆信息过时无法自动删除。/ m# ?1 z; ?- p4 U1 J7 R7 |
    导致下次登陆疑似cookie无法正常登陆。
    ( Q4 Q0 K- t+ q6 [; L0 l1 a/ \/ F' U1 Z( E! t( R: K
    :return session9 x/ [; C9 w. i; V* h

      ]7 ~# p) ^/ T0 d' @' f1 Frequest.parse(
    & w7 w: r" r% ]9 b8 t+ c        # 臭不要脸的推广一下我的店铺
    ( M0 S4 A$ ?) f        url="https://shop574805287.taobao.com/",
    3 N; R4 F7 R* |$ M7 u% ?        login="taobao"+ E7 g+ r' G; h5 ~* w* }
    ).run()
    # L# }# S" J  V/ \" U( }# return text
    # H+ D, T- X7 u' ~9 W2 }' d. D
    * A/ V& a% c  j第三种玩法:爬取网站信息
    , X! C6 W% X, s8 x" E! r, ?* ?爬虫库自然少不了爬虫的过程
    6 ?/ \1 G  y+ `; \/ s  ]/ _& u5 m' p; x
    特点:
    ! Z4 P* H( H; d) t6 U' x支持re库,xpath解析以及bs4选择器。0 h7 w! o: s5 Y/ g1 x% `0 u
    爬取方法为字典格式。单方面输出。, C' |5 S; ^# b( K1 e% s
    字典键为保存的字段名称。9 Y# ?+ l; O- b6 `8 h
    字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。! [" b& N# T, w: A3 a* E- }
    ( V$ ~# N+ Q! t- V4 o8 f
    缺点:暂无(等待小伙伴们发现)
    & H9 u2 d& @' o0 ~
    & U, X* x0 w: o$ r$ U% S" T:return reptile_results. B7 C* @  S8 h! t( H" K

    5 n- r& ~2 O1 Z6 D# @- Y2 ~request.parse(
    4 P: m! G# h3 R" X' R3 v        url='https://www.douban.com/group/explore',: i% U  C# ^* ]. t" ~0 L8 {
            # 字符串格式,选择器方法。( Z1 T$ k8 m. ~" \$ H
        Parsing = 'xpath',
    % y8 r  W! Y/ c3 s+ o    # 字典格式,参数如上。0 e: n8 E9 |% Z. T8 _0 {( b
        label = {" ]; r/ P+ q/ e& @; C5 `- }/ o
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    : }- c! e( b; W- {& w3 j        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],2 `" i  H  L' s1 Y5 I: P9 h( n
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    4 ^: u5 v: K4 ^6 o7 ~+ c. l        }
    9 b1 Z* `6 W  P' G0 I).run()
      _: C; c. j+ ?3 z( W# return reptile_results(list)
    1 I$ k* ]+ O* [$ z9 B
    8 d7 l& E" U  z: X0 n第四种玩法:自由保存信息
    , c# D: N/ a+ L6 O+ N# U8 I目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。( {# |2 a; ^' v* _% [, X
    $ [+ |6 o. E+ ]1 G
    特点:
    6 y8 R6 h- v. }; Q9 B写入文件均为数据格式传入文件。% m  [) c* W9 F/ R  l( n. W
    且输入格式规范方便阅读and省事。' e; q0 P4 d) X  c) G. ~+ U

    ( J& L% r6 l. v: C  _3 l; @4 d缺点:( k5 g3 D  X  i
    保存格式仅四种,
    % j) U2 V# q2 @+ q. f: \) f不方便用户之后读写操作。6 K0 O; R# C$ E% y# ]

    ) |' L3 c& U' s; Q5 ^. z" G1 a:return file9 c9 x" @; Q$ J2 {

    , c6 h: `/ A5 _1 Arequest.parse(
    6 g- J2 k- w, e! E  _+ k        url='https://www.douban.com/group/explore',8 [& ~4 d3 M. Y% o8 \. Z0 h1 R! O
        Parsing = 'xpath',$ g* O/ w! S2 y4 L
        label = {
    - t6 S8 b: t7 q* p4 y- R        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    6 z# M% g" x, ^4 q$ [: b2 j+ G        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],* f9 {# l. P' K8 |- u
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]" W+ c; X+ {6 N, Y& F. t7 E' I# b
            },) D6 s, i" C, _
        # 字符串格式,具体保存位置填写# {1 J/ H, w3 Y% k3 U% o0 C0 E- }3 t
        write='result.pkl'# G* J+ v9 _* i* G
    ).run()
    6 D$ J0 D' q6 q. v/ j- z4 X# return file, V* H; L1 |$ [2 ?9 ?. g7 B- d1 I) v
    ; D+ v$ m, t0 Q/ S" k; t! Z+ o1 l
    第五种玩法:读取下一页 url 地址继续爬虫
    . w  z  Z# X$ |5 q' q+ d这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~) W, ?# T  X) o" U" K" F. y
    7 T! m# n% l. q, ^5 v% y) b
    特点:
    , N+ H  L. M1 I0 ^& Q: ?继承之前的Parsing参数选择器选择方法。4 j6 C" L' j! X0 j2 T2 i- U+ c  Q
    在这里可读取到解析后的下一页 url 网址。2 ^6 O# r! u6 O" T* e/ |/ Q
    方可继续进行爬虫处理。方便用户使用。$ m# d/ Y8 }' l8 F# s/ d

    9 v! U! |) Z7 z2 Z6 m  W缺点:
    ' T3 Z# h! f  l/ m) l* U  L+ S若爬虫时下一页 url 地址改变,便结束爬虫。
    & a* u' c: v0 x+ F只能爬取所给 url 地址中的信息。
    / Q* _" A1 m7 W& s0 g& \) m无法进行某一界面的多个网页爬取返回。$ q* @+ r- H: i, U& y* h( i
    造成访问页面单一流失。
    2 N8 X. g( H7 p- S7 K4 P
    ( g" q% I  ]0 p& A' E:return None
    + [0 f+ B( C: n4 e$ U
    3 W( t/ P" G& d" l! L, Crequest.parse(& L4 r- p! N" o/ R' M: B
            url='https://www.douban.com/group/explore',$ S/ E4 ?+ n1 n) V% ]% Z- S: S* k) x% P
        Parsing = 'xpath',
    / h( ]% \, t& \' J    label = {" q! z; b. g% M0 H4 j8 d7 `9 k: c
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],1 E, L4 b/ @  H( I
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],8 }8 @& t2 d  D8 u+ a
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]" X3 d7 n$ I$ Z" q
            },
    7 a+ S) b. n, Q6 p, `    write='result.pkl',( ~' n5 \$ U& y& w- [7 \
        # 字符串格式,根据Parsing方法继续请求下一页a中href
    ) b8 c  Q( c- L3 E- ?    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href'," G& [. b& A" r" y0 t8 K# E6 S
    ).run()0 ?5 @! T  v5 Q6 S6 m
    # return None
    8 b% P" ]9 Y* f
    9 G  n$ z  T& u+ B3 g7 f, v第六种玩法:爬虫网页保存
      Z$ u8 h2 Y7 I( E听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!( R: @" `  {( j2 p
    # W, n8 }# W/ P- a  y
    特点:
    ; n' H1 h( P( @' ^$ O' p持续输出断续笔记。8 Q, `3 U0 q3 `7 E5 ~& }
    将此次爬虫的 url 地址保存到一个文本文档内部。- S9 h5 z. _' L+ K6 g+ h
    下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。% e  N8 T# \( {6 g

    : @) Z5 I" {  Z* U( |缺点:. ]# E% A: O1 ^8 X( a# l
    读取内容不单一。$ M; A' y+ @+ c
    导致下次爬虫无法正确读取上次爬虫留下的痕迹。
    ) g& Y2 S3 x& x0 p! d9 v3 g) I, T
    - L  x( K: X  W9 N:return url_file
    + q% B/ U7 r% E; p" D' o$ D3 i% a* D3 w$ \
    request.parse(
    5 T! I! N, m5 u) S& c    url='https://www.douban.com/group/explore',+ V4 \$ Y$ e1 {( r0 k/ V
        type_url='text',% e0 O2 E# M9 ^: H4 S) ^. m+ v
        #login='taobao',! Q, N4 @' J& S6 o- H
        Parsing = 'xpath',
    8 x) e0 ]" J9 U# S    label = {! _) N% i6 B# `6 o6 N
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    8 l: ]. l# s) z$ N4 ?- V& ]1 K& ^        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],' y6 n% O, S7 E( |
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]: T  s- W5 ?9 X0 s! p
            },2 o4 n% U$ F/ V2 H  |* _
        write='result.pkl',5 c" q- a7 R; H1 Z- H9 S/ P* J' e- J* [
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',; n% T- K3 A: M$ z
        # 第一个参数为是否需要断续笔记。6 Q7 @# ?* R% ^4 Z0 @
        # 第二个参数为断续笔记保存位置。( A8 ~; W, S% ]
        page=[True,'url_page.txt']
    5 r; j8 h4 p+ w- o).run(), C, w0 y7 J/ p
    # return url_file) p6 |" w7 n+ n3 P' v

    ; t3 u7 J8 ?2 h5 U第七种玩法:简单数据清洗
    5 `2 m+ b$ `1 v  R数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。  [5 x% b/ Z3 E9 i

    1 ~2 \( l) I3 ^" Y- q- x$ n* E% w3 r特点:
    7 T4 H* m0 N. i, O$ Q+ B2 o  U本人曾写过一个底层数据清洗。) q: S: C0 m$ S6 T6 U
    能将列表格式数据进行归分清洗。  s! x3 }$ k, ?) U; x8 X
    主要内容请参考另一篇文章% X/ C2 e5 u0 C( y
    如下连接:数据清洗
    % D$ C5 ], y, E+ e8 D, D  i$ l$ t% z; A% W. p* y: F6 l5 N$ R1 ~
    缺点:$ {; Q+ y" I: U" l
    数据清洗格式简单。
    ) d, w) u$ T5 l. {数据清洗内容单一。
    # D: h9 j" ^. O  q  s无法完全做到绝对清洗。5 O0 b6 g, N& N) X$ m
    有待改善。7 \/ g* L6 Y! ]" g% k' v5 r
    ; T' I; h! t9 H9 H. ?# ?4 B) Z, N; l! Y
    :return keyword_list, value_list
    " ~6 Y: k+ `8 r; e# d* I$ e% O( U" X7 R) G3 y$ F
    request.parse(% e+ B8 E# r" K/ g' h: e/ x9 O) L
        url='https://www.douban.com/group/explore',
    # R5 K, C2 H3 `' T( ]6 R1 l    Parsing = 'xpath',
    & d! T; E# J  T$ r! e: V& ^    label = {
    . h& ~  ~0 U' t# k2 j3 Y1 P, d        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
      c0 O/ r0 Y# ~4 I* D        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],+ p0 h' H4 o( k5 o
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]7 Z/ f$ s" o! S; {' x5 `
            },* ], x" v6 x, u1 z# j
        write='result.pkl',
    * {8 _- ~! P+ z- o* k' h) M; L1 n    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',, p8 X# b4 N% y! u( M$ K
        page=[True,'url_page.txt'],  {* J/ g9 K+ F* y2 M" E( u% M) K( ?
        # bool类型,默认不清洗) s- o5 W, @, r; U! b7 r5 E, _- y, J
        clean=True( q2 R. Y6 Q. A3 x% Q# Y
    ).run()( i' D2 ]- z( _& c) X: o

    2 v! f8 f% j* d4 |9 Y: f! m第八种玩法:爬虫存入数据库
    + u) l0 A4 W0 t, \) j7 Y8 Q  F存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。9 f& E' D8 p5 y3 C% ]3 N# M

    - I( {+ L" T# n5 U2 d特点:
    . i+ c# D' t# v  V8 M8 O信息存入MySQL数据库。3 b+ `0 T3 w: ~4 ?9 x2 @" @
    可连接docker远程数据库。0 E' V; @5 Z- @+ _- T9 I: A
    数据库的库名可以不存在。, N3 J2 Z3 R$ ]  w
    数据库的表名可以不存在。
    ) S, ], H2 V$ \- ^- x* l根据之前传入字典键与值参数判断表类型。* z9 z9 o8 r' e& \' }( N4 B
    自由建立数据表传入信息。: Y; m( @$ \) v9 d6 g& d" B' q

    " v9 G, _# |4 D/ K, G5 l缺点:
    " g; H# Y/ {, d4 z3 s, X! w仅支持MySQL数据库。7 U$ [4 x2 d/ y; u  I# V' q

    : ~6 j7 y" c/ F; V:return SQL
    ; w9 g% z3 Y, S  \4 [3 A/ `- J, W" `* M5 z9 U
    request.parse(
    0 T+ ~8 R  c" Z# j8 f/ ^    url='https://www.douban.com/group/explore',( M/ L1 r* x% W# y. D8 V: @
        Parsing = 'xpath',
    7 s& Z+ t8 x) z, {' o( ^/ [    label = {; o% P- l2 P5 H$ v& r
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],/ ~( G2 F* [5 y9 q# ?
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    - }' a% ]3 s' i- D        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    ) l% D- D; G; z4 O; }        },
    ) a! U( N0 R# k' {7 |    write='result.pkl',- z+ \# }" r$ P3 H
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',, h" s# P* ~" h/ \, W. L1 e
        page=[True,'url_page.txt'],/ y" W' a6 l- k# h0 i) t0 C
        clean=True,
    4 z- T& |6 u# V3 V    # 字典格式,
    9 K" q) w  K; U    # host可有可无,默认localhost
    - E; ~) z1 i! J( n" z' [9 g' p    # post可有可无,默认33065 f: @: `" L* t- Q
        # user可有可无,默认root- j& b" F5 @! k8 V6 @1 [  a
        # password必要参数,数据库连接密码: r% s1 k" R/ R. [
        # db必要参数,数据库即将存入的库名5 ~6 I+ j; t2 Z' M
        # table必要参数,数据库即将存入的表名
    1 a5 L+ X2 G+ j+ V    write_SQL={
    2 W4 f+ l4 S) p# ~/ i        'host':'localhost',
    9 q4 w+ [% H  g( A9 S        'post':'3306',
    - Q4 r% X& J: _. E% N2 ^* Z7 v/ j        'user':'root',
    5 z2 c$ d# n8 V6 M        'password':'123456',5 A: y$ q6 d/ R
            'db':'example',
    $ l5 Z% q  e0 H( M; U        'table':'example'
    ; n$ w* \- S9 B$ R9 K( B" j, x        }: }  m6 L0 D! {+ m) ^6 c
        ).run()1 y" h: e1 d( Y7 L, z

    4 d. S+ Z, u6 W第九种玩法:重新启动爬虫
    & X# }5 D3 K/ {' z# {7 B; I3 t爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。
    ! w, ?4 D: @! B' t5 q! `
    # n5 @2 ^  P" H特点:5 c8 R5 C# D8 f
    检测报错重新启动爬虫
    " c# W  Y8 ~+ h1 X+ U0 u5 T无需手动处理错误信息
    $ {+ w8 M9 n* G% k
    8 [+ E' `; B' P# d& g/ N# V6 d缺点:; G( T0 q- c7 }2 a/ d
    无法收集子线程错误。2 m0 _# j0 i" }: n, h! r9 E
    % x0 I+ Z" D3 r. ]. l6 _5 q, j3 P
    :return None
    4 [. _6 g' r  |! T/ |. d9 c2 F
    * z" X5 i8 }9 B3 F5 ^6 nrequest.parse(" a& W" W/ t* s% T
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    * Z( U  T' H2 t4 L; |: p3 B9 E        #login="taobao",
    & @: E, F' Q8 q; I        type_url = "text",
    $ Y* n1 t2 ~+ b        Parsing = 'xpath',
    ' ]( @6 N. o& _  D2 H5 f        label = {: A. Z, w. O3 A3 G% w" O
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    ' Y# k( C  q9 @# `: W& v1 ]; w" }5 `            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    ' k2 i* o3 \8 D! i* e$ c) s5 R            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    + ?( e, T4 D7 x! R" z8 B            },
    7 ?3 n  R9 J6 _( |' r" H        write='result.txt',
    ( U- J1 ~: b, X1 B) |. N& t0 N        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    " J: A) r3 l, d5 }$ u0 ?2 W! K$ s        page=[True,"now_url.txt"],
    ; U, ]: O2 H# T% s        # texting 参数为是否启用连续爬虫
    : i! t  r0 H; W7 @) K/ n        # 爬虫程序异常报错后重新启动爬虫
    # Q3 V8 h" i$ V$ [        texting=True,$ S6 Z0 {; ]" [$ r% E% v
            ###* Z4 H' i" |) D- P) c
            write_SQL={" r' u. |5 }9 |. `  p- {; _* Q( q& ~
                'host':'localhost',
    - s7 F3 k; N9 `1 y            'post':'3306',( H* ?) w  f' `  L% ~  t0 P
                'user':'root',4 {) J# p+ |) y+ e- z
                'password':'123456',
    ) ^! D! `: K2 c: e            'db':'example',
    + w0 P* \+ s' }( c            'table':'example'
    ( e: X( u1 T: t$ i# [2 c9 u            }  c8 G% y$ ?' k( j; ?$ X
    ).run(): z4 p. U' P8 L; n
    : Z4 |& g* q6 \- N/ z& U
    第十种玩法:多线程爬虫& a5 l" n8 j; q9 v5 z4 r1 x) x0 e9 `
    特点:
    4 P. n- o' T5 U+ ?5 L- ?爬虫速度加快,/ O4 ~9 C) h& u# I  m, ]; `
    更好的利用了线程。  b! S& T0 C# J2 q; t
    ; P: C  U0 @; ~) V, C" @  G
    缺点:暂无
    & t  p- Z) v0 K+ _; k, i% x: I. e1 z( l  L
    :return None
    * F  Z+ o# y6 X# @5 h
    4 b4 V) h5 ]" Z. |2 prequest.parse(
    ( M! H7 N/ f5 {4 L- ^4 `( m* f        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    1 p6 {5 e& K* T: c" E* Y        #login="taobao",
    + p6 x; m( ^: ]1 e: A& C& k        type_url = "text",
      F' k9 k# \# u7 C        Parsing = 'xpath',
    & c0 U6 n6 F2 n6 o- T8 a7 H2 W2 A        label = {0 G' |/ |/ M$ o$ E7 I, |
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],1 D' ]' d  i+ s' r
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],- T7 J" @+ G  `  M. p0 L
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    / i; K/ F% W9 W) b; p* l            },0 I- l" Z# e$ r5 n; P/ I
            write='result.txt',7 F- z1 I. y3 ], h# }9 `
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    # ~1 W$ E0 p8 X  r( s7 E        page=[True,"now_url.txt"],
    1 k$ T! s0 X5 w/ H5 g        #clean=True,
    ( T6 X6 Z1 h- k        texting=True,
    & Z1 n! W. T* ~+ ^4 V3 e0 Z        # status="threads" 启用多线程爬虫9 W& d6 d2 S  z) U4 _: B9 }
            # Thread_num 为线程数目,默认为1 单线程
    # n. L1 z/ P7 H7 ]        status="threads",
    5 d: w0 b2 b. U0 ~. r# f% w        Thread_num=3,
    8 E+ T: d7 v7 L% F        ###
    & M, n" h& L2 a( M        write_SQL={2 I" H6 x+ n. s
                'host':'localhost',) A. Z1 W8 p3 V+ n1 `2 Q0 p
                'post':'3306',
    ) Y* C# Z+ `8 A3 d/ a0 g( `            'user':'root',
    % q7 S  @4 B) T; v7 m            'password':'123456',
    3 f' k0 V7 P) Q+ R$ C            'db':'example',
    4 ^& t8 X5 \& X4 C2 x9 m2 v* m2 `5 B' r            'table':'example'
    $ q0 ?" y4 A& O) r0 C            }
    + p! D1 w5 {4 K, N; k8 l$ P6 x).run()' @' c' s& Y. I3 D( C/ A- q
    " x( \8 {$ Z' K; f0 D5 q9 f
    第十一种玩法:多进程爬虫0 L) U: ~4 i* E& p9 I1 k
    特点:2 S. z& [+ S4 ~: ~* P  p# {
    爬虫速度加快,- N3 v) f  z# t$ Q7 m5 `" r$ T
    更好的利用了进程。
    % N/ b. Z5 Z: F3 g3 _' C- q4 X' Q& |1 ?$ j
    缺点:暂无
    4 d9 n. v! ~9 |# e6 ^* q' q3 |* o: \$ I& [; D! d9 D; g7 n) m
    :return None7 s4 g9 e/ G! n3 \

    ' N- b9 H, v0 H! E" x2 j& cfrom simple_crawl import request
    ! Z' t' H! L% `0 @( h2 y; Rrequest.parse(
    ' x* a2 M8 M: J2 s  R& O        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],4 a. g- D5 v2 e6 m  ?6 `
            #login="taobao",
    - N- n) v, t1 P        type_url = "text",
    # @4 p# _" p4 p2 G        Parsing = 'xpath',
    8 H0 I0 a. c: Q3 }( O) V4 f0 @        label = {1 \/ _% @3 C4 }
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],( w, Q3 y% [9 h: Q2 S$ y
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    $ Q; Z6 X  H# N9 Q' N            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    / X; B: A6 s! g/ v6 }6 x$ o            },/ f( u) w9 @' W' L' G
            write='result.txt',( _6 h1 g: Y. T: S1 H' ]& L
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    & I: b. V4 }) L9 U3 c8 \( z7 _        page=[True,"now_url.txt"],( I6 a# b$ x% i
            #clean=True,
    ' q; O; y5 f; M( d        texting=True,4 O8 G. x) Z0 \( n+ Y& D# O0 e8 R
            # status="multiprocessing" 启用多进程爬虫
    2 t. _/ z% ]3 C% @& P        # cpu_count 为启动代码核心数,默认为系统核数一半, O) T6 Q) B3 ?
            status="multiprocessing",
    1 o8 N0 K, N4 _; _0 K% u4 A; s        cpu_count=2,
    6 M, z3 b. Y: U# z6 U        ###4 M8 n1 J/ x% F3 f' O! |6 A
            write_SQL={6 x: x& d8 r, w6 b7 Z$ d7 N
                'host':'localhost'," X( G# E* H6 H; S" S- ]- D5 `
                'post':'3306',
    1 \. d3 W. s8 n& k. I            'user':'root',
    ) k5 M$ N4 b" K  y) K7 T            'password':'123456',
    ) j. }/ O" q; w" j9 u2 h            'db':'example',
    $ z4 X. I2 y* \" _5 u8 f8 u% f            'table':'example'
    $ k- q  x$ G* R            }  K" ^& B# W$ t$ G; a! k
    ).run()* t6 f$ N0 V# U& ]
    ; I* f- m, ^& q( I
    第十二种玩法:异步多线程爬虫4 G% b( @- Y! s4 K7 W$ B
    特点:8 E" o" B; N! r9 u
    爬虫速度加快,
    7 B( Z9 n" k* ?异步使得爬虫无等待时间,$ w9 J  _! f" g9 q& L6 e6 f9 C
    同时使用多线程速度明显加快。2 ^# R# Z$ E3 P  }' C

    0 f' p% M* r8 r4 O) g% i0 j缺点:暂无0 j& I' _0 L+ o0 z
    8 o4 S3 P/ H! f; ?
    :return None
    # I4 [% q* G' [3 Z' g
      v" w" t5 _5 c* hfrom simple_crawl import request' W7 g; T5 ?8 C/ P6 a
    request.parse(  f% F" C, ]: P% z' i
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],7 ~2 k8 L* M6 K' d
            #login="taobao",  V4 Z9 L0 {+ X6 [
            type_url = "text",
    - u7 v9 h% T4 s/ b* P6 y        Parsing = 'xpath',9 ^4 C- m% D3 ^+ F. I3 H, {
            label = {
    - F4 t- @2 F6 W- S- ^            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
      f- o3 ?! v/ o            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    & I8 G* I# g+ p/ E0 r            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]3 R/ p1 m. B5 [
                },8 s/ R# C" P- x$ [8 Z
            write='result.txt',
    * Q7 s3 T5 j8 W. V. h; G9 Q        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',' w" M" S8 S. S4 d
            page=[True,"now_url.txt"],+ K: p- M- Q# {) O
            #clean=True,/ w& m; y, y* R( H3 \- \
            texting=True,
    " @2 F0 {' c! v( G  X% p        # sem 参数为异步引擎数目,默认为54 B2 E& ?  Z" e: [6 [! d6 \
            # 其他参数同上
    9 d4 t& h6 F8 [: m' }' s        status="aiohttp",9 N5 }# K- b9 i) @8 x2 c. `' ?
            Thread_num=3,: H# o0 A5 {6 }
            sem=5,
    1 V0 N! H4 i8 |. n8 P5 ~, [- a; l        ###/ F5 p7 D+ T- v: q  A0 G
            write_SQL={" m. `5 a. G2 U% K7 m/ I
                'host':'localhost',
    0 i8 q  C7 V: }            'post':'3306',
    ! ~) f; R. d' U$ B9 p            'user':'root',
    7 P% c! ]$ T8 u# q, @9 N            'password':'123456',
    8 R2 v1 L9 k! Y; t# q) Q            'db':'example',
    / h: x' |; j0 S/ G% u3 `4 _/ U            'table':'example'
    ' _' u. D* s. K0 e/ ]+ o8 {7 l2 L            }2 x6 {' x) m$ n. U
    ).run()
    - |5 V* N- U1 S" `# S. G/ y% U) f& a& ~# k  o
    第十三种玩法:异步多进程爬虫
    1 {4 D$ b& V- h特点:
    ! D( r, b) s( _2 `8 C; \! U/ Q爬虫速度加快,# f5 D3 t) d3 x6 [! v
    异步使得爬虫无等待时间,
    ' W+ J1 O, T) C2 o* ]同时使用多进程速度明显加快。8 |# v5 L  R4 A* Z

    9 G6 m6 u- Q3 f  C" m& m缺点:暂无4 h9 x9 F) a" ^$ ?
    # M8 K4 x& I+ n8 P+ ^
    :return None# S, i& i0 e* Y3 z5 w

    $ W" R2 R3 d+ G" h2 Rfrom simple_crawl import request7 P, f; N* n' \1 ]2 v  F# V( j
    request.parse(
    ( z3 O3 |. y& X# V        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],$ t) R* [5 I% s8 h- n
            #login="taobao",# B5 l2 r* x  G( i
            type_url = "text",, ^0 [# C  Q0 [5 F& O
            Parsing = 'xpath',
    . F" @- L! f, i+ j' t* t# J# _        label = {5 `/ H; }8 T8 W2 P6 v) ^' K7 B
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],# }- Z' p8 P, L5 W
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],3 U/ z6 A' t6 p" C( v$ t$ r
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    . i8 y% U* E6 _. Y8 G, C& M  U            },
    4 S" x, K2 K( g7 v7 v8 v7 y, A        write='result.txt',  w2 v9 r+ ]+ b" T$ `
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    4 t4 j. s! C% ?" |' r        page=[True,"now_url.txt"],9 }4 _$ g6 F& S; K
            #clean=True,5 y; q* @8 R9 A
            texting=True,. h- e1 y) l, {2 i+ c/ |6 p& a4 C. ~
            # 参数如上
    * k2 k4 F5 i; u% P8 F; l        status="between",
    6 Z' }! x0 \. z* B$ }        cpu_count=1,
    8 g  m9 C  f6 ^' j4 b        sem=5,
    + y/ q; s5 ^. \( ^8 |        ###
    , J2 r; N7 A% [7 t        write_SQL={
    % x1 q" V% }& V8 u- n7 {            'host':'localhost',
    6 g4 c, p5 w8 H2 }4 r            'post':'3306',) B8 G: g- k, {% Q: p" W8 a2 Y6 @
                'user':'root',
    6 L8 {& M, P3 Q4 E# B            'password':'123456',
    $ B7 G! ?! f6 ^8 {            'db':'example',
    7 ~3 |5 E; L* B2 ~+ v            'table':'example'
    3 {  z3 P# B7 D: h$ r            }
    6 r( U: I/ {4 L. Y) X% ?* |( T).run()4 p/ j" ?0 F# K$ j. t6 U
    , q% s4 Y/ L+ t+ u
    3 I7 L6 D" t) P8 n
    功能介绍完毕🤞5 F, _. h+ A# G( r4 V
    最后还是希望你们能给我点一波小小的关注。
    ( ?" y# f! B2 W1 [/ j奉上自己诚挚的爱心💖
    4 ?  F% A0 n6 _, C7 E* q————————————————
    5 A2 A% d4 \' P6 A6 Y$ l版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。* e1 c+ x% V2 y/ q- Y% A) L3 T# {
    原文链接:https://blog.csdn.net/qq_45414559/article/details/106005684! S6 \$ N: e  O8 B. U1 v: }
    & M0 x' F* L+ L3 d( P# [# B

    ) L+ x+ q# H; o/ h/ k
    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-6-30 03:59 , Processed in 1.464964 second(s), 55 queries .

    回顶部