QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4361|回复: 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( |( j4 [& n% {: L  F5 {- Q
    simple_crawl
    ) l/ X/ |* W) _仅需一行代码即可达到爬虫效果2 Q; R9 ?2 F3 d+ Y% C1 {2 M9 j" q( X
    项目地址(欢迎star):https://github.com/Amiee-well/crawl
    6 S$ {5 Q1 @) H/ ?2 l- W' `7 c使用方法
    $ p7 Q6 I* U- L6 g- ^" q5 [pip install simple_crawl% g& W* w  n4 b. q  G0 X) U. r
    . b$ I* I* B4 p2 i- @% A
    ### 以下源代码为简单介绍,详细功能介绍再源代码之下1 l$ F# E* ]9 }6 R
    from simple_crawl import request
    / B4 q6 P: K1 {6 M) n9 c" Brequest.parse(
    ; ~7 M, r8 B! ^! {( r1 D; b& R        # status 参数为运行状态,支持单线程多线程多进程协程以及联合
    3 g8 h* c& h' f: K, I0 {# E4 d  m        status="aiohttp",, K% \( B8 J$ p6 m
            # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式5 `7 H3 ?' h* D. u0 {9 {
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    6 d2 _" V& J* O6 w* Z, O+ M        # login 参数为获取登陆信息,如淘宝等网址需要登陆信息
    $ I* N, \) |2 x* |* Z0 S    #login="taobao",
    6 Q; I6 ~; `/ G    # type_url 参数为返回源代码格式,支持text和json,默认返回text
    7 p1 [! R/ j: |    type_url = "text",
    0 m  K+ B4 k8 c' n% Q    # Parsing 参数为解析方法,支持re、xpath和beautifulsoup8 _/ B# m  A  d# U. q2 w' _0 v
        Parsing = 'xpath',/ i5 C- E* R2 w# s4 |5 J+ m
        # label 参数为爬虫解析过程,字典格式,详情见下方1 q# e9 c* t5 n  E! e5 w$ n$ d
        label = {( N( Y6 i! f6 p9 x" O
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],6 }# r9 |  f3 |2 r& R% V1 K$ `) a2 p
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    ! r7 s. M  L& B2 B8 r            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    5 ~2 ?' W- Y2 X# X; G     },
    : U8 P3 ^; r; ~# _1 _" Y     # write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱
    " ^7 ]$ e5 w3 C" i     write='result.txt',
    ' A" Z8 X* D9 G  N+ p9 b     # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫% n8 W* w! r4 Q
         next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    ! r; h; ~* {( m) z; ]0 \0 H     # page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫
    6 f& ]" C% A4 |- ^     page=[True,"now_url.txt"],
    ; j* C. s  d' U     # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息
    & }) v! g$ F& P( N+ X     #clean=True,% }$ a, h- d9 S6 W+ @. X
         # texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序
    * _2 Y: Q0 f1 n- j& l* z( X     texting=True,! [' i. |7 Z# H- T- C0 Y5 }
         # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态
    * b0 g. ^8 x8 f1 s- b5 w! M+ f     Thread_num=3,& Z2 k* \4 f& x2 W4 F
         # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态
    ) R/ ~1 y9 Y+ ~+ T. a     cpu_count=1,
    4 D; K5 m$ N/ O# J     # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态; t5 \, X6 V- T* u* \+ }
         sem=5,
    3 {/ M3 e9 w/ c. k     # write_SQL 为是否写入数据库,默认否
    - ~% i6 k4 H/ v/ G( r     # host 参数默认localhost8 m! k8 [9 [% M: i, D
         # post 参数默认3306: C; l7 M5 a. `/ ~
         # user 参数默认root# M$ d6 m* K2 ^( o% U- ?; W
         # password 参数必填,必须正确6 q) O; a0 A+ I! b
         # db 参数为即将存入的数据库名,若不存在自动创建0 ]7 T. R( J7 F( G0 a
         # table 参数为即将存入的数据表名,若不存在自动创建
    - o( e  z6 K0 H" ~3 P) {     write_SQL={
    * h, |$ a* }+ I         'host':'localhost',' |6 o  A9 x5 P' |- \$ ]
             'post':'3306',
    9 a' o$ j: J! L: R7 d* N& _         'user':'root',+ m  v+ F* O: }* L. n
             'password':'123456',, {2 o, ~8 X5 i1 j. ~
             'db':'example',7 B; v* f2 R0 q3 d  L
             'table':'example'
    4 ^# j! G: x0 j5 x1 M( G* F' d      }- z6 u- b' ^4 a- [, e2 K
    ).run()
    1 g& n, ^% y  u+ F& ?. Y  m6 x$ l8 l8 ?
    介绍一下crawl参数设置:( }0 q0 _2 y) k$ f
    ! D9 q& h. p! R* G5 b
    '''  _, _' a; S) d* ?2 L( C
    单行代码爬虫程序执行$ w+ [: W' U# e$ {  z4 c, t6 j
    :param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档
    ) ^+ K& E. E0 B! I/ E0 q! R4 O:param url:即将请求的url地址,仅支持get请求
    & c3 u" r! `. M2 k:param type_url:请求url后返回格式,支持text和json格式返回/ ~3 {4 H: q4 |% M1 A7 V
    :param Thread_num:即将启动多线程个数,默认为1单线程1 u& N0 r3 U: e; P$ }
    :param sem:协程信号量,控制协程数,防止爬的过快,默认为5
    * C  [' |1 f5 Q/ {# K4 W" S: t:param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半/ N- S( U& Z( N, f
    :param login:模拟网站登陆,保存登陆信息+ p4 ?$ m: {7 c' p( r9 M
    :param Parsing:爬虫方式,支持re、xpath以及bs4方法
    - L7 G, c; s: \* L  t) ?9 D:param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,1 ]5 X% r* T) f( b" e0 y# c
                           多次报错结束程序,默认否
    0 c5 ?, x7 d# D- G  c% l:param label:选择器内容,字典格式保存,) _5 ?3 w4 M; u7 c& M
                         字典值为列表格式,第一个参数为选择器,第二个参数为转换类型
    - @: r5 q2 J- E3 L                     第一个参数必填,第二个参数默认str类型5 b7 l9 d7 a+ V7 z
    :param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否
    , |; t: O, r9 a6 m, B:param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫" ?2 P2 A5 _- z
    :param page:是否选择断续笔记接手下次爬虫处理,默认否& o+ j  u- j* S
    :param clean:是否进行简单类型数据清洗,默认否
    / h+ ~2 o: a" Y; b# _2 x: I:param write_sql:是否写入数据库,默认否
    4 k2 @9 s" q( k8 w& x: H7 M5 X. d8 q                         'host'默认为'localhost','post'默认'3306','user'默认'root',
    3 e% ?- B6 c; l  g; q                         'password':'密码','db':'数据库','table':'数据表',
      H1 j# s+ Z6 ^0 i0 {                         检测库是否存在,若不存在则创建,若存在则直接插入,, M9 U9 X0 ^- o$ W: R7 U% ~3 ?
                             检测表是否存在,若不存在则创建,若存在则直接插入/ _( M! n) X" B$ b
    :return True
    + K) [" D  c' q'''
    & C# a, t& Y) K) t$ k( I. }介绍玩法7 l: F( j* F: _4 a; _5 j- R, Q
    接下来介绍的均为调用第三方库的情况下运行:3 T( f) O* Y. O
    1 e" @1 j& r  k
    from simple_crawl import request& N1 E1 y* u3 m  s
    第一种玩法:输出源代码
    & T- {& D' t1 m$ C' K调用requests库进行源代码请求。
    . H) W1 {2 Z9 C# j' D7 t- ^; U) C5 W/ j/ U6 x4 v, s
    特点:
    % n2 \( t% y, l' I: A: X# s请求失败则调用ip池处理重新请求访问,
    0 ]* ^% N: y% {0 M: d出现五次失败默认网址输入错误。
    2 j! f; T- r+ g# H支持text以及json字符串返回。默认text。
      @/ Q0 T4 ?3 n$ u- ]" V. ^
    7 w; @/ `& _' t9 d7 C/ p! y  |缺点:5 {" o; R. o1 m$ I+ i$ h. [
    暂时只能进行get请求,不支持post访问
    * y1 g6 ?; S; r9 D) H% r1 x
    * L. }/ b3 R( A- Q; X% a9 b:return text or json# t7 S5 Y2 k3 e6 M$ ~

    $ Z" T5 M& e( ]1 T; irequest.parse(1 E! V1 n, K( o! P4 T0 |: N, w
            url = "https://www.douban.com/group/explore",
    9 L# _' l$ {4 j        type_url = "text"3 q+ `* F) R3 I! t; ~
    ).run()/ J% {+ O! j0 |% m. c
    # return text3 x- R% U8 g+ |5 ^+ H3 C

    4 _% U# L0 e8 `! a) Y& X第二种玩法:模拟网站登陆并保存信息9 V5 Y) [$ l5 l- R: c
    调用DecryptLogin库请求登陆访问。
    $ s0 w& S% g' r, n8 t) i: {3 P
    $ F' `- P3 T0 ]3 p; l- {ps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源+ k4 t$ {% R5 ]! m5 S# e7 b' m9 w
    在此放出文档地址
    # }9 @8 [' V3 P. x7 u& PDecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/
    $ d+ J& U! x9 E) _6 z: ]/ Z& @5 l( t! W
    特点:
    5 X6 C+ l+ x6 k& P将DecryptLogin库中二维码继承到此库(非二次开发)8 Z6 V- X5 F+ Z. u0 Q, m: o' @
    支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆)8 w/ l* j0 P* q* h
    保存session.pkl信息到本地方便下次登陆运行
    , m( N  y* F1 D! }& z: b. x; {# z9 q7 E: U$ Q9 Q& }0 Z1 P) g: g
    缺点:5 U3 v7 H; a1 C) p8 s
    session.pkl登陆信息过时无法自动删除。+ e2 e7 x1 Q4 L8 X& C0 J
    导致下次登陆疑似cookie无法正常登陆。3 i$ s  c, C! T- D8 |; Q

    * `6 G# v' V6 h:return session
    ; F  v% z' A, {- D* a/ P8 S1 d" Z2 Y
    request.parse(4 d: _1 k; Y0 _, k/ r) V' O
            # 臭不要脸的推广一下我的店铺
    + ?0 c! U0 P$ Q0 s+ D        url="https://shop574805287.taobao.com/",
    9 N/ a* k# ?6 M; w3 k3 ~        login="taobao"
    & h! u* @7 Z; v* I5 k).run()6 x) q$ p& p$ J3 q6 b7 w7 O  I
    # return text
    5 `% d' |4 `& O, b+ f' {4 D+ H2 X' N. e" n* p
    & i+ T; E& B; J  c第三种玩法:爬取网站信息! b5 W5 F0 A5 Z, x* |
    爬虫库自然少不了爬虫的过程
    , L+ U: v( H; H$ ~$ C8 E9 i  J% G, @/ j3 c5 q
    特点:& K9 }5 J1 h4 u9 s# O; ^8 o
    支持re库,xpath解析以及bs4选择器。
    7 f1 D/ h# Z8 K# H- ?5 E( H爬取方法为字典格式。单方面输出。
    ! f; R3 i+ D. o$ Q7 g字典键为保存的字段名称。5 W# q9 e) V, k9 M* \- P8 H
    字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。/ Q8 h4 U5 F) k* b' ^0 D1 U6 h' @
    ! M9 n8 X# r- c" o! n
    缺点:暂无(等待小伙伴们发现)
    1 b" q! Z& f- H, r) K( ~% ]/ p
    * f3 B8 B. v3 ^" S& d1 g+ T:return reptile_results
    7 h4 h4 G7 B" A& }* b* N& s; ]5 W; _" A- g7 m6 V" X9 {( K' H
    request.parse(
    2 n9 J2 A+ m3 n$ u5 x3 N1 ^- k        url='https://www.douban.com/group/explore',( ~% ^4 B# m/ R4 [+ l
            # 字符串格式,选择器方法。
    . g' [) h# ?- S8 m  [    Parsing = 'xpath',
    ( c5 B5 P9 @9 \  E' U3 h7 b0 H    # 字典格式,参数如上。" |3 i+ J6 e3 g2 _
        label = {$ Y# K8 W9 K- e' g5 D% y
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    : U( T2 W. |& K5 `, E. t3 k        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    & i! x$ R7 [+ Y7 h& Y  [* B# p: m) `8 h        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    8 v4 w% w0 o1 H9 F3 M        }
    & G6 @; N$ p8 `0 Y).run()
    * ?+ i* E4 U, ~$ U# return reptile_results(list)
    : N$ d1 @9 O2 O! z7 m1 m" k$ W1 g6 L( P
    第四种玩法:自由保存信息
    ; a1 M5 I* F( `  K* W/ K( {& f目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。. c  l" Y2 O  l% v, q$ ]
    : v  K( u2 ]( L1 M
    特点:! y* z, h; ?' g. ?$ D
    写入文件均为数据格式传入文件。5 y5 E8 }0 H5 A4 R9 G/ x
    且输入格式规范方便阅读and省事。5 Y! s/ Y4 n7 f" Z- M& ?- m
    0 a& g" M4 R3 P; q" b8 g  C; s
    缺点:9 }0 a' H: g, N) J! @5 y: Z/ E
    保存格式仅四种,  b' `9 E1 R1 D# g% B( S
    不方便用户之后读写操作。! s% q/ a2 r* B  r3 k# d

    * r* R; c- [3 t& Z, j; m, j:return file
    8 o/ ^. [! w6 L& f% j9 ]
    * w$ z5 K$ ^2 ^0 C; p( Grequest.parse(" q! o5 ~/ s, L# x5 i
            url='https://www.douban.com/group/explore',
    0 g  b" P2 `- D5 K* {1 j& A    Parsing = 'xpath',- e4 m/ d* ^& H; D% K9 E
        label = {
    $ i' i3 w" {+ ~        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    " M" `& J+ z4 w% P! U" C' z        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    , K, s* R& g7 S* M+ N4 c7 o        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    7 [+ B; I! v# ~# E4 V6 K& I        },
    9 J+ M5 m2 K  {* Y    # 字符串格式,具体保存位置填写
    ! j) q* h3 x5 d" ~    write='result.pkl'2 E' J, V$ D' u) L7 [( x8 E8 e
    ).run()+ m4 G( h: d/ }( v* v: }/ a' j* L
    # return file
    2 n' I% h3 N3 ~+ F
    , g, _! w  I" O  f, Y- L! \- n第五种玩法:读取下一页 url 地址继续爬虫% {, I" r* ^; R9 p
    这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~+ Q! Z' M! N! Q; t9 J0 E  W
    ! a  c# W4 n, K' d+ g: ^# m
    特点:1 P3 U3 {8 L& o+ |  t* h
    继承之前的Parsing参数选择器选择方法。1 i& O$ V, j4 v
    在这里可读取到解析后的下一页 url 网址。9 A1 |' P) b# [; P: ?9 i
    方可继续进行爬虫处理。方便用户使用。
    ; R4 ]8 \' t, B$ I) o2 \% {1 o5 K9 }0 p; L# n% K
    缺点:
    ( W+ p1 D) ]' B% f4 J若爬虫时下一页 url 地址改变,便结束爬虫。3 f0 t' z1 M5 S, Y" \
    只能爬取所给 url 地址中的信息。
    2 k* B& L2 F) h2 a3 R, T$ U无法进行某一界面的多个网页爬取返回。
    2 p* P( e6 ^6 W2 _7 `7 y+ i! h造成访问页面单一流失。
    # B/ G6 v5 u/ D6 u# g: F# |; S  h  D6 Q6 V7 x7 _
    :return None7 ?0 y2 b: _: c# C: u6 v

    2 h% m" Z  ~9 f% o( q% t& Rrequest.parse(
    " ~: @! X5 Z2 M9 S9 R5 a- f* X        url='https://www.douban.com/group/explore',  c3 O% l4 }+ i% c
        Parsing = 'xpath',, `4 I* M7 V' K9 @5 g; `8 z
        label = {
    1 [3 h& ]2 n  f& n: F) s        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    , ^2 }! _0 G" x: X+ S        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    : b- n* A7 ^7 }) g        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    : J" G; _+ K6 s        },
    # }+ `) k( L7 e6 [0 @    write='result.pkl'," `1 V' c5 z, k' Z
        # 字符串格式,根据Parsing方法继续请求下一页a中href5 L9 m6 B) [, Z7 C
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
      Y/ ~! g( _& v0 K* m# f7 p).run()
    / z  T2 F- Y9 X, @7 Y: V# return None 7 s! I" U( z( z) i
    2 m( z* Z4 u8 T* \0 v+ z- t3 x
    第六种玩法:爬虫网页保存
    # I! x( X0 s5 m8 G听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!
    ; [2 ~2 q8 H- B/ {9 c" V& \3 g5 K$ w7 h
    特点:; C* T3 K4 J' R2 k
    持续输出断续笔记。
    ( Z; U- E+ \5 m3 e# w将此次爬虫的 url 地址保存到一个文本文档内部。
    , _8 ^$ L! }( A2 p% G: Z/ H4 c3 n下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。
    $ j# u3 P3 P9 u; K, z/ H8 D+ d" H1 j6 J% z! ]0 s
    缺点:
    + q) ?  [7 |! f; Q读取内容不单一。+ P7 H$ e0 L8 a6 i. ^5 \
    导致下次爬虫无法正确读取上次爬虫留下的痕迹。  w1 H3 W5 w+ w+ S

    7 n& M4 M7 Y( B+ B  e0 R:return url_file) f3 S8 r0 F, C  B* A2 l3 J3 g6 Y
    8 P9 [! W* s8 _( W  E. A. l4 b) V5 h
    request.parse(4 c) m& }" E! T1 B3 o8 Q
        url='https://www.douban.com/group/explore',
    : I+ s& C( j) B3 K    type_url='text',  t# |, O* d, e1 q
        #login='taobao',3 _, h' p  K  d' y( ~4 r4 U/ P
        Parsing = 'xpath',
    0 f$ C9 l0 P1 Z9 X4 u( E, r+ w    label = {
    ( Z0 W& D, b! ^- c        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],+ S# J- t0 Z* e" I  U' M: B
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    $ y9 p8 R1 h: u: s% C0 W4 r" C$ v        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]; `9 u: L. S. H8 p; B
            },
    # \/ y  _; K! P# X) M+ q  n/ l. r% f( g    write='result.pkl',4 I- U- n1 d% l8 H( g6 `
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',( N* r% h1 b2 H
        # 第一个参数为是否需要断续笔记。0 i- D( x" v  t: I; L: `
        # 第二个参数为断续笔记保存位置。% i& m8 k2 N; Q% V
        page=[True,'url_page.txt']$ d+ F4 n* Q" R! _$ d2 k
    ).run()3 S! b, k% w8 e: V" g# `
    # return url_file
    % S6 H8 _: v/ ^/ ]! }9 `$ j8 z! E* a& {$ f
    第七种玩法:简单数据清洗2 t, P: c+ @  H; s' j; {8 |3 z
    数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。9 F8 P# h/ d0 }  J* v1 o! }
    & e4 T! U' a+ u/ r5 u7 F
    特点:# W' X- c4 g$ q+ z* O8 A# H' W
    本人曾写过一个底层数据清洗。
    . e4 u8 y: }5 b4 T1 @能将列表格式数据进行归分清洗。
    " z5 J- {* Y3 j6 \2 ^  m$ f: k主要内容请参考另一篇文章
    9 k7 C& P9 E$ i如下连接:数据清洗( S( m  a* p  o- ^
    , y: X+ i% a' P+ k3 H7 `
    缺点:
    ; ?" l" w! M+ |- o# t1 ]- Q  w数据清洗格式简单。) D$ b3 G' [4 W; C
    数据清洗内容单一。6 R3 F$ ?: }/ W2 {3 |' Y  E
    无法完全做到绝对清洗。
    6 a0 P( n2 H. [* u有待改善。
    ' v' c9 f& E; _1 s2 x) e* T& G, m  @
    :return keyword_list, value_list
    9 n2 M' h  z6 n  v2 A' P3 S2 ~
    % P! M) y4 y! M; H, A; Crequest.parse(6 ?1 Z& m" t1 ^
        url='https://www.douban.com/group/explore',
    ) X9 R% \% |" `7 g/ o, R( @% q    Parsing = 'xpath',5 n3 {: X) c0 N) ^# J/ I
        label = {& U; G1 @  T5 o4 U4 ^$ M5 ]
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    ( ?8 ?& X* T& S8 h# v        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],! ~- m6 ]$ S8 q0 K" [- x+ t
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    . T- @4 r1 w: ^( ^! ]        },% z( a; Z. X! U2 O" Z
        write='result.pkl'," p: s' O- U2 z: v$ `7 R/ Q! {( B; u
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    , X- `+ o" r& @- E3 K    page=[True,'url_page.txt'],& q1 l, N8 K- [. Q
        # bool类型,默认不清洗
    - ?" W7 y5 ^5 p- h/ S7 g. O+ H    clean=True
    1 j6 B' x  {" d' O  G, f).run()
    # ]; A) b+ d* m
    % X( }) b9 i; X. G# g  g; b# b/ ?第八种玩法:爬虫存入数据库
    1 z) X5 |7 B: [  r. \. p存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。( |+ R3 c6 F0 J0 P8 `

    1 r0 t% ?( u' J) W特点:
    # [$ i5 g7 b1 d+ R5 X' R4 l信息存入MySQL数据库。
    % c/ \5 m$ T! Y, T- D可连接docker远程数据库。
    . b6 V, i7 B7 \7 C/ x  W, l" T数据库的库名可以不存在。+ n0 Y5 _; x$ j) j$ h
    数据库的表名可以不存在。
    % m6 \- \5 R9 ~* \根据之前传入字典键与值参数判断表类型。
    % F3 f5 \2 P, P- ^5 y自由建立数据表传入信息。! I6 U: E* m! n6 ^* G* w7 Y/ m

    ( }  t1 i. ^8 V' \  E缺点:
    - \* F5 A3 V% k3 y# ~/ u( Z仅支持MySQL数据库。  z+ z% i7 l3 f  [

    $ }, E! V  o- A$ a:return SQL
    * ~# x- T2 s  K" ^* K" W6 a2 q
    request.parse(. U' y* P- M9 C3 ^$ i- u* F7 O
        url='https://www.douban.com/group/explore',) w3 q8 m* c) Y
        Parsing = 'xpath',! K, `/ P* t- b: u* d# O
        label = {
    8 K2 ^6 Y+ o7 T% Z" [# @+ W+ B        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],; ?6 z" A  Q2 M1 ?  p. K  H- `
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],0 r: ], _9 r) W' e' e
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    , e- ^  i) `. V  r/ ]* ~9 H7 p; H        },8 I% G! z0 Y9 ?& \$ i2 u' w( t
        write='result.pkl',7 u0 {* X! v& d$ M9 s
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    " G( l3 {/ m  V    page=[True,'url_page.txt'],3 b. O6 X& l3 O  N8 ?( o
        clean=True,
    8 b" c# C* r# b: y' m0 _3 ~    # 字典格式,, N1 {/ d! G7 S" z
        # host可有可无,默认localhost- H; q' X4 W8 ~3 x# _& ^, c
        # post可有可无,默认3306' z0 p/ L/ \5 i4 j+ [# ?
        # user可有可无,默认root5 l# |4 q3 q# D) E$ f0 h
        # password必要参数,数据库连接密码
    9 Z* _" ?1 C" I    # db必要参数,数据库即将存入的库名3 W4 u6 y1 I$ n# H- x" y" V4 R
        # table必要参数,数据库即将存入的表名, H+ S$ t6 ^+ O. u
        write_SQL={
    + z1 c2 K* ?2 b. W# T* g' M7 D" [        'host':'localhost',
    9 Z4 F0 W0 N5 A( J: i        'post':'3306',
    # r$ U4 H, k" l% f! q' k        'user':'root'," P. c6 S8 O- P/ n) Z
            'password':'123456',
    - I: W& j. _. W$ }# F5 w$ E/ Z        'db':'example',0 S3 F! k+ L1 r5 P: J8 d! S
            'table':'example'! w& m% o1 D0 K  ^% b+ n
            }  w8 m; i, f7 i( U1 F0 k
        ).run()  t4 q7 C8 b( z% p' [% \
    6 o3 ]5 t0 [( G
    第九种玩法:重新启动爬虫
    + a. d$ c: Q7 i, i; s) T爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。
    & v- P2 i, A$ k1 f* m; m( w) u) y3 y( J) s; \0 R
    特点:
    ! e3 i5 Q4 k/ y8 Z8 {检测报错重新启动爬虫
    2 p# y8 k: W! Z: H. r7 ^8 a无需手动处理错误信息) R/ J' U& D, q6 b
    . a' j% D- V& z/ }0 V
    缺点:! ]; e/ J) H+ y' b+ D0 o+ V, y
    无法收集子线程错误。
    ; g4 B+ k% d5 `) [2 ^* {: @4 D6 `- I. j; z% ^4 L: E7 ]
    :return None
    ) m; @6 r. h1 I$ r, s7 ^1 n1 ^6 r$ M
    request.parse(
    0 ^7 c3 _0 \6 v  S$ }/ z        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],: w) T$ M+ v7 |$ L, K' P( ?6 f( ]% }
            #login="taobao",3 V* i3 k+ t4 ^7 A- q
            type_url = "text",
    ) b" @. ?7 z* t1 E        Parsing = 'xpath',
    " A# @5 y$ t2 i; [: G. B8 Z7 i3 R2 X        label = {) G; G: E5 X2 j$ |  L- h2 h/ r
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],8 q( W) ~, v# [* u) c$ ]& f7 x; b
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],# K9 u; o$ G0 @6 q- S2 c
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]; B$ I; v* `* n% [0 O5 \, y
                },: o3 N' E' r/ `$ c
            write='result.txt',
    " I) F# D$ ?9 S  v        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    ; D! }) E) A) P# h- B        page=[True,"now_url.txt"],
    / Y, D0 g; e$ x        # texting 参数为是否启用连续爬虫
    ) {! E' O. S, I5 D8 [        # 爬虫程序异常报错后重新启动爬虫& ^# g: @: K! ~* P6 r" l( t
            texting=True,
    0 h2 F7 ]9 M& X  E" ^2 q# @        ###
    0 _# @. w9 I' V1 @( f        write_SQL={
    ! ]: V6 I8 K' z4 {9 `            'host':'localhost',
    2 C2 c1 W; B8 {5 o- A3 ~            'post':'3306',
    9 v* A; N  N' W# I            'user':'root',) ^8 c7 ?) x' w, O% Q; S4 H
                'password':'123456',7 m/ T2 d+ q. v7 q/ b; d# _
                'db':'example',7 D# P8 z& F5 _9 k6 e
                'table':'example'
    2 n! Q; N( {3 r6 v            }
    ' }9 K, t8 G1 Q+ E( A).run()
    $ i! v* o0 q# s3 N- ^% R1 x) c1 R) B; \5 ~, D" q0 ?4 h5 T
    第十种玩法:多线程爬虫
    9 v# H% p) T, D$ |/ W2 y特点:
    ) }% J7 @. d0 p$ y爬虫速度加快,
    " i; j/ g! ?( X8 v* t更好的利用了线程。
    * b1 |4 }7 v* |' b% G/ S. U
    . @$ }- x; k$ t% ]: }; E缺点:暂无
    ( S1 f* a" k  t' D
    6 {  l" b9 h# L:return None
    " o9 r8 ?& V! v. j6 Y
    1 J" P5 z* e+ y1 b) Lrequest.parse(
      O  y, G; l+ ?; o        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],  @" Q3 C' [; y( b, {9 \: B8 A
            #login="taobao",
    ! J, c6 \) Q" y6 I; z$ G        type_url = "text",
    - p' I+ k) g$ y        Parsing = 'xpath',( P1 u5 N9 x$ a* L, W
            label = {
    " w# m4 `3 x' V) K8 a            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],6 [5 C- B8 f$ s. O
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    / P. x" x- l& f) n0 E* ^, @+ g            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    & c* B3 Z' w6 c" a; Z. t2 r* K            },: p) @1 Z  Y. I# Z6 Y8 _5 ?
            write='result.txt',
    ; ?5 g/ |: J7 [        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',- \  I! K) [2 u
            page=[True,"now_url.txt"],5 z! b/ k; l6 N
            #clean=True,( i+ Z" v2 P8 c6 ?0 G
            texting=True,5 X6 V5 r  I1 y, c  f3 z
            # status="threads" 启用多线程爬虫
    9 M: E( R; U# t        # Thread_num 为线程数目,默认为1 单线程
    3 r- f! k( d6 r" p( J        status="threads",$ r: \& }+ m$ n0 l" z
            Thread_num=3,
    7 k1 Q: r' c6 d2 k" v        ###( J: W* S( {3 Q2 X8 t6 ]  A( f4 ]; V
            write_SQL={7 U. y/ z  f& H
                'host':'localhost',
    / V. A0 ~4 {! [% Q            'post':'3306',
    3 m5 E  K8 u& s5 x$ J& m, P            'user':'root',
    * N# P6 T5 c" ]4 F            'password':'123456',; O( P5 M3 J9 t' v. l/ \, x) A
                'db':'example',9 Q" Y: v% [1 Y7 @- T; X6 i3 Q
                'table':'example'0 Q; ^2 t0 F- T3 T  h% t0 I
                }/ k! v- J: E; p5 Q2 g" Q
    ).run()
    # G9 n5 {' |4 J9 v. d, G/ m& e3 c: k3 g2 m6 l+ d
    第十一种玩法:多进程爬虫
    ) n# C9 \. W2 J特点:- \5 M; w1 _' V
    爬虫速度加快,
    6 O7 B. }( w+ u7 r$ L8 E更好的利用了进程。2 D# W0 Y- K9 [# Q
    : w" q* ]1 p  X  R* M4 _" P) f
    缺点:暂无: q7 e- A! E8 n: \! s4 n

    , X) @/ G8 q# m! v:return None3 M( S/ n- l* O6 w" i, M
    2 c8 u) N) q. Q/ _( \5 U0 l, ?
    from simple_crawl import request
    ; F! N  x- U5 @3 b$ Z, Irequest.parse(/ S3 V) G' e( C, A
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],  V* P& S5 r9 U, e/ }0 O
            #login="taobao",
    4 c; F  O9 v' U4 E# ]; b        type_url = "text",4 F, ]( w8 W% u: H
            Parsing = 'xpath',
    % @+ R6 i  O- P7 C        label = {# j% x# B7 n6 L- `4 R# g" b: T
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],; g6 M( F  n6 F( ]
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],, K2 p* h0 h/ g- B
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    8 h# I( U0 O6 K6 D$ c            },7 Y3 V- Q/ v9 y% b
            write='result.txt',8 p: ]! u2 f6 m- n" _' Z* L
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    % L  s7 g$ f& T; x4 _        page=[True,"now_url.txt"],
    & u8 m+ s1 }* A( [( P. L$ {4 W        #clean=True,' M. `3 z3 L0 Z& I
            texting=True,
    7 y+ @+ g& @( ^' _  J/ o1 d; U        # status="multiprocessing" 启用多进程爬虫
    * I9 d# O6 y) x9 O  ?) p3 ~        # cpu_count 为启动代码核心数,默认为系统核数一半9 C. A9 t5 Y  v8 c9 V, s4 Z0 b
            status="multiprocessing",6 I& s6 z& o, H
            cpu_count=2,
    3 y" A' M' |$ F9 S" u; r        ###+ ^" k+ X, |" p8 @) X: i% g
            write_SQL={
    7 i0 V# D* ~! h- O: L: |            'host':'localhost',
    % d$ H6 ~" W3 T2 m' T2 R            'post':'3306',
    # ~, N; R, `: A) v( l  ]            'user':'root',
    & D. ^! ]: j  b* g            'password':'123456',
    ) ~/ a2 a& r5 ?/ z+ a            'db':'example',
    # K7 l% u, H, B: t# d8 c- }            'table':'example'( a9 B: O' y$ k8 C& h, s+ j
                }
    ) N$ G$ e3 N* _: J7 m- m+ |0 e1 F).run()
    + h* z, O% X: O' r. i5 m  u  g  u8 l
    第十二种玩法:异步多线程爬虫
    # L3 d# g& n- m9 M特点:
    $ ?. q# R' m/ j4 K: `1 o9 ]爬虫速度加快,5 f- _# J% M/ C1 f
    异步使得爬虫无等待时间,
    ' z# K* I) d4 ~( K# ~$ w+ {同时使用多线程速度明显加快。
    2 \4 O: Q  g. k$ t( k: x  U% v, w% n& P' @/ S3 e7 n$ ~7 x
    缺点:暂无! h% G! ]' o, o/ U  V7 a9 ^
    + K: h: r* G$ m8 g& W, l8 O
    :return None
    . c$ u1 C! t2 r" ^% {9 c: ~, \! o5 N
    " E7 Q+ w" f+ j4 E& @4 Lfrom simple_crawl import request0 L" a# f& L: h( x! m
    request.parse($ g+ \8 L3 W0 k6 j* B" \- c+ j
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    1 h( U9 O6 s9 D8 B        #login="taobao",2 B( Q4 p& r$ ]- C/ J# }
            type_url = "text",0 i* ~& U% H  T/ n8 H
            Parsing = 'xpath',
    8 H0 g" T) H% Y; s# E5 `! T        label = {
    $ d) P2 n  ^- a  M* Q- f            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    4 a3 i0 r' d2 e3 `+ H            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    . f, g3 y* l' s* X  l4 N            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
      T1 ]! g  }$ H/ n            },% J9 V) ^: T- K% u# I3 p1 \: B
            write='result.txt',+ H$ h; G1 t1 d/ N
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',; u, c7 a2 E4 ~/ Q, }' B; w
            page=[True,"now_url.txt"],* I- m+ a$ q% ^
            #clean=True,
    7 C' I  L& e1 M        texting=True," R4 c! o! v) I- b' v2 r
            # sem 参数为异步引擎数目,默认为53 e( N2 ]0 I( x7 }9 I
            # 其他参数同上+ s+ w3 e  R* x% N5 C2 C+ N
            status="aiohttp",( z3 x. z  h" [# j8 g
            Thread_num=3,, B  a  X* o# G: k* |7 V9 `+ N
            sem=5,
    7 d: L( Y# H. e8 N        ###
    $ T3 w1 P+ E/ r( q$ Z6 U        write_SQL={
    6 e$ ]2 q+ i& [& _9 d            'host':'localhost',
    0 G; O/ L8 h4 ~* N1 J7 x+ Q            'post':'3306',
    9 l% S0 n% H' N" y; V; R. l: p            'user':'root',3 n: J0 D2 D- [' @6 y
                'password':'123456',
    . W, p1 {' V, U- ]* w            'db':'example',
    : S+ O; f0 S9 Z8 w            'table':'example'  `, c' k8 W0 A
                }
      }) O  ?* |/ l) m).run()
    ( P$ x+ ]9 _8 s. `4 L; [9 H
    3 X0 d* j3 R6 @8 {$ e第十三种玩法:异步多进程爬虫8 v* A( c. j: U
    特点:
    ' o. I- k0 R5 d: h爬虫速度加快,1 X. E8 y4 Y  m, _
    异步使得爬虫无等待时间,
    % N# X/ Z! K  K6 G" L同时使用多进程速度明显加快。; R1 w& G9 O( x5 u/ L& @6 I# s

    3 Z* C" _& L1 K* @' E# O缺点:暂无
    * ]6 Z1 F8 |; w* I+ e! K- p! _- f- q1 j1 b. Z
    :return None
    9 b# I: d9 a3 U* n) u: y' M! f4 i3 g7 d6 s* m
    from simple_crawl import request
    ) V6 h+ E, I7 M/ Nrequest.parse(4 _1 p# f: G2 E4 o( r: T
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],: [) D- u8 M( e5 _. O
            #login="taobao",
    1 q1 z8 x% X- \( r- F        type_url = "text",$ _1 B7 J; s) y/ K2 f, p$ q! C" S
            Parsing = 'xpath',. @# W2 w6 F$ U1 t( e
            label = {0 D3 b/ t# _3 l7 c: e
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    , G) A' {- i$ i  r' s- S7 H8 g            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    4 H( ?" @' T! x/ |0 A            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
      N' v4 w$ Q* ~6 i7 Z, R            },
    . K$ x+ r# k% U) t3 W        write='result.txt',  W8 P" N; e, d! ^3 o
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',0 h2 f% q1 C) u: x  R+ k9 K8 l
            page=[True,"now_url.txt"],
    8 @6 u/ K$ P# w  M3 U        #clean=True,  _5 o+ L$ D2 C! o; f5 y
            texting=True,
    * U% J: I0 e0 o- f        # 参数如上
    ' M* b: Z- ]! n# {# o* B* `4 t5 B        status="between",. I& Z( Z# N6 `
            cpu_count=1,
    " O2 M. h4 Q3 g% K- X, `4 I7 P        sem=5,/ S  s8 |* k& P) O& ]$ r- ^2 _
            ###- Y, t/ l# Z. F- m, c2 s
            write_SQL={
    ; d  S2 ~9 H7 p& U0 y, K" o            'host':'localhost',! ?# a2 u7 h" v3 P4 ]  s6 ?: w
                'post':'3306',
    5 b. P7 R: Q0 q* o+ o+ L8 M3 a3 x            'user':'root',4 n* T+ F! q, P7 q3 s; c
                'password':'123456',3 v6 W% A. ^' _
                'db':'example',
    % v/ ^5 F7 [' Z- l; y: J, j: b) y# [            'table':'example'
    ( m( e: E7 o0 }1 e, q  A4 G" _; ~            }' q8 S- G. d# N" [7 H
    ).run()
    - j7 p  y. t( R& j: [% C. ?( j; X- m- a# R; U. P" t3 P
      `* x" Q: X% f+ D! G8 @
    功能介绍完毕🤞
    $ _2 n( `6 r# n+ b最后还是希望你们能给我点一波小小的关注。
    % S% u* n/ y+ d' X+ j6 E! ~奉上自己诚挚的爱心💖6 C- ?9 x% w5 z5 S: B! ~- o
    ————————————————7 S5 J, s4 v7 M. ^( Q' j
    版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。3 ~5 v/ F& P! ~) e# V
    原文链接:https://blog.csdn.net/qq_45414559/article/details/106005684
      q# |2 X8 {  f$ l( _2 P& Q- u; R
    7 s( A3 a' w& i9 i: b+ @' U" h% ~  S! }  L# b; N
    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-29 17:33 , Processed in 0.422762 second(s), 55 queries .

    回顶部