QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2639|回复: 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_crawl6 w  c2 ~# S. N
    simple_crawl& K4 ^! w" T5 E- ~; a7 ?7 Y/ A( K
    仅需一行代码即可达到爬虫效果/ q& w  T/ |$ e8 _
    项目地址(欢迎star):https://github.com/Amiee-well/crawl
    5 S" `( o  _( y$ S  Y2 F使用方法3 E( R3 a, s0 Q& f, ?& @+ D
    pip install simple_crawl
    ! e, y9 x5 X( n2 U$ [! h: b  ?% Z' H. ^# F! l* |$ ~& U& c
    ### 以下源代码为简单介绍,详细功能介绍再源代码之下
    * z  G( W0 _+ M# b' ^from simple_crawl import request
    + [$ m/ E, U; yrequest.parse(! z+ S" l! R1 D. i/ g7 H
            # status 参数为运行状态,支持单线程多线程多进程协程以及联合. d  |  `6 r  z; w" h
            status="aiohttp",
    ! R- I( E( f$ x        # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式( B% z# C6 ?, o( v+ B
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    ' q' k" \% c* o' z/ x5 |        # login 参数为获取登陆信息,如淘宝等网址需要登陆信息
    " p8 T* G- ]1 x% j2 ~    #login="taobao"," a" H' m9 d* U$ W% ?
        # type_url 参数为返回源代码格式,支持text和json,默认返回text" C  Y9 b6 x; k9 u9 c9 m2 e4 n+ G
        type_url = "text",, R! q& [; e/ t+ [$ Q9 ^& M2 L/ G
        # Parsing 参数为解析方法,支持re、xpath和beautifulsoup, B% p" a2 k- C0 \: h
        Parsing = 'xpath',
    , A1 I0 m8 c  Y5 q7 T( q4 z& u    # label 参数为爬虫解析过程,字典格式,详情见下方4 @/ y, X" k8 R
        label = {1 v. V# v- F5 m9 R7 v/ `
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],5 m* ^' k/ G# W* }$ c
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],2 g5 V0 ~  [3 ]! w4 J" o$ Q
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]! |- S8 B( ^1 y4 b4 Y' r
         },
    , r% y/ O6 Y" i$ `     # write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱
    9 j2 t5 N! ^6 s: B3 w, J& |     write='result.txt',/ E+ N% u: k# D+ A$ X8 G
         # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫7 v6 x2 d+ Y6 O, N
         next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    8 p4 q6 E7 X) g& [5 Z0 f     # page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫
    5 X" x6 y& u" l# F- y2 D! ]) U     page=[True,"now_url.txt"],* e2 I% }2 t' \& b& K9 Q' d
         # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息
    + Q' O& ?6 t7 v; A$ g& @0 @. `! n6 Y     #clean=True,
    + j# Y9 E3 N. @, q     # texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序% @4 s4 r8 d* X
         texting=True,  }$ W. v4 N1 G1 I, _' V
         # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态% ~6 `* G( X& `( d$ Z
         Thread_num=3,! s1 A6 ]5 b& h5 f
         # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态* ^: C6 ?0 j0 E" x$ _- a, z8 C8 t
         cpu_count=1,
    ) I( w2 o- d! Y( Z7 c0 j# d- e     # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态/ H$ y8 D% ~9 M( h  _: b/ v
         sem=5,+ A) g. k5 h/ X3 B) l! Z0 m
         # write_SQL 为是否写入数据库,默认否2 [9 r' ]! s3 P: }. W+ P3 L
         # host 参数默认localhost
    0 Q4 H% {8 ]' w& K- R& ~6 T9 b# I- W     # post 参数默认3306
    / G5 {5 L( }' ~7 A     # user 参数默认root% H/ Y: o4 y1 W1 \4 }+ \( E( D6 q
         # password 参数必填,必须正确6 N! z7 \3 j# n
         # db 参数为即将存入的数据库名,若不存在自动创建8 P& i7 Y  N9 Z0 \
         # table 参数为即将存入的数据表名,若不存在自动创建
    5 L! e5 Y( F5 d/ [& B5 s, e  {+ e7 K2 m     write_SQL={
    0 k- [& g1 R% X3 O6 n         'host':'localhost',
    7 ~3 A. v3 ^6 \& ~, f         'post':'3306',- ?) W9 p4 p! j  ?# I# b) Q
             'user':'root',
    1 f) ^% `2 V( y3 B/ ^5 \# p         'password':'123456',8 t0 z- P) z5 x( A! a! [$ [3 ^
             'db':'example',( v' i/ \( O2 v6 ]; b6 l7 a
             'table':'example'* w/ Z9 G5 A% H9 p
          }
    0 [& L4 Y9 N* n' P6 ]).run()
    9 [3 C7 m' P# s- }
    . L% S* c, f4 x& u2 T+ b0 T介绍一下crawl参数设置:
    % }: _4 _; d4 W: f6 s8 X, p0 S& |. l, R; d" I2 v2 k: X0 t) R. `" Q
    '''' L, `- \2 v  W" m* `; y/ C
    单行代码爬虫程序执行
    5 R7 R+ H" _/ V7 y/ l' u/ Y6 S! v2 J$ d:param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档" t8 x( U& P- ~' c4 ~
    :param url:即将请求的url地址,仅支持get请求: _. o  {  O7 U4 y) Q. m1 x
    :param type_url:请求url后返回格式,支持text和json格式返回$ d. R7 i2 j0 P* F7 n/ c
    :param Thread_num:即将启动多线程个数,默认为1单线程( N4 S% Z" l; T& @
    :param sem:协程信号量,控制协程数,防止爬的过快,默认为5
    % A9 M6 O/ v1 e1 r- c:param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半
    0 F/ p6 }7 ~+ `:param login:模拟网站登陆,保存登陆信息
    8 K& M% Z5 j# O  |1 o5 L% o5 N7 e1 Y:param Parsing:爬虫方式,支持re、xpath以及bs4方法
    9 p! e3 U+ E  v% \8 |/ v* S5 M; y:param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,
    * o# R8 A) `, w( U, `                       多次报错结束程序,默认否: d( P8 e5 B; _& u
    :param label:选择器内容,字典格式保存,) h7 c. ?. ~4 ?4 D
                         字典值为列表格式,第一个参数为选择器,第二个参数为转换类型
    : A* H; n3 C- I5 [, k                     第一个参数必填,第二个参数默认str类型- ~, q2 J4 t9 V" G9 v, n. \
    :param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否
    4 z" O. o2 c7 O% ~& B:param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫' `! n$ j; ]. i6 k1 [  P8 L
    :param page:是否选择断续笔记接手下次爬虫处理,默认否& i# _" b: o# t/ z1 |/ n0 h
    :param clean:是否进行简单类型数据清洗,默认否
    3 M: k0 M1 d6 c5 n$ L:param write_sql:是否写入数据库,默认否
    : D& E) k3 R7 s# P. ]/ q3 p                         'host'默认为'localhost','post'默认'3306','user'默认'root',
    , _6 `* T& q7 ]* L; z+ A7 [                         'password':'密码','db':'数据库','table':'数据表',
    ; n( h% c' g* @9 G$ B                         检测库是否存在,若不存在则创建,若存在则直接插入,
    . k6 @7 H" [- P5 K                         检测表是否存在,若不存在则创建,若存在则直接插入/ Z; h, t- M3 A4 m$ f& S9 Z
    :return True
    8 U& E% [& {, X; r- q/ O: [# y6 f'''2 F2 w. Z1 E4 u- v. h3 @" S
    介绍玩法
    % X/ z' y9 d1 R) N/ h接下来介绍的均为调用第三方库的情况下运行:
      v6 E+ L2 r% S5 c" _' j8 M% w9 Z% W$ y! G8 x) |. r0 K+ `& \) R% J
    from simple_crawl import request' x% T9 v- g. C! I+ q/ X2 d
    第一种玩法:输出源代码: W! Y9 M2 f7 n# s1 {# M! B
    调用requests库进行源代码请求。6 T& x2 r+ n% S  m5 g4 j

    0 Z% ^* g$ p3 n. P" o3 k( Y特点:) Z9 F8 P* q; i+ y7 h9 f$ j2 I
    请求失败则调用ip池处理重新请求访问,+ H# |$ L! e* E: U; j$ J0 ^  n# U
    出现五次失败默认网址输入错误。- K/ b0 t2 n3 i5 S& J( v' j# I" D( A
    支持text以及json字符串返回。默认text。
    . X, i0 K& m9 L8 q# A9 g
    - _7 D! P- f0 k; S" Z缺点:$ ~! d9 y, b5 \$ O& p/ V
    暂时只能进行get请求,不支持post访问
    ( ^+ t$ w& i+ r6 ?. V# m7 G" v
    3 }/ v4 L0 M7 N4 T7 Q4 X- I. G8 j; p:return text or json
    - Q' _9 C. b. `* m3 x1 h: m! i5 H0 o- ]- X- w, E( e, y
    request.parse(
    8 b1 e& A, M, ?$ Q, g; _        url = "https://www.douban.com/group/explore",
    , Q3 Z5 ]* j9 l/ [& k! ^        type_url = "text") M) z4 Q% G" K' c6 M$ x. Z
    ).run()
    1 O; z/ Q- h) A# return text" z$ i2 o4 e- N3 e
    * O5 N( {. l" A3 U2 b
    第二种玩法:模拟网站登陆并保存信息, |( _& S2 `& r! U5 c0 \- {- C& `
    调用DecryptLogin库请求登陆访问。1 p+ p: }2 X' A- z, u  E1 ~, _: [# h7 y

      p/ ]" M- M2 C! cps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源
    ; M$ q# |9 N- L/ b在此放出文档地址
    * b1 p8 H8 b  d2 H8 f) C! ?6 Y) m, bDecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/
    7 K1 {: W: S* J1 u: K$ O# l" e/ R# B6 E
    特点:2 G1 Y7 ?) Y) a2 e+ p- }+ C# C
    将DecryptLogin库中二维码继承到此库(非二次开发)
    $ J2 V7 o8 H/ Y8 R3 Z支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆)
    ) c! k9 a& M) e: P: l保存session.pkl信息到本地方便下次登陆运行; E$ U; i  C! j1 P

    ! F1 L% E8 H4 ]/ K% m. S缺点:
    4 _4 ~+ U3 t" e  T; R8 Wsession.pkl登陆信息过时无法自动删除。
    4 }$ ]; C3 j+ i" v7 i% e9 V导致下次登陆疑似cookie无法正常登陆。$ M- t' \& s1 H
    ! u. n1 B3 M2 [+ }0 W4 q+ t
    :return session
    0 J- n1 T% [4 p) q  G& C4 ?' D- t: P; O9 [
    request.parse(6 r2 G4 f* m' e0 ?- g' ~
            # 臭不要脸的推广一下我的店铺
    : r' v( h* O9 F0 t3 o6 R        url="https://shop574805287.taobao.com/",
      y3 z/ g$ n8 q        login="taobao". L+ F0 i; P7 W# ~% Q( E0 s
    ).run()
    , w0 F) K" [( Q1 E# return text1 s# E5 @: @" c9 Q! G: w: s; s
    & t9 R2 H: Z, p
    第三种玩法:爬取网站信息2 S  v- v* i+ |& x3 F  a% g- w) R
    爬虫库自然少不了爬虫的过程# s" Y/ a) Z2 f& o. C8 V( R5 t0 `
    7 C2 `$ d4 u4 m6 S  H8 A4 F7 Y* h
    特点:
    / p* b; z; L* k* N2 U支持re库,xpath解析以及bs4选择器。) Y6 z# T' q; f! U8 g. |
    爬取方法为字典格式。单方面输出。
    1 y8 l+ V; _! v* c字典键为保存的字段名称。( M4 e! R8 S% S1 M: Z# g& k8 j% K
    字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。
    8 v! N1 l, {! b; m. G0 r: }8 M
    9 X# c! z0 M; J缺点:暂无(等待小伙伴们发现)
    3 d5 H* X; l: L. j$ _3 {3 `- }8 t
    :return reptile_results4 R) X# l/ D/ P8 U/ R# i. T
    % C7 U* k4 Z4 ^$ n2 m4 k+ [$ a/ b
    request.parse(
    % S9 C; F+ f6 J8 E6 y4 `        url='https://www.douban.com/group/explore',
    + u' I# ~; G3 A4 Q) w! v        # 字符串格式,选择器方法。2 B" u" ~6 A0 ^) }$ p" H
        Parsing = 'xpath',
    2 Z5 u1 O- S' E; p! B    # 字典格式,参数如上。
    1 v: V, q' O( z+ b; P% w4 k    label = {8 f  o1 J, J& K( `. l% o
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],/ }5 \% b" h& {$ S
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    . b  Z8 W  I5 h3 e; D  G        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    ! D3 O: _0 ~" J4 n, j0 g6 p        }
    % C+ f4 p. Z% K+ z+ s).run()
    3 r% x. C  {, g$ e! w, Q# u3 P- F* a# return reptile_results(list)
    6 _5 q( k+ k4 [5 G
    / C, q" g% y- _7 D; h第四种玩法:自由保存信息8 f# g' V) _- k# e% ^8 I
    目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。" P5 a7 T6 |, H0 N0 m( L& ^# L0 }8 q

    / T! X" G- L& y- o: a! S特点:! X& q: R6 H( ]  F5 t
    写入文件均为数据格式传入文件。
    3 v1 o, V# ], g1 T7 U且输入格式规范方便阅读and省事。
    $ D; G( I, Z# K  P, d# z! `4 c: U; g. o
      X2 k3 e& U6 s: L1 ^缺点:
    . {. P9 I4 G9 G# R0 q" e保存格式仅四种,( D& G: @6 V. P0 o1 i1 J9 h& b
    不方便用户之后读写操作。; n  x' P) _' [3 z! M
    $ X! O# d7 @( i, B
    :return file
    : Q  o7 S: l/ W
    * N2 H0 A2 x% t; D4 Rrequest.parse(
    , ^8 a" b. ]$ }9 y( r        url='https://www.douban.com/group/explore',. D; h4 Y, M$ T) l6 _$ l
        Parsing = 'xpath',
    & w2 f' D& L# m, H# ?2 Y    label = {
    . D3 k6 b! w1 w9 N. P7 W1 J" R- W6 d        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],& w, Y/ m3 F8 T, t
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    8 z5 P3 c: y0 L" H) v% S! a/ N        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    8 t# g! S4 v  P4 q0 _        },
    & L& F4 T2 g. C8 c- o% q/ H    # 字符串格式,具体保存位置填写
    ; W/ Z( O8 L) c4 B" r  ^' t+ ~    write='result.pkl'/ U5 w% _7 |3 I0 @
    ).run()9 Q8 G$ |$ Q2 p$ O" N6 n% x2 V
    # return file% ]8 F: [# `7 M3 @  W! F

    & q* ]  w! V7 O) p9 i) x第五种玩法:读取下一页 url 地址继续爬虫
    ; y' e2 o0 M# D5 H; `4 t这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~
    8 M- M7 b1 J3 {2 [. r
    4 S9 U2 [8 o( c, m& L* E) Y) s: c特点:
    7 I$ c9 N$ m5 |% L: j继承之前的Parsing参数选择器选择方法。' t% Q% b8 Y% b1 f! ^4 H. X
    在这里可读取到解析后的下一页 url 网址。
    * G/ a, m; D1 W2 C, f: }方可继续进行爬虫处理。方便用户使用。# h0 ^$ y* x$ ]5 Z. g
    8 d! v2 v% n* j( w& I6 x( c0 x
    缺点:' E- Y8 b$ n% C/ f( l1 l
    若爬虫时下一页 url 地址改变,便结束爬虫。+ H# z/ q) B6 ^3 L% d  {; z/ G
    只能爬取所给 url 地址中的信息。
    0 ~! Q0 S7 A5 S. ~无法进行某一界面的多个网页爬取返回。' Z1 J' G5 u+ k0 T; w- k3 `$ J
    造成访问页面单一流失。+ n% d  Y1 E6 k( y* `1 i- Z

    ' ~! l* ]2 P) ^9 e9 d:return None- V4 i! V. U- u. L3 g2 Y9 ^5 e

    7 g2 f% m* e" e4 M; E+ s3 H- srequest.parse(/ e: \8 @' r) ]! d  j5 {
            url='https://www.douban.com/group/explore',+ h* p& v) w0 g, B7 X
        Parsing = 'xpath',+ B5 G- `$ A6 g4 L3 S  v; K$ Z4 Z3 g
        label = {
    1 E/ y" d: n7 w4 m        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    1 ^  b" @: C; r9 t" K        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    4 |7 r' k4 X9 Y& T        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    5 l$ I% x8 w" U        }," ~! B( H0 D" \/ u: ~4 u8 v
        write='result.pkl',  V+ D' d  q1 z, `6 ?# g
        # 字符串格式,根据Parsing方法继续请求下一页a中href9 Y! g5 T% R  t  {1 o) ~& ]
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    ( Q  P' v$ c" N1 R0 G).run()
      L, i( N( h; s4 ?. t9 l# return None
    0 W% V0 E) V% }' a
    1 k8 o( Y7 Q( S6 i2 F5 Y2 S% U第六种玩法:爬虫网页保存/ ]5 p9 Q" v- ^5 }* y
    听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!
    ' S- J6 D6 P8 W. a) l+ ?; l, k
    / K3 j% h% h* v特点:
    6 z  E2 X4 G  v( s; w$ N& a持续输出断续笔记。0 \+ a, P) @  A, D$ U4 V4 Q
    将此次爬虫的 url 地址保存到一个文本文档内部。
    # J& z5 {; O; O  c$ r( v- p. o下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。
    9 B' s* W" B6 u! \
    5 U# n2 h6 ~) L& n" ^缺点:# V. a2 a  b# C( T
    读取内容不单一。& _, ?8 H" T6 m8 C* u' {8 ~
    导致下次爬虫无法正确读取上次爬虫留下的痕迹。( ^3 W6 ]( O9 P2 B

    % e$ r. h8 r1 b: J:return url_file
    , D" B- h- I- [6 n# J0 b% c3 s) _) O6 O
    request.parse(
    " u. a$ I( y) e; s3 g( r0 n    url='https://www.douban.com/group/explore',; }2 q* v- q4 x
        type_url='text',, ~% l) X, n! l+ X
        #login='taobao',' ]0 h% J! M) G, @1 T  I; ?
        Parsing = 'xpath',
    1 x$ m- I6 y; B" F    label = {, _8 ?3 Z4 b" `, b
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],# J7 K, J# g- t  @/ H$ |# r2 `8 P
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],- O4 n1 @+ W0 A2 [+ L/ }# E
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]  C/ }/ M) P$ N: z9 }1 @
            },& q$ ]% ]7 M. w5 }( [
        write='result.pkl',% ?4 o# o! H5 o% ?2 }
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',. P% U" Q* Z% i! q: f: c- d
        # 第一个参数为是否需要断续笔记。
    4 `( O, _! @/ N. \    # 第二个参数为断续笔记保存位置。
    / D5 p" i3 k+ a$ m1 m$ o& t) h7 |    page=[True,'url_page.txt']
      }* d( I+ E# w$ P, ]+ e  Q: h).run()+ W9 s6 x6 O! Y+ e7 i) H3 r
    # return url_file
    - f; J1 z0 h0 v3 i
    & i6 f' J5 ]5 l) B+ a$ J" y第七种玩法:简单数据清洗
    5 @+ P. H1 s0 X+ ]" u* _数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。
    $ |9 f) j3 x8 e  p3 k' x8 ~1 u6 J! N6 K6 ^, I& G) B
    特点:4 _+ l/ J9 Z. i
    本人曾写过一个底层数据清洗。
    ! @7 _, j! z# |; M" i8 U& G能将列表格式数据进行归分清洗。
    ' q5 U3 E1 Q" [2 X$ ]! z主要内容请参考另一篇文章
    / D0 A* F  Y3 B如下连接:数据清洗
    8 y! v! Y7 d2 q# h# [  C# x; n) G; O3 ?5 {
    缺点:. m4 u' D; ~, m! f
    数据清洗格式简单。( p2 t: c/ |4 }) g( T# m
    数据清洗内容单一。5 o" N2 U* P% ~0 z. H
    无法完全做到绝对清洗。" \# s2 Z: f2 E" ^- v0 D( i5 y6 D
    有待改善。
    , O4 `! w  \, r+ h( ?* F$ i0 D" B& _1 U
    :return keyword_list, value_list- s5 N7 H4 S9 N( m+ q7 y8 ~6 Y  K0 s

      d. g4 `1 C, l( r8 N7 v$ Erequest.parse(; {% a# r; e! N
        url='https://www.douban.com/group/explore',
    1 X# Z; m8 Z' w$ c& `6 u+ v    Parsing = 'xpath',
    $ r' n6 h0 R. ?; P7 \    label = {: y8 t( O# @- E: u; n
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],7 h  {7 y5 r6 P5 m3 d
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    ! n7 Q1 n) p2 U! L        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    & _% R: Y, T3 s* Y& }        },% s7 N5 K! S! G8 J( x8 k
        write='result.pkl',
    * a  m0 X; ]1 [) m+ {' F    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    7 f5 x/ a4 I2 K5 }    page=[True,'url_page.txt'],6 a9 h3 w1 _( U7 m/ i* D7 }
        # bool类型,默认不清洗
    * I: L) K: H' Y- j    clean=True
    ! [8 l4 a% e: h# }8 d- N* d).run()
    7 e& I; C  z# f" z8 z% @1 a1 y/ C2 L5 s( w7 [# l: T" `* ^$ q' n& q
    第八种玩法:爬虫存入数据库2 b- R4 x6 Y' I! F1 Z1 C
    存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。
    9 E5 P/ v* Z. j$ F1 K, p
    4 k3 Z  N1 Y* A* X% H6 ~* Z  M1 A/ D特点:
    - n  b9 B* H8 B* L信息存入MySQL数据库。
    ' G. j8 F1 N8 b6 `可连接docker远程数据库。
    6 A0 z4 |; f- c$ b" C数据库的库名可以不存在。( t+ g8 @7 i6 S/ v$ s( O% z
    数据库的表名可以不存在。
    * ^+ B. ^, r" |) L' V# M& C根据之前传入字典键与值参数判断表类型。
    + \; p7 O# r* t) f" B, M' d自由建立数据表传入信息。4 m* w7 T" m( X: I. v5 h
    ' b/ u( S; s+ }2 r! s: H
    缺点:
    1 ]# W0 L" m4 X/ ^仅支持MySQL数据库。3 f7 c3 |* f" X0 g) U( N

    0 B+ s* ~* R( }. R:return SQL
    # C6 A% B. E) a
    # j, M  J/ I) w" p! q+ `request.parse(
    ; E% W7 e0 c5 Z9 S6 t    url='https://www.douban.com/group/explore',/ \' d* e; t* ^/ F
        Parsing = 'xpath',! x: }* d" Z( @
        label = {2 q) V' {- w$ b9 J- o. \
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],% j. f# t3 r; c; D# D! \6 k7 W
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],4 E( e/ k/ n" I! x( |! v
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]8 B0 ~; f5 B/ H, ~% f- u; t
            },
    1 O' h0 S( V2 k7 B' O( w/ a    write='result.pkl',
    + T  s/ D$ r' w+ y' |6 {    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',( J% N9 E) m6 i* K
        page=[True,'url_page.txt'],3 g( F2 M. r- a1 u; [
        clean=True,
    4 ~/ l4 K# F" m  z8 H+ B4 D4 p    # 字典格式,
    / w' f; a2 v+ ^' E    # host可有可无,默认localhost
    - v7 ?, @7 d6 `  P    # post可有可无,默认3306
    2 B0 f+ T5 u9 `8 H6 P    # user可有可无,默认root8 b6 `! Z: v& B1 m8 I* i5 X/ v
        # password必要参数,数据库连接密码7 M. F' o& F1 J% W
        # db必要参数,数据库即将存入的库名
    3 j1 \: V* j# m! e! j3 C; E! ^2 r    # table必要参数,数据库即将存入的表名4 V! ^. W" o% V9 c  p/ E
        write_SQL={
    ( `' ~: j5 |$ d6 ^/ V4 n2 ~5 n        'host':'localhost',
    : N# ]4 @/ k* i2 N" f* B' ?% E        'post':'3306',* A# Z+ O7 ~  n+ k/ `: s+ [2 I
            'user':'root',5 @- |( l! Z4 c$ y. o& O
            'password':'123456',9 a& D. p* B1 M; k. F2 |1 j
            'db':'example',
    . }9 L5 [: H" r1 D) V( Y- v, r        'table':'example'/ h# J# }- {# N7 U6 M4 P: R0 W- }
            }
    . \: @* i; e- F) U6 d) n3 z    ).run()
    : z* ]2 D- [/ N6 j
    , r8 I& C$ c$ w1 k2 R+ K! F第九种玩法:重新启动爬虫8 q7 W3 |5 Y, W* A) C; }! v
    爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。
    / Q5 ?/ `' J) R' G/ m9 h0 p) `% r/ b1 b- ?
    特点:
    8 T/ n  q! \( e- v6 `- U' F) h1 ^' q检测报错重新启动爬虫! I1 Z, w8 M- h. N" r/ B9 A
    无需手动处理错误信息
    4 B/ B2 j6 K: c4 J; I( r  p- s
    0 ]. u- E3 q5 I  R) m缺点:
    ) j9 f9 t* X8 J" i无法收集子线程错误。( s: J8 o' Y! C

    3 s; a( D: W2 ^8 D) M% w:return None
      U/ A$ `0 I1 y' b: i/ q. {5 u
    ( A: a+ \7 W- ?% T# Zrequest.parse(. V3 h/ ?  D$ l7 {- Y8 l- V- R
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    / N- f. b+ y0 ?& s; d+ O# w        #login="taobao",
    ) W& [: V6 r7 q0 |) u6 n2 G/ D2 m! Z        type_url = "text",
    8 L: W1 e) x: _1 m        Parsing = 'xpath',2 m" w+ m( X# e8 {: s: u/ q, m
            label = {) l; }8 p; G, H/ m+ u
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],( a& W3 D6 V2 t$ w9 r/ v
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    + o, c7 U( g' D  U  D5 i: p            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    1 n  ?) `, ~7 C            },* W# C7 y8 [) Y" D1 [0 c3 }
            write='result.txt'," V% d; S2 y! x/ }$ e9 c* n7 t# m7 r
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    9 L) h2 ?: U& g! G        page=[True,"now_url.txt"],
    6 P- I! H/ ~5 u5 \  {2 [1 [        # texting 参数为是否启用连续爬虫
    ; l& P+ [3 j9 D9 W; Z9 X! a: |; p        # 爬虫程序异常报错后重新启动爬虫, U; |) |/ r& S* L/ Q" f
            texting=True,4 D/ F, n7 }' F" U7 f, n( U2 ~8 j
            ###. d$ N3 @  R0 J
            write_SQL={
      g' _/ m& Y. l. ]8 [  v            'host':'localhost',
    1 d' ?  f) k$ B* G' D            'post':'3306',, b# G) Y6 }5 v) o
                'user':'root',9 B8 K9 E: y& w  [: f
                'password':'123456',
    # M5 R$ a  J  u- y            'db':'example',
    % X. h* f2 N. f1 s5 z            'table':'example'
    . f' N3 _1 j+ C2 a/ Y% u            }+ v3 ?3 e% V8 ?2 }; E" z
    ).run()
    0 V% o+ t) B0 L# g
    ) o: p4 o% f) D9 G; P6 U第十种玩法:多线程爬虫# Y& m9 y/ w4 P: Z) M; {
    特点:% V9 p  v& f; w4 L
    爬虫速度加快,
    % o' p" S3 t5 z更好的利用了线程。8 J! f( G5 W0 f

    ( [/ b$ e$ S  j! M2 z缺点:暂无
    : h  O0 }4 ?. J% Y. \" V; l0 T. k. x9 J
    :return None, U" I. E0 f& D% s
    # J- w! u- x/ V
    request.parse($ Y( C# a5 s1 y; d! c. [8 M
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],% G8 q! D" v( [7 w% ?9 c: @
            #login="taobao",9 n! q- D- Y; p! K+ L' M
            type_url = "text",
    7 g7 R6 i' D! N" D9 M        Parsing = 'xpath',
    & T: _9 H: |. x& \        label = {
    : }- [! y/ a. P  S: S# s* M            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    & V3 t% f; v9 m/ p5 f            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],9 R3 V1 c9 a9 W3 L
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    ! a7 ]+ m/ C# C* z4 p( D            },# V6 w: W3 r- F7 G) @' ?
            write='result.txt',- d# S( N, T* }/ |0 v
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',& M6 v; y) u( v, ?/ @% O( z& i
            page=[True,"now_url.txt"],& c- Q2 A% v, P! h7 h. d0 t# J
            #clean=True,9 P6 Q; `0 V/ A( j# X3 Z# [" o; ~
            texting=True,
    $ W8 P. s0 L3 B/ m4 J' W7 J        # status="threads" 启用多线程爬虫* T5 R2 n0 p0 U4 ]! s0 [7 q) t9 ~
            # Thread_num 为线程数目,默认为1 单线程
    - [' z, P! U3 ?1 s& m7 }6 t/ U# t        status="threads",
    + B- }' @! n& ^        Thread_num=3,
      ]) T+ D4 x6 }        ###5 k8 Y* ?, j% K
            write_SQL={" X: g0 `4 z1 C/ J3 K7 P
                'host':'localhost',
      Q5 X' P! C- t$ @1 E( w% @            'post':'3306',
    - K+ W* ?$ I* V) P7 t            'user':'root',& t$ K  `9 J; [. T( p
                'password':'123456',& N  n+ |# }" z! |; V' m+ F6 |
                'db':'example',5 o5 O' S% D  B
                'table':'example'
    , w" B% J$ N$ `& j; Y6 J            }
    ! i* k* ^* [8 R' G).run()3 s7 F7 x: y$ T& q

    " Q8 D4 Y+ O- g第十一种玩法:多进程爬虫
    / j% L9 U8 i* ]特点:6 [( b: x5 e% I& a3 n
    爬虫速度加快,, H7 D1 M$ A' ~; I- F
    更好的利用了进程。
    / }# U8 C' H, A$ T: [3 w( d; Q: b/ C0 R+ F8 [! P3 @1 O
    缺点:暂无5 d9 K$ r! j$ {$ p3 l

    & I6 p" k, m6 U( O6 \+ [:return None& D& A$ `) C6 Q0 u' l# `
    + T8 W, }' Q6 p% ?* w. D2 j& z
    from simple_crawl import request
    " q3 P7 B: ]7 c9 K6 Hrequest.parse(" R; X1 E+ I7 F( b- ~
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)]," @0 F5 g4 v) {; K2 s% h$ P
            #login="taobao",* L. l- F& H1 H
            type_url = "text",
    9 G6 h+ q' Q9 \% }+ Z1 v) H8 J! e% C        Parsing = 'xpath',2 n% M- t! X6 o/ y( r: P7 r$ z
            label = {: i7 u$ Q0 V  M) [1 y
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],) B$ \$ j4 I& [2 c
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    3 H, d0 S3 ]8 `6 g) Y) X            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]8 P! D2 B: D0 H
                },0 _+ b- T2 x% ~, k" f
            write='result.txt',. J% w& h- s( x
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    # `, @4 N" n! D2 `2 T2 ]* x        page=[True,"now_url.txt"],
    - Z  n; c) {" J# w+ s- K6 d        #clean=True,
    ! }' x$ R  ^. `! D. B4 Y. {9 N8 Z        texting=True,
    ; r& n" I* k  ]+ I. _, V        # status="multiprocessing" 启用多进程爬虫
    ' a! P" B# k* e8 j        # cpu_count 为启动代码核心数,默认为系统核数一半
    ! I0 f5 ?6 ]  {: ]& b( o6 s        status="multiprocessing",
    4 \& O7 L5 L- W$ ?8 [7 T  {3 A        cpu_count=2,
    7 T# I- ^+ ~$ v9 E5 ?        ###
    , ~( q/ S- O$ P        write_SQL={
    2 y  z* |) V8 D% c4 e+ W            'host':'localhost',
    ! A* ^! X$ n9 J/ D            'post':'3306',
    9 B4 J( P# d+ m  w. n            'user':'root',4 T! |0 k4 e/ A3 k
                'password':'123456',! o) O/ z" \, V% [, L
                'db':'example',
    - i( V8 j7 v6 Y0 |            'table':'example'
    7 A8 \* D& U5 I3 r% a& s! \. o            }
    - D' F: K5 i' n& {8 J, H).run(); N0 `" T! R% @2 ]

    5 b" ]0 F# R" z第十二种玩法:异步多线程爬虫7 p4 t2 Y+ _3 J4 h$ A, k9 \
    特点:
    9 s# Q& O4 A5 t- }/ K3 _- D爬虫速度加快,
    & \3 G2 F" Z1 X. A- H) u$ A异步使得爬虫无等待时间,
    + c; P# r( c% K- _% F8 j同时使用多线程速度明显加快。
    " X7 n; }* E+ K$ h+ n$ M5 H
    , \) B) [1 i5 S8 W, j. H$ A缺点:暂无
    / u& O/ L& X  J9 }
    " j- c1 w, R- {2 Z2 M) u:return None
    : @6 `& g5 `5 m. q6 F9 P4 b: I2 i2 ]
    from simple_crawl import request+ N0 R5 p0 B8 ~
    request.parse(
    5 [0 J8 [! s. z& X, F' X7 p        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],- {' G5 m& ?5 q1 B- E; z+ S
            #login="taobao",
    4 Y; s7 }: L, D6 {        type_url = "text",6 F( J& ?+ e; `
            Parsing = 'xpath',6 Q2 ?8 M# e) m- H- c, R, u4 K. v
            label = {! z4 d% u* u* B: b% f! X9 I! ^
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],# @& v: T! a! k9 Z
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],: W: p0 m2 @3 [6 G; F. w5 J' q7 {
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    8 H3 _1 S3 C4 w# ~0 y1 P( W" t% o            },
    5 y4 s0 Z/ t8 B+ w4 i& j        write='result.txt',
    3 a9 v4 L0 D: {6 H        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',  _5 ~+ q" `4 Y# b
            page=[True,"now_url.txt"],
    " l) r2 A, g% _0 I* O, ?" V        #clean=True,+ F! w) |, m1 |6 C2 @; \
            texting=True,  d2 B, d  T- T4 g+ X
            # sem 参数为异步引擎数目,默认为54 s" G6 o# h3 l3 D
            # 其他参数同上  `; [  o6 d% w$ ~
            status="aiohttp",! Q* h, l/ L1 p6 u, A+ q
            Thread_num=3,
    ! A/ O# Y) g0 j; J) W' D+ t; D# j        sem=5,: S/ }, R; X* i* q
            ###4 N  l! J' B* A1 r1 y% c
            write_SQL={
    ' r7 g6 Q2 U8 t8 p$ ?. h            'host':'localhost',
    ! ~2 F& [( j; v6 {; R/ |- k- e            'post':'3306',
    ! b) x1 [6 _5 }- Y            'user':'root',
    9 i/ F# R3 z3 |            'password':'123456',
    8 f! _* n# Z& W: @* p$ W            'db':'example',
    + S$ f# L* J& x/ v: o2 p( H7 V* N            'table':'example'
    9 V4 L6 O. M8 |7 ^, \$ e* i            }9 |& ^9 Y6 I0 F
    ).run()) x8 {/ I2 p# C: M

      s' {6 z4 G2 ?' r! q第十三种玩法:异步多进程爬虫" Y8 B8 p& \. n7 y
    特点:, T$ Z1 y- u" h1 B
    爬虫速度加快,
    - V3 m4 f, T1 M: J异步使得爬虫无等待时间,: q/ L: e" }2 p( n
    同时使用多进程速度明显加快。
    / Y4 N( @7 p2 W8 S
    5 l, ?* o5 ?+ k6 c  K缺点:暂无
    4 J. x2 P3 e& j( F$ G7 i$ G  N+ J* J) X2 r1 `/ _4 Q0 H
    :return None( I1 O* d5 m6 E; v7 L4 T3 C& s* b

    0 v: l7 d7 L2 |$ X1 M* ~- K+ @from simple_crawl import request
    : _( S6 W7 @, Y( ?8 h4 g: }9 Srequest.parse(7 U) m; t2 V* D
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],% B7 V! f8 s2 W% Q4 }: P5 \* ~; i
            #login="taobao",/ u4 G; P! C" G6 I
            type_url = "text",! t+ x) S: r2 `7 m+ I, H' D
            Parsing = 'xpath',6 x3 [3 C4 p: x0 d4 r2 H
            label = {
    6 u2 X! [8 [/ a' Q- _6 ]$ \            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    8 H& b) ?  c* \) A            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    # G) I' E+ S) m3 ?2 a            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]5 M/ q' C, G. d, P9 J
                },
    ; u" l1 s: I' Q2 f2 e' x        write='result.txt',. Q) z: M4 {+ a- U2 @$ G+ P
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',+ K7 l( m, t% }1 z, H- `1 v
            page=[True,"now_url.txt"],3 U1 t9 E% A. Q: }5 j
            #clean=True,
    : a1 x2 g- h) e4 Z$ P9 C: r& K2 G        texting=True,, \2 a$ N, {' R
            # 参数如上0 y) q. _4 E' h$ x* z
            status="between",
    $ I! h; S3 }9 m7 c; X" t' e9 ~& L        cpu_count=1,
    5 ]' B8 N( K! }, t1 Y  O        sem=5,
    5 j( M3 @' E1 H; |  l' P8 l" z        ###* b; J$ z" z3 n  I
            write_SQL={
    / T2 D( B: U" d8 S            'host':'localhost',( \* b# ~5 n, ?" [- G
                'post':'3306',2 H: V9 l- [: z2 A( c% q$ j
                'user':'root',
    $ ?  y4 B* Y6 I& ^5 d$ h            'password':'123456',# @6 `/ w$ O# d; q* |& Y4 `
                'db':'example',
    2 y5 L3 O" s+ p' ]6 H+ i+ h6 X            'table':'example'# F/ d+ x$ F) l* T
                }
    / I6 Q0 o0 r4 P).run()9 \9 {- u2 b: U# b( a
    : R# c  m$ w9 n5 {4 b5 x
    . X" e( n2 Q. g9 W
    功能介绍完毕🤞
    7 `0 J% C% E1 e4 ^3 J! y) q最后还是希望你们能给我点一波小小的关注。% x! H& U, p' q8 E. U
    奉上自己诚挚的爱心💖
    & Z+ Y9 n- R5 [+ u% y————————————————
    8 }- F$ |6 {$ g  L' j7 i% X1 E版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。  D2 l# ?4 N' V* H
    原文链接:https://blog.csdn.net/qq_45414559/article/details/106005684. o4 J) V3 d6 U) b' p/ Q% S0 i+ e
    : v& E& @4 H6 h+ C$ ?

    ! \* |( g. V5 l/ F$ ^7 o+ B* _" Y
    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, 2024-4-26 13:54 , Processed in 0.551138 second(s), 55 queries .

    回顶部