QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5444|回复: 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_crawl0 V7 _  I/ X& j! m
    simple_crawl
    + p' L$ K4 K' |3 ]- s7 C/ x. `仅需一行代码即可达到爬虫效果/ T& R# {4 R$ }) E1 e/ b
    项目地址(欢迎star):https://github.com/Amiee-well/crawl, i: M6 K& }( Q4 W( x6 R+ P6 U
    使用方法
    % k3 T3 r/ P1 ~- Z+ p+ |8 Xpip install simple_crawl7 b  ]( _# N- P6 G5 c
    2 ?" h8 ?5 H. I2 Z
    ### 以下源代码为简单介绍,详细功能介绍再源代码之下
    0 K7 [1 i! x$ v; W) K% o+ @8 _from simple_crawl import request
    8 Q2 ?$ s. J" ^0 f$ T# wrequest.parse(
    3 ]: f5 g: z& m1 x; `' U* S8 M; P        # status 参数为运行状态,支持单线程多线程多进程协程以及联合! e& L( v* s& I! [' }
            status="aiohttp",
    ) a: i8 y& v1 S2 x% S        # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式2 {8 r+ ~8 N2 K% _5 U
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],! \& ]2 r# J4 A* b& F" l4 h
            # login 参数为获取登陆信息,如淘宝等网址需要登陆信息: \0 O- |8 Z' H
        #login="taobao",: |# f) |0 [9 v) s$ l
        # type_url 参数为返回源代码格式,支持text和json,默认返回text
    8 A% X( d' s3 W5 {' W    type_url = "text",5 m8 Q( x- g$ R, y/ c! Y9 g
        # Parsing 参数为解析方法,支持re、xpath和beautifulsoup. D9 f$ @  F/ I  h  e
        Parsing = 'xpath',
    4 L9 H6 A- X, Q0 J1 [+ N    # label 参数为爬虫解析过程,字典格式,详情见下方8 y. e  s/ ^& @3 [
        label = {4 ]# x+ s4 h1 a# L& [
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    * k- f* K3 \3 v            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    1 k5 O2 J" ]/ O5 z            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    3 T: N8 U2 i8 p     },* G2 ?2 w5 p1 Z3 e- z
         # write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱/ _- f% n  e! G$ u
         write='result.txt',
    3 [& P  t1 _, L. @! H$ T6 D* L     # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫4 U9 p5 d2 [  s3 w6 {8 \
         next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    9 |# F% ^9 x, e! K/ \# ^     # page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫
    1 q7 P1 t' K. r% n* K1 {     page=[True,"now_url.txt"],
    7 z; y4 f: i4 B9 r     # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息/ b  h( D  a. S  g& ], V9 w% b) s& q
         #clean=True,: J3 f: s# n: K8 b' x9 w: t
         # texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序3 V3 N& A6 b- ^$ S" z# M$ M
         texting=True,
    2 i$ M: K+ ]% ~3 q9 P& u" k, J     # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态; N. d  X/ ]) `/ D, ]" l) Q" c& E& a
         Thread_num=3,
    5 C; e( g* R4 X) J! G7 E8 L     # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态
    ' H. T1 \( n% ~: h% g. I- S     cpu_count=1,
    % P3 L2 X& u- [( k/ ^     # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态$ S, N) D9 V( y6 d
         sem=5,, v( O" o6 o- i# e1 v) H8 {5 G
         # write_SQL 为是否写入数据库,默认否
    ; z/ D( ]$ i3 E% V* l     # host 参数默认localhost7 v. v. S0 ?9 Q
         # post 参数默认3306% b4 X: r0 d! H) Q' o6 z/ g" X
         # user 参数默认root
    * k0 e$ ^/ i. ?0 h     # password 参数必填,必须正确- o: U8 _3 s' O1 m& |6 U# y
         # db 参数为即将存入的数据库名,若不存在自动创建
    $ p; D  R: @& N% k0 j     # table 参数为即将存入的数据表名,若不存在自动创建  E$ L' ]  P' B) d  {4 F+ X  ?
         write_SQL={
    " I1 W* Z7 y3 w9 g! T. Q8 d         'host':'localhost',* p$ z/ n8 T' s' M6 Q9 a4 q
             'post':'3306',
    ' |* r0 p- h) Q         'user':'root',
    ( E- N, j; t# Q0 a  X/ E  X4 N         'password':'123456',
    9 c; h9 {: z" h% b% Z4 y6 m         'db':'example',% w3 n0 l0 K! O$ g0 O  s6 i
             'table':'example': ~  S* K) A/ F: }* h& ?7 h
          }
    , R' w: c  g" N/ M! O0 z8 j).run(), l6 F8 @& F; d9 C/ l+ b  T! n
    + h! w  s: G% F1 X. V. N9 Z
    介绍一下crawl参数设置:
      u$ I* y4 R- R5 q9 U0 N$ _
    - Z% u/ m3 Q+ n% u) b, }'''/ d/ L( ?: u& g/ j; w! z
    单行代码爬虫程序执行& k' @) h+ n& l0 `+ D4 E$ p: x
    :param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档$ R$ N; d0 ^& Q$ H1 [
    :param url:即将请求的url地址,仅支持get请求  Y* A7 e: n! I3 f4 F
    :param type_url:请求url后返回格式,支持text和json格式返回3 Y3 Z  M# Y: i1 }. D$ E
    :param Thread_num:即将启动多线程个数,默认为1单线程3 Z- g2 X7 D1 @; V  S0 E! `
    :param sem:协程信号量,控制协程数,防止爬的过快,默认为5
    4 Q' s/ ~; `; j' x) n# I7 F:param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半+ @6 c- H* l' K( ^
    :param login:模拟网站登陆,保存登陆信息0 l4 H8 V2 c4 a' ^1 @
    :param Parsing:爬虫方式,支持re、xpath以及bs4方法
    2 G2 s( y1 B' _  e- {5 e1 l. j:param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,
    " `& J+ s/ j# }( t0 l                       多次报错结束程序,默认否
    , v1 M* t, R/ B2 c: z$ c; ]:param label:选择器内容,字典格式保存,
    1 v% N( b% w  a/ W; h3 |% ?. a                     字典值为列表格式,第一个参数为选择器,第二个参数为转换类型. K- v8 [/ W$ [, S% n
                         第一个参数必填,第二个参数默认str类型) j* i, }& v. @2 g. d" M- d' P
    :param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否
    - d8 {. b4 }. Q2 u# p# M( |+ p:param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫5 k, \6 I, K6 [' G5 |
    :param page:是否选择断续笔记接手下次爬虫处理,默认否8 a4 a: B+ d( {# `; D/ v- l. Y- ^
    :param clean:是否进行简单类型数据清洗,默认否
    , x) U. P1 }$ }6 J5 F/ M:param write_sql:是否写入数据库,默认否
    ! W' |! V/ M% y- ]7 v3 k                         'host'默认为'localhost','post'默认'3306','user'默认'root',
    : c. C+ R0 J; d( u6 B. r  y: w% |                         'password':'密码','db':'数据库','table':'数据表',
    ( Y- f" @% ~' j2 r- K% i7 y                         检测库是否存在,若不存在则创建,若存在则直接插入,
    ; c' e, `5 z8 G( T                         检测表是否存在,若不存在则创建,若存在则直接插入) @. x( T/ l3 f( r
    :return True
    ! _5 a# s  K+ h$ s'''2 ]0 f& r- v5 ^8 @1 B
    介绍玩法. m. P. E: k1 Z: o" T4 l$ o* k
    接下来介绍的均为调用第三方库的情况下运行:/ M6 ~- ~* b! S  v: X8 F  o' o

    8 L. T' t8 }8 J& F# H8 ~from simple_crawl import request
    6 e2 P5 q9 B3 @" m( [' M- M第一种玩法:输出源代码
      G. f) ^" ]" S调用requests库进行源代码请求。
      W  R1 K. S8 I. s- V# D$ @8 f
    * p+ I; |2 Q9 X* E; q6 {特点:6 m4 q5 ^& {; L$ ~
    请求失败则调用ip池处理重新请求访问,
    / \2 l5 M3 J4 K出现五次失败默认网址输入错误。
    $ h) Z7 d3 ?5 z0 k+ A* R0 N1 J; {支持text以及json字符串返回。默认text。/ [8 ?0 ^' Y  _: q' T' _! a

    ! f+ m7 T6 s, c+ V/ q6 `缺点:
      s+ L8 C& O# A) Y/ \9 U7 h/ r暂时只能进行get请求,不支持post访问
    * g5 _5 B5 |" i9 ]+ {6 C, z$ v2 P* W5 \* J) r0 ]- Y- z) d% H/ r
    :return text or json
    9 h- z1 G/ W) R, D  }  ]& x
    ; m4 F8 f) ]: }( ?. [/ s2 frequest.parse(' W8 ]- p/ R9 w
            url = "https://www.douban.com/group/explore",
    ! e8 A1 v1 G6 L5 w+ \        type_url = "text"
    ' ?- k3 B4 m- V3 [- L0 M) C, |).run()
      k7 _/ d! E. y/ H6 |# return text
    / J/ Y; ?8 U5 z6 c) s; G# H1 P* Y( R) U1 L; e- p0 p4 z4 P
    第二种玩法:模拟网站登陆并保存信息# ~; ]3 X7 [7 D0 |$ B: X2 F
    调用DecryptLogin库请求登陆访问。
    5 N: h9 J" {( T1 o" S  q5 Q$ V4 L2 ?) ^7 Y- s
    ps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源0 r# h! r2 |3 ?3 N; r: {
    在此放出文档地址
    # m1 @% m3 [5 R" i% r3 V, n7 DDecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/
    6 K% P6 r, f  i& z% G7 p) P* C3 t2 p9 T
    特点:" o3 z7 l; Q( N7 O" M, n
    将DecryptLogin库中二维码继承到此库(非二次开发)- `1 b* S/ N$ t; T8 V; A
    支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆)% a3 q' K; J4 B0 g: K9 A/ N8 \
    保存session.pkl信息到本地方便下次登陆运行
    + H! P0 T3 B3 U9 t8 K# B/ M
    ' v, ~/ z8 |& y5 e8 B缺点:$ \7 _0 P; e, r0 S) T
    session.pkl登陆信息过时无法自动删除。, T5 m  G+ d5 y% q! c9 o
    导致下次登陆疑似cookie无法正常登陆。
    ' O0 R) o& B. J" J- i1 t  w7 M, G: J: m
    :return session% ^) Y) s* V3 j' \; G3 j/ t4 U* ~. Y& ?

    . ?. p* V! M2 N" brequest.parse(
      ?5 t& W( T% z4 O6 n        # 臭不要脸的推广一下我的店铺, V. A3 h4 L- E) U% P
            url="https://shop574805287.taobao.com/",
    & v6 G2 U: F7 j  Y+ C6 l/ q  d        login="taobao"
    2 o1 b4 G( u' t).run()
    6 w: M; y& l# a8 z! T* y' i% E# return text, k: b# V3 K  b( Z& |- D5 b- }8 |

    1 m$ r: l0 Q8 a' q( y4 f8 r3 T第三种玩法:爬取网站信息
    / A! Q/ F9 k+ M爬虫库自然少不了爬虫的过程8 G9 [5 L7 r3 w- n2 |4 W8 ~
    # Z( u- _* H$ S9 C7 l! `
    特点:
    : }9 O- u6 R. T3 @支持re库,xpath解析以及bs4选择器。/ e5 i8 |+ `1 M; \5 Y- z/ P
    爬取方法为字典格式。单方面输出。  M2 Y1 F9 m; a( I$ S
    字典键为保存的字段名称。
    2 M: V' z9 B, q$ ?! M. q# H字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。
    " x1 Y( \  i# G7 A4 k1 O4 T' ?  V  k8 ~5 Z+ b/ B8 |9 `6 L
    缺点:暂无(等待小伙伴们发现)
    $ ^5 S) |+ j* k5 W( m' e! E6 \; q$ {. l" z% J
    :return reptile_results2 i1 j8 B. w) v9 o  O0 Y

    9 }) F; k$ n; wrequest.parse(
    # e$ Z; t; z' ]! i2 J  I' f1 D& \        url='https://www.douban.com/group/explore',
    - |, [) h" F! p* L# A/ m; A2 q        # 字符串格式,选择器方法。
    / V! s  C# \+ n# k    Parsing = 'xpath',
    2 d# L2 ?9 r& t1 Y3 Q& [    # 字典格式,参数如上。6 j8 r+ }+ m0 q/ M  L
        label = {' h5 D6 v( n" s1 k7 q5 ]
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],9 \3 X% A% A- j' ^* E( `3 l
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str]," ]: q; ?% t7 [$ E8 S
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    7 R  s7 ?; `6 Z# m/ }        }
      O- B; b0 f7 S; X3 _4 \7 p2 a).run()
    8 N% l+ r8 }* [, A5 G# return reptile_results(list): b* j2 r5 U! H( e+ m. L1 c

    8 n4 W0 G$ t# N' u. s9 J第四种玩法:自由保存信息
    8 A: [' s$ j( I8 g  f目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。
    & y2 S  A+ i! |: g$ Y* o" b; b! Y) b$ L0 [3 t
    特点:, u/ i7 g& k# ~" e! j
    写入文件均为数据格式传入文件。" s5 W- u5 o3 [" A! p' L
    且输入格式规范方便阅读and省事。# J( W  s8 a& O* N9 n
    0 \4 r4 k$ m; {3 Z
    缺点:
    1 r& C* H4 T3 k/ q保存格式仅四种,
    ( D7 X2 d/ A7 N* A) N. q% Z不方便用户之后读写操作。  Q4 _( b  R7 v. M8 r6 v' Z

    8 a9 \% c/ P0 z( y, g:return file9 ~: H9 n3 M2 f$ z8 R+ x( i+ f
      s! Y' _9 n/ c! b, r
    request.parse(3 e* P/ k4 G5 m4 H6 v1 b3 b
            url='https://www.douban.com/group/explore',
    6 ?; m. h4 l6 [0 P    Parsing = 'xpath',* X% t. g6 [0 g; g$ c  m- T
        label = {7 V$ r! c; e0 t, i2 X
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],7 I- R8 @) E  Y0 D2 q
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    ; B6 J2 z- [! b9 e9 P6 E7 h" E# F  J+ y        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]" D2 b7 E+ A# v- D# r. S
            },; y5 x6 ^  j; b2 |* Q' g8 L
        # 字符串格式,具体保存位置填写
    # S+ y: T! r5 m1 N! N) y5 r3 ?, D    write='result.pkl'
    " L: H. i0 l7 P( q7 ?).run()  V" E- ]3 B; |6 M& ~0 q. ^
    # return file
    ; R6 a: V& S: u
    - |) X3 U9 m  N: @; C( r2 ?( ?第五种玩法:读取下一页 url 地址继续爬虫
    ) s6 h$ w4 n& P! ~- h$ {这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~, K3 O/ `- a) w  N& y

    0 v% X1 ^' P; I1 z特点:  v/ N# v) L; `+ |! i
    继承之前的Parsing参数选择器选择方法。
    & p6 `2 S) g1 w, x  S2 p/ C' q2 l在这里可读取到解析后的下一页 url 网址。$ }6 j' W5 H: C# B# {4 A: ~# P$ \
    方可继续进行爬虫处理。方便用户使用。
    $ N+ X) D; Y- Z& }2 P1 q. n! p1 l# l8 J- G& U2 J1 S
    缺点:
    & ]# Y' N% R  D若爬虫时下一页 url 地址改变,便结束爬虫。4 @' A9 K; r5 n' E, {8 @+ G
    只能爬取所给 url 地址中的信息。: i! v+ t) Z7 h, e; V" R
    无法进行某一界面的多个网页爬取返回。
    + Z+ K% n* w) O+ J* ?( m5 W造成访问页面单一流失。
    % Z9 Z; S0 ^0 A+ h, u5 x7 r6 U4 N& o
    , R& \* i4 [1 v. {& M6 ]* a:return None
    * q2 E) k9 R, K$ R# s+ |! y, e9 b) Q" h! \* i
    request.parse(5 M& F9 R; q5 [7 O
            url='https://www.douban.com/group/explore',
    8 \9 C; Z( I( @# E1 S& H    Parsing = 'xpath',
    8 O- x/ U1 I6 b, M    label = {
    " ]7 H$ E' }" A. `7 ^8 Q        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],; f- P3 E! \' X2 ?
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],3 e( t$ k5 `; F$ G( b+ s) |1 y
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    . R5 _+ p/ ]  u" D6 K        },6 U& X8 P$ L  H2 }
        write='result.pkl',* x$ a8 [+ F& {4 e" i2 s2 u' x0 S
        # 字符串格式,根据Parsing方法继续请求下一页a中href% E7 y( M! u( q! n
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    ; J0 S. O$ A! }. O0 j3 M).run()
    # A& I% T& }2 Z- t5 T+ M6 |# return None   g% R& b- r5 P9 I# a

    ) m5 |* b+ }; B4 t+ I9 U  c2 r第六种玩法:爬虫网页保存
    % s' B5 D* M. ~4 {" n" T听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!5 C/ K' Z  N( Y
    : I) C) J1 G+ j3 K
    特点:
    + l0 k% k' a8 ^1 a4 m持续输出断续笔记。
    " U2 I2 a4 x% {4 @& ~  ^, Q将此次爬虫的 url 地址保存到一个文本文档内部。) W& `7 M  O. h4 S) m$ Y* Y; Y" x
    下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。
    + {5 J" w$ ^7 G
      E0 P5 C/ l: Y+ q" v$ n! a9 A缺点:
    & {  a6 Q/ t7 y: D8 r6 y读取内容不单一。
    5 k* Q" [& l3 {0 ]' N) d; V导致下次爬虫无法正确读取上次爬虫留下的痕迹。
    . r6 U* A2 j! G
    ; _% ?: Q# P7 m, I:return url_file/ i3 L& w) r# q' e
      z8 X2 _: g, K* g' G- }# ]
    request.parse(* L4 c" J, E  Q" [
        url='https://www.douban.com/group/explore',% H# W, h8 }9 o- D7 Y
        type_url='text',
    1 q" {: Y. k2 Y4 W' X% R  ]# p    #login='taobao',& I, w7 w4 N/ L
        Parsing = 'xpath',- i1 |6 r8 R4 j$ y) X1 K
        label = {/ A: S  P/ w, i5 w
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],/ Y1 v# n. b, d. h1 V9 x% P
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    , [+ W, S' ~0 c) ]        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    % `- c+ v; ^( ]4 Q* A        },& @( F+ V2 l' A$ p: s
        write='result.pkl',9 l' q9 Z: ?; I0 ?+ F
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',/ j, N/ o; U$ L5 \0 j, q7 q0 z
        # 第一个参数为是否需要断续笔记。
    4 D- t8 j1 C" y6 h    # 第二个参数为断续笔记保存位置。  h3 |, ]0 x2 M
        page=[True,'url_page.txt']% e: D/ ^. f  s( W1 k
    ).run()
    - Y* X5 o6 Y$ b0 ?2 f0 M: R# return url_file  R4 M' h8 Y% [) F* E2 u

    ( h# B# U: v" V5 P第七种玩法:简单数据清洗3 k, @& q6 J8 i' P9 M% R1 p
    数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。! Y7 V  X" ~( K' w& P

    1 F9 L8 K" i9 H/ E& A" ?; Q特点:
    ( Z6 T( {. N, v6 N4 h' s# S; F本人曾写过一个底层数据清洗。
    " \1 r# b( ?! _( |# D5 I7 A能将列表格式数据进行归分清洗。
    5 F. x) e' p" G; v% X主要内容请参考另一篇文章. e7 B) G1 M) L( }! ?& C9 i
    如下连接:数据清洗% N2 _4 E% p5 }0 i

    ( t6 D3 T0 f0 R1 T) Y  q3 z缺点:
    * d: R; _& `& c) ?3 z. ?/ _数据清洗格式简单。0 J* \1 i* |( s* |
    数据清洗内容单一。6 D) f5 o# u  u
    无法完全做到绝对清洗。
    ( y9 f( S0 Z' L有待改善。; g1 Q1 Y0 p" f) x. W1 ^

    1 \8 S9 H4 N' F1 s9 V' D:return keyword_list, value_list. |. x* b) C# a1 w
    - E1 }- K# m7 @8 I3 c" W3 \. m+ Q
    request.parse() T4 m! y8 T' L& D7 m
        url='https://www.douban.com/group/explore',# W1 J0 U! ~. B2 |
        Parsing = 'xpath',
    ; a( {8 c, P# o# C; z8 i: ]" z    label = {
    0 ?. t! V5 K) h0 K3 F: `  h5 N$ l* s1 ]: u        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],' g, [/ s' `" \6 U/ Y* k" Z  U
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],8 X# I$ ~0 B7 q6 W% t( {
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]- R! [! z/ \7 b% u- |& r" M- ?
            },
    # e& {2 H& W: P0 q0 _    write='result.pkl',
    2 j0 [9 R! ]+ u) @- `9 P* E- O    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',  b4 E) {3 k# p
        page=[True,'url_page.txt'],: s6 J3 q8 c( h" x( c) X& o  [) O
        # bool类型,默认不清洗  }3 a* J) P; ~4 y: W
        clean=True
    ) Y. K3 z3 P# n. `6 i).run()
    , @  J. }9 K; T# t8 l  Y" J) `; R5 [: a
    第八种玩法:爬虫存入数据库
    9 E& n' ]: }$ i4 @存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。5 U9 D8 |$ ?, o) m7 c

    ! g( L9 T- s. E7 R. r7 ~: L特点:
    4 S( m" D$ S; X: b! W' t- b' w9 y9 }信息存入MySQL数据库。
    $ A! y9 F* G0 R% U! a可连接docker远程数据库。# i: g4 m6 _! u
    数据库的库名可以不存在。1 i" l; ^) k1 ?; S) O0 j- L
    数据库的表名可以不存在。  V/ v, j5 s& g/ R; t$ Z: ~0 f
    根据之前传入字典键与值参数判断表类型。: |3 o8 a- @% @# H6 |2 o3 `
    自由建立数据表传入信息。
    ) ~7 y8 P3 b; ^( H) Z: l" W" E+ B3 @7 s1 |! n
    缺点:. x+ J! W" A8 W" q' W; _2 G
    仅支持MySQL数据库。
    & o# C. m$ @7 \, `# R/ W- Q) C3 W% A: k5 D0 Z. f
    :return SQL0 i" C, H7 o, Z6 ^
    8 q0 A) x  N1 ~" Q$ J/ B4 k
    request.parse(
    5 f' u8 P5 O( O! [    url='https://www.douban.com/group/explore',  P& C6 e$ Y% g# [2 m
        Parsing = 'xpath',% M& q6 d: Z) J5 ^0 m, T
        label = {
    - y" E! p+ J* O        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    6 @) b! q; J& d+ ^6 i        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    5 S  U8 n: @1 {+ q& t6 ^; k7 Q  f3 p        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    ; ^6 ]* m  d0 N( S' i- D2 m( P        },8 @0 E2 L' X4 u7 Q$ }! ]9 h$ l
        write='result.pkl',
    3 Y6 L/ r5 j3 i0 w1 `    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',  D/ y" z! O! q- I$ U
        page=[True,'url_page.txt'],8 ~1 z- Y0 w3 C0 j: T
        clean=True,. @) r8 b9 S; T: o9 F
        # 字典格式,
    & e- \5 T7 O/ I' `; a1 G6 ~    # host可有可无,默认localhost
    : }. {9 i3 q$ t    # post可有可无,默认3306* O8 `1 C. N8 x) H8 |
        # user可有可无,默认root$ @3 g; {5 z/ q' N% F
        # password必要参数,数据库连接密码6 B% x) D/ d7 G4 `
        # db必要参数,数据库即将存入的库名- i' b  c4 }5 J$ D( w' l' H! f: Z% Y
        # table必要参数,数据库即将存入的表名* G0 f4 P; Q; e' A$ }; Z2 S6 h/ ]
        write_SQL={* a' p" {: z+ x. c
            'host':'localhost',
    7 }  @4 [! X' ]2 z8 B- m; q$ x        'post':'3306',; {- g- F. l7 T* X$ O
            'user':'root',
    : ^) ^) F: f9 F+ E+ s3 ?" A/ S        'password':'123456',, e  m$ _; h5 h: u# B
            'db':'example',
    * w; g' V1 ^, `1 I# O9 t6 @6 Y        'table':'example'
    5 e/ A$ _% w" T$ p' e1 `8 ?  n        }3 v) C- w) r) w- i% u0 X) @
        ).run()
    % Z% B! I6 [) U/ ?/ A/ p
    8 C6 F3 P  M1 m- c" u9 I0 F0 Z第九种玩法:重新启动爬虫4 X9 b6 Y+ h, H3 \. ~0 e
    爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。' ^* r. h" G! Y
    8 Z2 Z3 ]: j' I* O
    特点:
    . T7 k8 o5 N9 |2 k/ S0 A检测报错重新启动爬虫
    ( T. J" n) A0 ~无需手动处理错误信息
    $ \4 M. p. s$ m# |. u  \4 r2 k& ]/ {  L) M7 w4 h1 `: G
    缺点:; V; `6 K  e5 b" U7 p0 s2 j# u7 ^9 }& M
    无法收集子线程错误。
    + V- ^5 t/ Y3 W% B& j
    / V' A5 w! v) ~9 r9 q! H:return None
    8 }8 H$ b, j: u; I+ j1 P( z0 `( ?0 R$ G3 J6 @* V
    request.parse(" B' U1 R. g1 e# w" @* Y) t% h
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],: {( |# E. D' E" b, L+ J0 j
            #login="taobao",7 ^% L; H% W2 t% [/ L% |, W% n! H& B, I
            type_url = "text",6 b- E& C4 ~5 G( p+ r
            Parsing = 'xpath',$ t% \8 p) V3 R1 V9 g
            label = {- P) ]0 o% n- x, w, E# p
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],1 Q& u: q$ a( L9 ^9 ^( S
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],/ @+ ~. u4 n# P0 h
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    2 g: \$ ^! P1 B( u            },, I$ I3 t0 |& F; e3 V/ B
            write='result.txt',, J$ t) }& E  f6 }0 W# h4 \
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',4 ]! `+ f, L# ]1 L7 E! ]
            page=[True,"now_url.txt"],
    3 B( A; A  {7 X6 V$ P, y, M4 ?        # texting 参数为是否启用连续爬虫
    8 _0 o% h% @; c- j! L1 S8 m6 z& R        # 爬虫程序异常报错后重新启动爬虫# P6 \7 v* O9 G- m
            texting=True,
    $ _  r4 a3 R" a3 D. ]: [        ###
    - ~8 l* D6 h& o) j        write_SQL={
    $ P$ V& R! y/ q  g            'host':'localhost',
    ! u8 q5 ~& |) R: Q& `9 E$ D            'post':'3306',
    8 k2 g" B$ a  g$ ^5 x1 s' ~            'user':'root',& L4 |. w7 C8 W" N6 D) V0 V3 E% l
                'password':'123456',
    0 u# O8 J- u* G" Q7 v7 [            'db':'example',' M) d, G! R* C( e
                'table':'example'
    5 L7 ^( I# Z9 k% R  W* M/ r* K            }  v4 N2 j" P6 s- n4 R3 }
    ).run()% B+ N! G. I; K% w2 G, S
    - z3 j6 P; [  W3 q& ?
    第十种玩法:多线程爬虫
    4 \7 ]/ J0 e% p) |9 B" q/ \特点:
    ( @. g5 ]8 p% t/ v: n7 J( @爬虫速度加快,
    . `% F) T# `) e1 D& V: b, _更好的利用了线程。7 @7 Y( O# @" b

    6 N1 P9 F! w* w缺点:暂无% }* M- Z4 V: V* ]! ~& Q
    1 ?8 I9 {* }3 @
    :return None
    & S& j- z0 b9 X3 _
    9 t: x& O4 y# ?request.parse(
    7 I, d7 d3 i3 F6 B3 j/ v: R- X" O/ N        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],3 U' c& [6 j+ y8 a  O2 H. G3 V
            #login="taobao",9 `) `) O3 _* `" C# {7 H
            type_url = "text",
    " i# {: o0 [3 H6 S0 x' `        Parsing = 'xpath',
    # E) I7 t; O4 K1 @4 i        label = {
    1 U0 r6 m7 }# s+ P& v9 d. d            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],- j0 `& b; _- L1 N8 n
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    2 E5 O/ s% u6 T* I2 x1 v. y            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]/ j9 U8 |* A+ d' d) y# A- u: z+ |2 u
                },! ^( M% L3 i/ ?% Y
            write='result.txt',8 l# f: t% g* X1 ]/ N/ m. T
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    7 e# }; w! }, Z2 @: t# U        page=[True,"now_url.txt"],
      ^, K5 A" X: w7 e( c1 ?4 H        #clean=True,
    * m+ B: ?9 {. w; Q6 \- K  T+ S% h        texting=True,) I5 X+ n, b; {) @: s/ S
            # status="threads" 启用多线程爬虫
    0 e2 ]# s9 y6 H7 c  T        # Thread_num 为线程数目,默认为1 单线程2 d8 t$ E: w- l2 o; s6 S
            status="threads"," g* K9 ~8 c! c0 a
            Thread_num=3,
    3 [  b5 u! t# I4 z        ###; M& k4 X" J) x; _
            write_SQL={) `; y* |$ G+ k% p6 [( U
                'host':'localhost',
    ; g" c1 I. B4 E& r0 F9 [7 P/ @, v            'post':'3306',# n7 x% e6 M/ {8 x3 V! M
                'user':'root',% n- M( U6 A+ z; ^) y' Q- Z
                'password':'123456',
    1 l6 D" D8 E6 N            'db':'example',
    ' b  l% K5 x5 f+ Z% ]            'table':'example'' V2 I' C9 s, r) I6 k. q: S
                }
    # V6 y# E$ B; Q).run()
    7 m- y! M( `- N, k, Q) O% ?0 f" a0 F: F' w
    第十一种玩法:多进程爬虫
    & F. {& ?+ L+ Q9 V; Z# {% \特点:* `* {' Q/ F' t$ w+ B# V
    爬虫速度加快,- J8 d, l# U( A2 ^0 u" `1 _% y
    更好的利用了进程。
    & x! C4 z$ G' I8 G+ k7 Z
    9 k) l. {) T! G1 `缺点:暂无, H% [5 v3 E4 M# R
    - M$ t, h' F. Z" n8 j
    :return None
    / e7 o1 x( }: m( j& s5 O; i3 c6 |) e) p* m, h! R: G6 T1 r
    from simple_crawl import request
    : K: v  L( I! H1 }0 H6 i4 e% Zrequest.parse(
    ( @' a5 N" G6 c1 X  k" q$ _        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],4 o$ B5 p" Z) c; [
            #login="taobao",( P' `* r/ H4 k% A* y
            type_url = "text",% x! G& {6 C0 G! H6 j
            Parsing = 'xpath',; J) X6 f2 I9 v! `' J
            label = {
    2 D" W3 M$ }* h7 W9 A" ]            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    ' G6 D9 S, K! D. ?1 F            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    ' I0 r8 x. k: K4 Y            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str], ]' y9 a: g* z4 w
                },
    % T# n- ?/ }% O/ E1 ]7 o- D        write='result.txt',' ~0 t# j- O7 Y  a, A+ E
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    4 w8 x  e' M* k& X2 {        page=[True,"now_url.txt"],! j( X/ o7 X1 x
            #clean=True,
    ' c9 {8 q' g# C0 ]* J: D        texting=True,
    % p! [9 z3 B! j0 v* u0 U) ]        # status="multiprocessing" 启用多进程爬虫
    , k$ V: x. s# _$ M$ k        # cpu_count 为启动代码核心数,默认为系统核数一半
    ) ^9 O" _: P! H$ p- C1 |        status="multiprocessing",
    ' |$ A2 }9 y8 N        cpu_count=2,6 X! n2 m  W! x' l1 \4 y
            ###- V. }. U( R$ u- `
            write_SQL={) F% A  r% A5 W( P
                'host':'localhost',
    4 b* x3 A+ ~( f3 s9 {4 j            'post':'3306',4 k* p$ ]0 I0 r: S8 T6 U" m
                'user':'root',2 E* h/ d2 t# H$ l: Q
                'password':'123456',
    # i/ W1 B% v( D2 R            'db':'example',
    1 E; u7 Q& s0 O8 B            'table':'example'
    1 H0 H  z- F$ }2 H            }* \& p+ J9 A7 U7 V
    ).run()6 P1 g4 F/ {% h+ S: v
    0 m1 y8 L5 ~7 `9 h& t) v
    第十二种玩法:异步多线程爬虫) C7 w2 ?: }9 \- o) F# T" b* R
    特点:* e- x2 X" ^0 n1 X% y
    爬虫速度加快,6 ?% P. @8 N4 S% a* h6 `
    异步使得爬虫无等待时间,- u# c( B- \6 v  O8 @  j" S
    同时使用多线程速度明显加快。5 [' a+ }! L" ?2 F* l) E8 A

    ) I1 \. V. O) d: K! f! a缺点:暂无3 D& l5 l0 X$ @' q/ |2 t+ z
    - o( B- D  v! {
    :return None
    ' U; p9 Q( B( x  ~
    5 C# Z6 M2 s8 R0 Q% ~% @from simple_crawl import request, m6 }. m* m4 j# p; U/ s, F
    request.parse(
    & _( H% w3 }: T9 ~3 d        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],( @5 X- I0 d5 B, C6 Q& q
            #login="taobao",/ t/ j! O( Y& P
            type_url = "text",; A) [" m# B# {! C6 V2 C4 ]
            Parsing = 'xpath',
    5 k/ R, p& l8 F0 Q7 d. Q7 q9 W        label = {
    2 J( U, p% l8 [& A8 ~) }            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    * L5 e' ^) n/ d            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    ' d( Z1 R5 W( ^6 R" R: U            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    % c7 C: R# ^7 G6 ?: K; ^            },2 h# j+ a0 T3 c( }
            write='result.txt',
    ! g  K, X# Y' H        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    7 K0 p7 w; t6 c( O, [        page=[True,"now_url.txt"],
    " }) o5 J2 g# H2 Z* |        #clean=True,5 M8 a+ Y; P% ]2 T. F: R" Y! E0 Z: ?
            texting=True,+ n- C  f7 u* d7 l+ v
            # sem 参数为异步引擎数目,默认为5
    + y# i5 L; O% |  ^6 F8 R        # 其他参数同上9 s3 j. X8 ]0 d+ B) C' B6 x7 g* E
            status="aiohttp",
    9 i1 }& d. x+ w& v1 a        Thread_num=3,
    3 C/ U- Q, U+ r0 a# f+ N1 ]$ Z        sem=5,! B/ E- F, H4 K2 u/ u
            ###
    " E$ h2 w  i' L; @( c        write_SQL={; U1 S' V6 J9 `
                'host':'localhost',4 Z2 h# s3 m4 u" s# i# |$ E  a
                'post':'3306',. O& C( G" h  t3 `5 w& ?
                'user':'root',
    2 D, r" n5 ]7 C( R' Y2 h* x            'password':'123456',8 Q* l/ k1 v6 ~9 y/ a5 {8 C' T
                'db':'example',
    - O1 _: F  v; ~$ }& m8 p            'table':'example'* F2 p  ^+ _3 N" i* q. A! I& M
                }6 n+ b7 ~% Y5 D, r
    ).run()6 y# p" x5 x4 _) n. ^/ H
    + w- b! o& h/ F' M
    第十三种玩法:异步多进程爬虫4 d) r0 w9 R% t$ s
    特点:
    8 w( d# [  P( F8 q爬虫速度加快,9 ?) x5 [' V; A- d
    异步使得爬虫无等待时间,' f% s8 w  p/ c2 C$ w
    同时使用多进程速度明显加快。( J  `/ W: a% Q9 f8 v: g
    7 k: w+ R  l4 ~9 J: x4 ?, H
    缺点:暂无9 i/ \! A, K( W2 f! M- m' U
    ! G1 u7 Z  F$ p# S9 F8 I" N
    :return None% G1 o3 M7 S, t1 D& h

    & R/ x( e$ d; q5 Q7 G6 B- x$ A5 efrom simple_crawl import request# T% g% q$ q: d/ n6 O, y6 C
    request.parse(
    2 K& w* F0 K  s  I( V        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    2 |0 Y9 Z- j) U1 G- A1 {0 f        #login="taobao",  g( Y, v* d4 n5 _! a; Y' k
            type_url = "text",
    ) f6 C- c0 g% [7 l6 r3 D        Parsing = 'xpath',
    & d- v; r6 h7 U" b% ^* E2 T- _$ X! F        label = {2 p/ _! F7 c- Q; e: L( v
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    . U$ W% ~' R( E+ a6 D  {            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    " C0 V# a) D& L' t0 J' o6 C: O& j3 i            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    ' w! C3 H4 T+ e$ ~: k& c            },* R1 k/ H3 S- _7 r; ~1 G! B
            write='result.txt',
    ( v8 w$ \' ?, C7 T        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    * v/ H& ]5 X2 J2 A+ `  b        page=[True,"now_url.txt"],2 k: U  e7 a& I
            #clean=True,
    ! P! R8 B4 N4 }1 [        texting=True,
    8 y; A2 l0 q. g' _3 ]/ {        # 参数如上/ S( Y+ ?5 w' z' ~0 I% X$ N1 p8 u2 q
            status="between",
    . S4 {4 L" ^2 ?        cpu_count=1,3 B, E$ g9 r# p
            sem=5,
    9 s: U4 y2 T* l2 ?$ m        ###
    " U2 F. f" Q$ A8 l: a- H# }( p9 z  j& q; I        write_SQL={
    # t" J$ f6 \  j  I& P            'host':'localhost',
    1 N; U( m$ K2 I+ K5 Y            'post':'3306',
    8 [& U1 m2 h$ t0 l            'user':'root',: W, v9 g# x( e' p  R! k2 f
                'password':'123456',5 a  \8 E  X* \6 a, h& q
                'db':'example',' |; n$ x8 n: j* P
                'table':'example'
    - a. w" t, O( R8 X            }% v4 `* }" G* k/ e
    ).run()
    + c6 R0 a( G" ^: M# Z
    ; ^: }7 G/ `+ L; Z  R! ?& S3 M) }) l! F& W" q
    功能介绍完毕🤞
    " P8 p% J  a" R( j& O" ^4 z* O最后还是希望你们能给我点一波小小的关注。; l" e9 E- _5 b& n4 W
    奉上自己诚挚的爱心💖& i7 w5 N* l6 D! t+ F6 F: c$ M! E. j
    ————————————————
    " [. e; v% d, B$ L$ s& D; S版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。/ b% y" B' j7 I9 V: _
    原文链接:https://blog.csdn.net/qq_45414559/article/details/106005684
    ( o/ G2 v+ O$ ]; f+ X" }- B5 ]6 E* Z8 [
    ' O4 F4 w9 J. 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, 2026-6-22 18:01 , Processed in 0.349895 second(s), 56 queries .

    回顶部