QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4713|回复: 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 J9 ]+ `4 v7 I& r  F+ bsimple_crawl$ i( C% u4 S" U# L- B' {
    仅需一行代码即可达到爬虫效果* L9 O) ~) [" E; O, x; \+ O; v
    项目地址(欢迎star):https://github.com/Amiee-well/crawl. }6 W# z' S4 a% c
    使用方法
    ! r4 F3 R5 \4 [% `$ W$ o3 q* lpip install simple_crawl0 g" ^! _& G5 @+ |; k+ S& q

    3 W7 b0 K- E2 j; h### 以下源代码为简单介绍,详细功能介绍再源代码之下" ?/ q$ f0 b" }6 e# A
    from simple_crawl import request
    3 R4 h$ w# ?; g- Lrequest.parse(" X9 A8 z1 |  n& Z% q( U( n3 Z
            # status 参数为运行状态,支持单线程多线程多进程协程以及联合8 t" _" \( v; K6 P* N9 C( y
            status="aiohttp",
    - z; i2 S/ {* ?! K% l- N        # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式
    2 W% U; T; ?2 C! P3 A3 b8 p        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],3 w2 _( R; [# C7 {7 H$ L
            # login 参数为获取登陆信息,如淘宝等网址需要登陆信息
    8 w. r9 Z+ h1 r    #login="taobao",
    % {* {2 ^  t. F" U; F    # type_url 参数为返回源代码格式,支持text和json,默认返回text; }. ~' g* `( Q  N* H2 Q
        type_url = "text",
    ) Q- m; O- t- ?. B$ m, d    # Parsing 参数为解析方法,支持re、xpath和beautifulsoup# S* ~6 \  ~$ i1 L+ w
        Parsing = 'xpath',
    / q. d) r" p3 p0 j% b  k7 @, n1 ]/ y    # label 参数为爬虫解析过程,字典格式,详情见下方; f7 |, Q  D1 ?' T' \
        label = {
    6 d3 S  [3 B6 D/ o. F            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    3 d8 O% X# N3 X, b* A            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],* ~# t, m& R5 j9 h5 T( B! H
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    $ R  a0 L% ^& t9 C- w( ^. o6 H" Z     },% j3 G- z! i7 }7 G, Y( [
         # write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱( K1 u# p* O- o! Z' w& N: W' x
         write='result.txt',3 ?: ~2 H. h# w1 J
         # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫# G: D6 w- [) @5 y  Y, I: N' f/ v2 B
         next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',9 {* n$ D2 w% C7 [( ?1 D. z% K
         # page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫6 T& M) y: F2 r7 `
         page=[True,"now_url.txt"],
    . j1 x% J; T/ M2 w5 |: Y# n3 T     # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息
    6 K0 d1 \. O3 D5 |* J     #clean=True," v0 Z  I$ c7 H
         # texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序
    0 k7 F: p( D( N* [2 g6 w     texting=True,
    1 h! i  K& v1 C0 L     # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态+ n: C. h3 A/ z0 O) b/ d
         Thread_num=3,
    * a. F+ a$ b1 p3 I     # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态
    / e6 m" Y0 W3 h4 ?# [     cpu_count=1," k5 X( M+ @( f/ `: `- k6 M. I+ C
         # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态# c  ^9 \3 ^( ~
         sem=5,2 k! U; {- d% ]. j
         # write_SQL 为是否写入数据库,默认否2 \5 d, X0 t) w) ^# U' r9 X
         # host 参数默认localhost
    9 S, M4 j4 N, {5 w! m     # post 参数默认3306% l, }4 L$ u" i$ D9 @
         # user 参数默认root
    & Z7 J" `& f/ R5 h' U     # password 参数必填,必须正确( U7 R" p8 S, `5 S' m; Y
         # db 参数为即将存入的数据库名,若不存在自动创建
    # ]8 `+ a/ ?. v/ W+ I     # table 参数为即将存入的数据表名,若不存在自动创建+ S/ n; m5 v$ r4 S
         write_SQL={
    3 v2 d# q( T' n( y5 M0 u         'host':'localhost',8 \0 Q: U2 R) ^: k) x7 r
             'post':'3306',
    : U8 s$ B% D' F         'user':'root',
    * O) t( d; c& T2 z* g2 h         'password':'123456',
      V- N: ?" }* O* P% R         'db':'example',; ?8 x; z, u. k
             'table':'example'
    + ~* c+ W9 i3 @3 J      }" u; f! x1 b; J
    ).run()
    , b( o6 |/ n+ F* d
    , [0 ?5 e; e$ R8 C% h介绍一下crawl参数设置:- Q/ c5 v5 w7 F) |

    ' f% i9 C+ d1 K3 z'''& e. [( O3 l$ F( m, n# w+ v
    单行代码爬虫程序执行
    & ]1 \0 _" }# U8 y:param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档
    $ G9 ^& h5 |; K! X6 {0 d$ i4 a:param url:即将请求的url地址,仅支持get请求
      J/ `! @0 P: ]:param type_url:请求url后返回格式,支持text和json格式返回
    ) V2 I% ~7 t: V5 k6 d:param Thread_num:即将启动多线程个数,默认为1单线程
    4 e& `/ {  `! K' _:param sem:协程信号量,控制协程数,防止爬的过快,默认为5  c7 ~# ?) }- s* l, `( m
    :param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半6 v% @9 I  E; N2 a/ i
    :param login:模拟网站登陆,保存登陆信息( Z8 x- {! t5 ]& k3 R6 E# [
    :param Parsing:爬虫方式,支持re、xpath以及bs4方法
      a& H5 o( [/ l: A:param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,
    * X2 a: W/ V9 S# N& g                       多次报错结束程序,默认否3 P8 C  E% r  b
    :param label:选择器内容,字典格式保存,$ j+ N7 G0 l/ c! }* `0 j- T! i- Z
                         字典值为列表格式,第一个参数为选择器,第二个参数为转换类型
    ( {: H0 d8 ~  _7 b. c7 w" P6 `                     第一个参数必填,第二个参数默认str类型
    2 a/ [# z  ~+ V/ ~7 `$ G( t/ m:param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否# M6 m& M0 z6 H' M
    :param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫
    & o( a% T, `) a. s:param page:是否选择断续笔记接手下次爬虫处理,默认否
      z  u3 h. N  X' w% ]( O:param clean:是否进行简单类型数据清洗,默认否: W4 C8 {0 C3 J, E" U; O: I9 `. C
    :param write_sql:是否写入数据库,默认否
    9 S- I9 w& D( {/ H  j                         'host'默认为'localhost','post'默认'3306','user'默认'root',
    ; C7 u6 c1 i- f9 T# n/ Z                         'password':'密码','db':'数据库','table':'数据表',
    6 m7 a" v9 E. x5 e2 D                         检测库是否存在,若不存在则创建,若存在则直接插入,6 R1 s3 d: a& W8 n
                             检测表是否存在,若不存在则创建,若存在则直接插入
    , V0 a0 m5 O1 q/ q; S) _* f:return True, X' D, Q8 E" E5 S7 D
    '''
    ' J5 k) G, X. k) ]介绍玩法
    8 ^. h7 X+ M9 Y接下来介绍的均为调用第三方库的情况下运行:! I$ M$ P; S9 w* W
    - G1 B, v  Y( o$ |4 `5 Z7 M1 @
    from simple_crawl import request
    0 l/ E! v( T' X: F5 G第一种玩法:输出源代码
    # U# G/ e1 B- G* w. t调用requests库进行源代码请求。+ p" J0 H6 H! s6 O: T9 S( K
    4 {0 W1 K4 p' [! N( o# v# f( [$ u1 X
    特点:" W2 t; L. e9 I* |" Y
    请求失败则调用ip池处理重新请求访问,
    8 N% w5 V$ W! Q# h& A" I出现五次失败默认网址输入错误。) \; @- Y+ p2 {6 W: ?
    支持text以及json字符串返回。默认text。5 l4 V: f' T% `- t- s+ v

    ' d. n5 U# F2 X( n; ^$ s缺点:
    0 w. k, q# G$ k7 G3 P' U0 n暂时只能进行get请求,不支持post访问  i8 U. [  ]; c! n! b

    * G; |4 a* l# Q) A:return text or json- ?6 b2 r: z2 u0 V: X. P6 h' |3 ^

    ) t1 @! r. F3 E/ a- C2 N. b* Yrequest.parse(; t6 j( `. k" n7 A, k% ^) P2 D
            url = "https://www.douban.com/group/explore",, h. g: F' F4 m8 `% x! m
            type_url = "text"7 _) B. I7 b0 p4 f7 v
    ).run()  v: U% r" v; {+ @# ]: E; N
    # return text
    . t/ ]# W7 W# z" s% u! A
    * ]5 [2 O% Y# l第二种玩法:模拟网站登陆并保存信息: o9 R5 P- d# ?$ x; g6 ?3 g" Y# E
    调用DecryptLogin库请求登陆访问。0 m& ~5 V8 B$ q/ S2 i
    ( [' y$ H2 K/ n4 Y3 u* X
    ps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源8 r. _. j2 _+ H. E; g& {" d
    在此放出文档地址$ H2 E0 b: @# [* u+ ^
    DecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/
    ; L+ E$ R' q" _$ s& d& Z$ R+ m1 c# j/ K* w; W
    特点:3 ^% K; `( l/ V: H2 O' @
    将DecryptLogin库中二维码继承到此库(非二次开发)
    3 \) x! V7 Q/ p: x( a5 t支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆)
    4 f3 V  {8 `& C2 z; \0 l保存session.pkl信息到本地方便下次登陆运行: F  v2 ]: X, m. ]' n7 ?( D

    2 a; E4 `2 |) x1 k缺点:( Z4 D* M# `! _, X( C
    session.pkl登陆信息过时无法自动删除。0 l2 p& y) b3 J4 J
    导致下次登陆疑似cookie无法正常登陆。5 f: w4 B# y+ v/ l: e. J% o2 s( \

    , A! F4 I# N* x; W4 R/ s4 A:return session
    * N4 f8 M( I* k
    ; }% _: M% G! {2 t) h* Xrequest.parse(
    8 l# G% M* R1 m: |        # 臭不要脸的推广一下我的店铺. B* x: n: `8 r! [5 C
            url="https://shop574805287.taobao.com/"," n1 N. l6 B7 C: K
            login="taobao"3 V4 C. Q2 W, D- P9 X
    ).run()
    # M: F* K/ j6 P7 _9 Q- e! u# return text
    $ N- s, `, o4 G  O4 C
      _+ [; J6 I8 C6 I; g+ A+ D第三种玩法:爬取网站信息
    * y+ U% A7 j( h  e/ u- w& h! p2 H爬虫库自然少不了爬虫的过程
    ; Y# I  G8 ]4 ]: U9 n1 k/ h  h9 c. c' H
    特点:
    # a1 U( N4 ]7 i* m5 x支持re库,xpath解析以及bs4选择器。
    % j5 }: w- G2 @' H爬取方法为字典格式。单方面输出。
    - i) n) h; H/ a: A; [5 X7 Z! N字典键为保存的字段名称。5 A( D- }% u( \% K3 |) R
    字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。
    4 ~, L! t) n3 ~
    $ _; X3 `* O  F$ {缺点:暂无(等待小伙伴们发现)
    $ i& c4 T7 \- W
    3 y) t/ r6 \% B  g) Z, C& z( V% J: U:return reptile_results4 Q( Q+ h; u' Y$ i( `0 E

    : t7 h2 V4 H& S, q& d1 n; vrequest.parse(, l) n% p6 z5 @% d
            url='https://www.douban.com/group/explore',
    # G- x2 K* _% J        # 字符串格式,选择器方法。
    ( X9 e3 g2 }6 J( l5 q! u    Parsing = 'xpath',
    6 e- U" U. `6 `, m$ j    # 字典格式,参数如上。
    & A2 }+ _: Z9 |2 D& N1 M2 m    label = {
    ! Y( `% A# F& N6 {        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    9 r/ R( w* M2 K, `" D: A% a        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],* ]. r" H6 C7 m8 }& |( Z
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    0 R) ?5 v( F( `: d( S: R5 f( u        }
    # |6 k" X6 K7 V% C" j).run(), i/ a" k% h$ q; f# _
    # return reptile_results(list)
    . x" \$ X6 h: v7 T+ n6 G
    3 a& Y8 T9 `! B# r2 {# Y. E第四种玩法:自由保存信息
    5 \9 o% v! P# H% D4 g目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。
    6 |5 W' C/ W6 k" c1 ?/ a  R. h9 I; P# L7 |5 ]) q# c; D" _6 D
    特点:
    ; e' T" k! B! S+ C写入文件均为数据格式传入文件。
      z$ G4 D# u! K6 \+ d5 `且输入格式规范方便阅读and省事。
    & l+ ?) w- Q! s2 J/ y5 R: F& V' h6 f7 j2 Z! t3 i9 R* g. v
    缺点:
    ' A+ \9 h2 a7 l9 E: v1 B  I0 y保存格式仅四种,
    " h, n) _+ u7 p, i2 |- t不方便用户之后读写操作。
    : @9 H/ I9 G  Q- d3 N' ]2 q
    ) p- t/ G: @$ K; t6 O+ Q8 Z) W9 w:return file
    * M7 q0 n+ |  }0 L& J% J7 `( t+ y
    request.parse(
    9 J- @: O. x+ ^/ m5 e' e' l        url='https://www.douban.com/group/explore',* s2 p. P# m$ z( U+ m4 M- J. b
        Parsing = 'xpath',
    9 w* w9 p6 g; y' a! K: Z  h    label = {
    : ~# s6 p: J0 T+ ^+ z4 k7 Y        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
      G. I* i  I: D3 m        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    ( J! i' @; a5 P3 D        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    , X0 y' T  L, J* K" ]* B* p2 \        },7 O" _( P# [! b  V! d0 W- @7 d/ _
        # 字符串格式,具体保存位置填写
    5 s7 S% y: s/ H- `# \/ }  Q    write='result.pkl': _& e7 R- a+ {; f& A# q
    ).run()
    . M& P: f$ f  ^( _: D( z% c# return file% s' ~+ M: ]: x, t6 L% ^( _

    ' D- U- U; l: I* I6 G5 J第五种玩法:读取下一页 url 地址继续爬虫
    : @. o* M7 W) @& h  T5 y这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~, F" R6 Z2 o; O

    6 t: R3 ^% M7 m3 m& R, C特点:
    : f8 F) L" g0 }3 t继承之前的Parsing参数选择器选择方法。' X1 s2 h$ R' z/ H1 y" A
    在这里可读取到解析后的下一页 url 网址。
    # E. [' X4 Y& e( E7 X5 t方可继续进行爬虫处理。方便用户使用。% j; K; t, _9 b3 C3 _

    + D7 w  Q+ J2 P9 S缺点:
    ! G$ J; g  I: I# i" O若爬虫时下一页 url 地址改变,便结束爬虫。
    " U' B% t. U/ ]; e2 b7 A只能爬取所给 url 地址中的信息。. Y6 s9 a+ [/ }3 o: `
    无法进行某一界面的多个网页爬取返回。  v& S& F) r7 I4 q9 _1 q2 R
    造成访问页面单一流失。
    9 ?1 }, \; V. r# I* J- R# F
    9 V2 V6 d8 x7 m7 z( W  }2 F/ y+ Q6 [5 X:return None
    5 A- S! M0 }# `6 `* F' j0 n  y( d' z" f
    request.parse(
    ; R1 M7 ~2 E, R! Z        url='https://www.douban.com/group/explore',) }% i% Q7 h0 @* g$ c6 u
        Parsing = 'xpath',  V% k- P3 ?1 x' B
        label = {5 X1 O% e/ @( g2 i/ M- p
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    $ a2 [5 h/ O7 M3 c% O        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],% ~' M; X8 u0 a$ Z& B0 i
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    4 d  u, s+ d7 t0 U        },
    - s0 z7 K6 F: |* R7 x    write='result.pkl',
    . y1 }+ b5 t$ p    # 字符串格式,根据Parsing方法继续请求下一页a中href# Y4 p5 F( K. x  l
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',9 |2 o$ h2 ?0 x$ u' O. f
    ).run()
    # K: s5 z! s9 R# p6 Z( i1 l2 W# return None ! y, B9 z, K- B* i5 \! y8 {! {+ N
    ! z# W) D3 k) p5 A2 P
    第六种玩法:爬虫网页保存2 H( I' y, p# s7 v6 a
    听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!
    * |' [; V: Q8 v' w, m# G
      k, z+ F2 g# T2 O8 x特点:1 s. ]; ]: T5 Y* S  k4 i
    持续输出断续笔记。
    % V& Q# v2 |+ ?- u1 @+ r. B: \- F3 Z将此次爬虫的 url 地址保存到一个文本文档内部。
    : j" ~1 o, k( f* _- C0 C下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。- V# c( R3 `. h0 Z

    . y# j# S( i' [5 R3 I缺点:( g0 P/ ?1 A6 P$ W# l
    读取内容不单一。" L; r; s6 T/ s; m$ ]& g# a* y
    导致下次爬虫无法正确读取上次爬虫留下的痕迹。
    : N( E% i+ I9 l. S; p1 k" f4 V8 y: f. S; a
    :return url_file" S4 V7 a9 V% M( a7 ?

    9 A# ~  L; u. z/ u8 b8 z7 Irequest.parse($ W2 P/ H, t% ]
        url='https://www.douban.com/group/explore',& ?* F, _$ w# F( Z, F$ H+ O  I0 c9 ^
        type_url='text',
    7 v/ g9 \/ ^- p: O    #login='taobao',3 @" @5 {7 m/ M2 o
        Parsing = 'xpath',
    / i: c9 K) u# o$ V    label = {6 S- n3 C5 z) L% T6 V
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],7 d5 s  g; E+ ~3 l# r
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    3 I9 L6 D/ H  K) x; J        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    / x0 V$ R6 l) B' E" `# q        },3 n, U' a/ o/ r* B) A
        write='result.pkl',# F  m5 `2 v' r( F5 L" e
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',& v) K9 O5 ?7 |" x) R( N0 j9 S
        # 第一个参数为是否需要断续笔记。
    ) {! V( O# Z* r: o: g! w    # 第二个参数为断续笔记保存位置。5 r* r6 ?; C" s/ z" n
        page=[True,'url_page.txt']. e3 }1 u8 g8 j2 t( `# J. |0 R. Y
    ).run()
    3 S7 T6 I* l" O! n0 S# {; m8 G# D# return url_file' W8 m: ?) S/ T
    + o+ S: W3 v4 L! c
    第七种玩法:简单数据清洗
    ( H: w0 w$ ?& p1 \8 R数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。
    6 A$ h8 G, [; @+ V2 O# j2 Z# |# d+ r& \& H' G/ f# Q/ x6 W* u
    特点:
    ' _) ~: {& _0 E; T8 f. N7 E4 Y  r3 Y本人曾写过一个底层数据清洗。! L" j" H5 _1 ]/ x' Q
    能将列表格式数据进行归分清洗。" e3 {7 G% M" @! `
    主要内容请参考另一篇文章, b; z) k. R2 Y3 d" B
    如下连接:数据清洗
    ) x4 I" `+ \* D6 a* M! w
    ) c2 V- _: b7 V! o& O8 p: u; F缺点:1 I; N; S) t/ g* W$ l0 h
    数据清洗格式简单。3 W+ D. t( F! T0 _" C. h( _
    数据清洗内容单一。
    ' ^1 f. V1 A$ \5 b5 P/ [3 V无法完全做到绝对清洗。
    6 e3 U2 ]- L, k4 V5 U9 Y2 r有待改善。0 _/ p1 N  S5 a2 P& Z6 `

    ) |: {$ |' L4 a( O& ^  }:return keyword_list, value_list# `# L& ]) c* N5 ^2 O
    % Y) Q1 w2 w5 R  h
    request.parse(
    + I  @5 T/ s" Z, F" x& S( T' P    url='https://www.douban.com/group/explore',5 P* T, H$ n9 P
        Parsing = 'xpath',: r& K. Y7 ]* Z) u5 t# U1 z
        label = {
    # I) r, n0 {  X8 ]$ w# o        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    . Q" g) r9 X% I. K3 L. c6 W& _        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
      a$ s2 w8 i1 U0 L9 J        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    + p7 A4 b$ Z/ i/ b$ `1 `' b+ W+ Y        },
    5 K2 n1 L) i5 F# N* C5 g8 Y    write='result.pkl',& P' V$ C8 [6 g
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    : X5 J( |7 @( C& w" \+ m9 [/ e    page=[True,'url_page.txt'],3 t  \0 C) O& ^2 v' x4 d# i4 M
        # bool类型,默认不清洗$ ^( @- }" O+ N' w
        clean=True
    5 k& g: n% q5 n1 j& c$ h+ ?$ @).run()
    2 m$ s+ c6 u9 J$ n
    + g0 v# X& |5 j2 A3 o第八种玩法:爬虫存入数据库
    : [  H. i- \& q) |$ j8 ]! j( e存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。
    7 u: L& t! M: N0 t, T5 S" M
    ' }* q, |$ O: I' |9 b特点:
    6 E3 n2 x2 }  X; G) {. X信息存入MySQL数据库。
    ; \4 H* K: |; O* V可连接docker远程数据库。
      y$ Z2 Y5 u# \/ I* `数据库的库名可以不存在。- E: y, Y# N2 z* F8 N# ^0 h
    数据库的表名可以不存在。1 l3 r% l( |# z: F7 B7 e6 p
    根据之前传入字典键与值参数判断表类型。
    4 @. R; l: ?8 q, K' x  B自由建立数据表传入信息。
    1 r5 d8 l" I% `
    ! Y% [5 X/ g! Q9 M8 B& f; A缺点:
    - t, j) z7 Z9 j7 @& u) a仅支持MySQL数据库。* z( `. ?4 L  [# b5 R
    ! f& v1 y" [3 E# `- T
    :return SQL. K; @/ \3 {* ]% X1 {+ M! u! h

    ! \& J6 g1 L) d7 l; _+ @5 ?0 [request.parse(! O$ s4 E3 i( E. Z' u) e  k9 A3 [
        url='https://www.douban.com/group/explore',
    1 b4 Y* r8 S) _+ N, \/ `% z    Parsing = 'xpath',
    : w1 {! ~; ^* W    label = {0 N2 B3 J% Y, N/ E7 T
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],( ?8 a) u  V. X, I
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],$ i$ ?( X! U& r; J4 ~
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
      |' @  |; U+ `' W        },% U+ B4 X1 J, ?" d6 z! o
        write='result.pkl',' u0 O: i' Q; k# [
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',; s  l; P5 ]1 k; b2 B! [. C7 b5 l
        page=[True,'url_page.txt'],
    2 E2 J+ C' T' D+ N  m6 Z    clean=True,9 y* M* b, s, o! q/ g) x
        # 字典格式,3 }; Y8 Q5 g9 A. I- s  b
        # host可有可无,默认localhost
    3 g2 F: H4 I  X    # post可有可无,默认33061 @- C& [/ m  z0 D* t9 }
        # user可有可无,默认root
    , Z# F, z' f9 u% {+ M8 q4 G6 V( n    # password必要参数,数据库连接密码; j; R* _. U3 l
        # db必要参数,数据库即将存入的库名
    ( r* p) d8 I5 T    # table必要参数,数据库即将存入的表名8 ~9 `3 L9 Z& t5 v# y, X
        write_SQL={
    2 q: S5 F+ k6 h5 X        'host':'localhost',# Y2 a6 R- D( T0 g3 i
            'post':'3306',
    # C4 h) i- g5 h5 x! J2 U& k        'user':'root',+ b: @$ B1 `2 O+ D( ]
            'password':'123456'," |5 J6 I6 I! I4 Q% b: Q( e
            'db':'example',5 I. g( x/ w5 [7 t: }" @
            'table':'example'
    ! \" C* K; O) B, ^- l3 o        }
    4 P6 L8 N& i9 d, e3 n, X! e    ).run()
    3 P! }" U" ]# u, Y# L" S; W/ y% i" X& f& y
    第九种玩法:重新启动爬虫
    2 v; K8 ~* Y# G) [: T, K- {爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。9 X3 O1 t6 J, D7 P! N5 e) Z' L

    1 X5 v1 ]: ~7 k$ F9 d$ K特点:
    7 u) U8 K- H' f' u: i检测报错重新启动爬虫
    0 b% w6 }- Y6 J* K3 z3 [无需手动处理错误信息, E# Q4 V! r) P5 O
    % b( P, n4 T- H0 h& }1 ]* X! w
    缺点:; b% K1 k! O; m* P
    无法收集子线程错误。
    & F0 G. |' |4 p) M( i  [( P) k9 \/ r! F1 U
    :return None- V* X* u& |+ B+ g

    7 A/ q& p5 J) W" frequest.parse(
    7 V% z( M, b3 V# w        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    $ O* X( O" A0 L4 D6 \# z        #login="taobao",% i. P8 J, r& N3 C! n. d+ }
            type_url = "text",
    : s, h4 J8 z) _+ N        Parsing = 'xpath',
    - C) L& x0 }" E" L        label = {
    2 S( K% A* `9 _            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    % c- i" `2 y  ?1 L# w/ P            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    & O+ p* E! R% z& @4 _            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]4 w2 D  y4 m! t0 }8 h. |- X
                },
    + H; s  w, L% ~, A; B% A        write='result.txt',
    , z% K9 d* Z2 U% |2 e        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    , l" e9 F* H: c' V5 l1 R        page=[True,"now_url.txt"],- v+ R6 ?9 G" {) @# U. W
            # texting 参数为是否启用连续爬虫9 m  \' h* c- f0 f8 o+ Y
            # 爬虫程序异常报错后重新启动爬虫
    2 n+ E4 z& }3 @# A' }6 j        texting=True,
    7 o) z0 T3 a$ F, o: G3 \  `) J/ ?- x        ###. Q0 U- s) O: }' R; E7 s+ q
            write_SQL={
    8 L2 H+ {9 H8 _8 _, `6 ?            'host':'localhost',
    + Z3 n: y8 d  n) g5 W            'post':'3306',
    0 E" u- \4 q" Q2 \9 E: J0 v5 s  w            'user':'root',) e# d6 q! g/ E5 z4 P4 O
                'password':'123456',
    2 ?( [3 y) p1 N5 }) g' U: C            'db':'example',7 _2 U; M$ N9 I! z9 L( t
                'table':'example'8 }9 [" W2 y1 D, a! v& ], N7 {, e
                }
    6 w' Z$ S1 V. [  w).run()
    6 ?, G1 \5 j& I  d( f0 |4 L. n2 i: ?$ o
    第十种玩法:多线程爬虫% t# Y* j0 D; j- f: q, [4 m9 ~6 `
    特点:
      O" b' _( c2 x+ C. W9 t* e爬虫速度加快,
    6 M  G2 E! @% l: A0 \4 K更好的利用了线程。
    ( J3 U" C6 H. k* ]- s# b/ ]5 m! c+ g" k# L3 t5 v
    缺点:暂无, N" y& e) b2 L2 j9 }

    ) y) o- A8 j6 L$ C0 }8 F0 b:return None) n( R$ Q' F; r" L
    5 h7 c4 S# S7 m# I
    request.parse(
    8 E5 r( I, T& c2 `! O        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],/ |' ?2 a# h4 F* v
            #login="taobao",
      G  u2 S+ @/ }* P& s        type_url = "text",% F4 ?: `3 i2 P4 \" y9 D' E
            Parsing = 'xpath',+ Y& J3 Y( Z+ _0 m/ j- [" ^
            label = {
    / X# p$ ~5 N2 J- z            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    8 q: H7 U$ k! Z% T! H& p            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],7 ^3 u; B7 d! [: V) T2 T. M
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]6 C5 S% ~# @/ N3 ?! m# b/ a
                },9 I+ H" t4 u) f0 U) J4 [
            write='result.txt',
    ' i( T+ U. o6 M1 U( e2 E        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    4 p; D; G) V) W& L        page=[True,"now_url.txt"],- S, H; Q% p, @! @' B9 @
            #clean=True,
    ( ?' A  _3 b. `( V        texting=True,. \( t8 U* J6 ~: c( n
            # status="threads" 启用多线程爬虫
    : b# k" T4 ^# p' E/ J/ k        # Thread_num 为线程数目,默认为1 单线程
    / ]& \* I5 [8 f9 m2 {: q, L6 v        status="threads",
    ! |' S- }, d8 S) W        Thread_num=3,
    . n) y$ K  _. Q        ###' B7 i6 y+ q' A$ g% k' N4 u% c
            write_SQL={
    2 r  Q. g4 z0 S% \  u            'host':'localhost',
    : O- _' I* W; L! n            'post':'3306',' u6 ?$ Y% a# A) J( O/ N: G7 B
                'user':'root',8 Z" ~7 t( T5 Z1 E* Q$ c, D
                'password':'123456',, H/ I1 ?! [$ }7 n4 G
                'db':'example',
    ( _( W: g/ k" e  ]3 k9 k+ G  k            'table':'example'
    / I# n3 t6 F' M- {; _            }! T9 k1 k" N( O  o# L
    ).run()
    : p3 }& h+ V; N, b/ P; O* S, f: [7 Y2 V. M
    第十一种玩法:多进程爬虫
    / ^" w( R% n8 P特点:
    * |8 a$ P9 h0 a  o爬虫速度加快,/ u3 I% y; b8 ]1 e
    更好的利用了进程。
    1 p) B" [6 X8 ^* f9 C
    ! T2 r' S. W' w缺点:暂无
    . g0 s' G% o0 p- Z7 s
    ) D/ z; D- {2 A2 u:return None
    . K" s0 t* u3 _0 i$ d& R. p( b2 _/ _( p( v8 p
    from simple_crawl import request
    , M  I8 v) a7 D5 erequest.parse(
    0 ^4 T& b! `7 C  m# j/ e        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],. _6 v2 z' U+ o7 @! K
            #login="taobao",
    1 _7 C0 J& `' L        type_url = "text",
    ( m+ |/ b9 u7 D$ h9 u8 k3 c        Parsing = 'xpath',
    + i8 o) t! e# x  }+ L! j0 W* X8 E        label = {0 G3 x8 K/ o* q+ E# o
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],( V+ k, O! Z: M5 s; z' P
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],7 v9 ]( _5 H& n- B
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]4 P$ L9 o- c/ h% \; R: _) ]
                },
    & b) ?1 F5 F; L6 ^$ J        write='result.txt',
    + g; u  o/ w/ ?, [0 [- d        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    7 u5 i: s. O' d) \* x        page=[True,"now_url.txt"],
    " j' m- v* W6 l& R        #clean=True,
    1 F8 e4 f9 m/ A* c" A        texting=True,; l' l5 L  v0 L. _( M# i
            # status="multiprocessing" 启用多进程爬虫
    # I5 C7 e/ j) J# o% m        # cpu_count 为启动代码核心数,默认为系统核数一半
    + q& P! x' b% z+ N; O0 E) a8 \        status="multiprocessing",
    9 f6 ~4 i* t2 ~8 m$ X5 r* d        cpu_count=2,0 C8 X2 ~9 [$ _' T
            ###) U! p" @; d  K
            write_SQL={
    3 _' a' ^/ f3 n3 G" G/ Q/ a            'host':'localhost',# a  H9 K9 e7 V5 H2 k; o
                'post':'3306',' E" [  }/ Q0 E  |
                'user':'root',  Z: d/ }% H2 H- m
                'password':'123456',
    ) O+ X& d1 d5 M- _/ S            'db':'example',
    $ E& w  s1 f3 q5 k3 g- F8 P            'table':'example'
    6 a1 i& m$ b! V0 Y            }
    ! _3 E& A; F3 [/ a% o0 Q' K: f).run()  [# v& ?8 k; w

    0 e! I  s4 h4 Y5 |. H5 o/ k第十二种玩法:异步多线程爬虫. G3 G, C) G% W. ]0 Q, Q3 {7 P" X; v
    特点:9 a8 ]& M3 m1 G
    爬虫速度加快,
    & |' n3 O$ ]. M/ S+ ]3 W/ ~1 m异步使得爬虫无等待时间,
    : ^; \7 E6 H+ p# o! U* R同时使用多线程速度明显加快。- K9 H+ v3 L& b7 K( |: X
    $ s8 ]( u5 }, a" |
    缺点:暂无# w$ ~4 ^2 ^3 c: M+ Y2 V

    6 H% W- m, X9 i% Y+ i: i:return None
    * s9 s/ z1 H! A, C# U3 Q( \* |+ Y/ ?6 A2 y  u! L: b' G
    from simple_crawl import request
    7 t" |3 W4 F$ _0 ]4 jrequest.parse(4 X# S( b2 A  W8 j
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    ) V( U6 Y; }$ `! W% n        #login="taobao",
    $ V9 S- s) U) k        type_url = "text",
    % m" o" v! o+ f+ X+ p        Parsing = 'xpath',
    - n9 o: R8 v. E        label = {
    , P8 u2 K3 r8 V4 L            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],+ V/ _. M. B! o4 X) s7 {% K* W
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    $ w+ \: ]) P( H; z4 G, g: X            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]5 n- r+ ~) M/ G! L/ V! E
                },1 c- ~) x6 S# ]; m+ f$ f, u
            write='result.txt',
    ( c6 M/ w; q* h& o! }8 j& J/ I- o9 W        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    ; S) x$ g5 P! d  O; M  ^        page=[True,"now_url.txt"],
    9 T6 R: A- y7 G: h1 d        #clean=True," D5 `* P# k, }% l, `/ ~8 t0 O
            texting=True,
    ; n: X- c% x& y, x: z" V        # sem 参数为异步引擎数目,默认为51 d8 h8 z# U  i9 k# |
            # 其他参数同上; O( o3 I. E+ k7 Q! o7 M" I! b
            status="aiohttp",: g* G4 G( V7 j, _
            Thread_num=3,4 `$ P5 q3 n$ v# H2 v/ u
            sem=5,
    ! d6 e" E6 w* U+ X        ###
    7 _" A7 H) W8 x1 G! x5 y/ H2 K7 L        write_SQL={
    0 _" F2 w) k, _# t: W- C9 E            'host':'localhost',
    ( |3 ~1 k$ ?( b3 I" M            'post':'3306',2 O  Q% ~2 ]3 W; G
                'user':'root',
    5 U1 x7 G! w0 y& E            'password':'123456',
    * d8 Z9 S+ j7 C! L            'db':'example',
    : q  X* n& }2 R# J6 W2 e. c            'table':'example'
    / I4 Y6 X0 G1 z: r            }6 y# \" z7 S* F3 g$ l
    ).run()
    4 n/ l; [" x' Z* i8 ?0 _7 h: \; g0 `2 X
    第十三种玩法:异步多进程爬虫
    - ?0 d3 r) X! e/ L9 Q5 U% I特点:
    1 w2 c! c3 ^' I  q2 K爬虫速度加快,+ w2 A4 y0 G! X. a# q' h0 U5 f
    异步使得爬虫无等待时间,
    . E' c: l& v  \# s& K; n& k同时使用多进程速度明显加快。& c0 U: m# F+ G. g) e9 H. E5 m* _

    6 f# E2 b1 B0 X- h: K$ r4 J8 m缺点:暂无
    4 C2 ?# D, u) C
    2 L3 O- H) [$ ~1 u:return None
    $ }) @3 G, r+ k- ~: H7 `, R; K9 W9 L2 W6 o# {8 `2 A5 b- {- g
    from simple_crawl import request+ S' t9 R( P0 G: z* W& y3 B, X
    request.parse() B5 G# R" t$ n4 |
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    1 `% o9 G& a1 R, _- |" f" V5 B& w. `        #login="taobao",9 W: V) h7 r+ |% d7 e- H3 \
            type_url = "text",( m: r$ `* c3 a+ ]
            Parsing = 'xpath',
    ; f" q) M/ {3 }0 @        label = {
    ; J. x" |/ n& F1 `            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],& B% @( d4 s9 ]
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    " @7 ^& u; p, b3 ~6 a) k4 Y            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]$ w( C. Y2 F  O% V5 z0 L! S1 h
                },
    , v2 I9 f' E/ b! G# O% G- G0 l        write='result.txt',
    + M/ M6 G2 |6 }3 e0 Z9 \        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    7 T! _% T/ v, Q4 q5 s  L( E- m4 A( Y        page=[True,"now_url.txt"],
    : o; M/ R0 V7 f$ m- B$ s        #clean=True,% K8 j& c$ k: I: f
            texting=True,7 k4 Z. {$ s9 j( w- o
            # 参数如上2 y' q- l5 [, o' M3 d8 b; B9 @
            status="between",
    1 ^8 J% a! E0 @6 M% t        cpu_count=1,
    : v# W% k2 c- J- x' P7 L        sem=5,
    3 z" A8 }# |/ a7 Y, t9 V2 Y& P        ###
    & o+ g7 h+ }) t* o7 T$ T5 v; ?1 L  Z        write_SQL={
    7 {$ B$ H( ~! o+ l& z            'host':'localhost',
    5 L: T+ V, o3 R; r4 J            'post':'3306',7 x9 k& n& Z3 }
                'user':'root',& _6 u0 a& N$ x' S* x3 N  A
                'password':'123456',  }( b& E1 t, }, {6 {6 H) h* {* C
                'db':'example',7 K* ?2 x3 j$ Z9 l
                'table':'example'
    * _5 \3 c0 ~, j' u/ Z4 p( z. a1 d3 L            }
    4 |- f5 f7 H7 e0 L2 O8 ~- i' ]).run()
    6 Q  o8 b5 p/ @  r8 n4 ]; G0 V8 Q. V4 x# f4 r& S* I

    2 h3 m4 ]# p, I5 x' D9 `/ _; n/ q功能介绍完毕🤞
    ; Q3 Q: w' Z) m最后还是希望你们能给我点一波小小的关注。
    " Q( i3 t( A- N( @6 ?; f% a奉上自己诚挚的爱心💖
    ' J6 Z6 e" n& I0 V( G————————————————
    . x8 `9 O6 c5 _9 g$ g& x# {! ?1 i版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。' G2 s! t0 Q3 ?1 R2 p" H
    原文链接:https://blog.csdn.net/qq_45414559/article/details/1060056843 f. z5 G- o2 J
    + w9 J+ ]7 s/ C! k

    # y2 j4 X( F* z$ b7 p# z
    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-8-16 07:03 , Processed in 0.481597 second(s), 56 queries .

    回顶部