QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5406|回复: 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( O; w7 ?( P% f( {! }6 N5 z
    simple_crawl" E9 [& e4 L7 Z% M6 e. w; F0 i
    仅需一行代码即可达到爬虫效果
    ( b: c/ N5 [' ~0 [项目地址(欢迎star):https://github.com/Amiee-well/crawl
    . a8 ^; B6 u2 t* K. ^3 f( o$ R7 c使用方法
      U- T, K% ?' m6 F7 N6 Hpip install simple_crawl8 b3 O8 D6 M5 y6 X# X

    ! [. N8 q0 V& w1 H### 以下源代码为简单介绍,详细功能介绍再源代码之下1 n3 ~  l/ m% t, A
    from simple_crawl import request
    9 X5 q! Y! z6 _& Y) K2 g* y5 Urequest.parse(( h& c5 l% U9 H0 w
            # status 参数为运行状态,支持单线程多线程多进程协程以及联合4 x7 B) @9 V% j# ]5 Q) w
            status="aiohttp",/ r7 F5 X" p$ T
            # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式
    " A* f1 |; e& a  B% q0 L. Q3 l5 C$ W        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],* J4 S, K4 V; V
            # login 参数为获取登陆信息,如淘宝等网址需要登陆信息" N3 h, y1 k5 u( U8 j, q) x
        #login="taobao",
    * c5 I/ _. a' T1 @. o    # type_url 参数为返回源代码格式,支持text和json,默认返回text
    4 o6 ?4 @' G* t0 C: h$ ?& |- G, _5 a    type_url = "text",+ O# ?; o4 V- Y( `4 N2 ]
        # Parsing 参数为解析方法,支持re、xpath和beautifulsoup
    7 P0 K5 M. _7 P) i0 m    Parsing = 'xpath',# y7 h" L7 r1 f2 b6 ~0 y( t& Z5 f( Q
        # label 参数为爬虫解析过程,字典格式,详情见下方
    + K8 |4 P5 e+ C# g/ t, i    label = {" E: W! g6 i( z
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],3 }$ N- Z- ^3 R8 J( p
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],4 F: n: J( T) [! o$ m
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    ) {/ i  o% i- X     }," Y# ?: L: x8 t+ U
         # write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱0 M' w% j8 A9 ~
         write='result.txt',+ g% S/ J5 \* \0 f( o1 D0 T; M% q
         # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫
    6 |. Z2 i9 Z% H7 l& q. y* H. b     next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',( F6 T3 [+ A, z
         # page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫1 ]3 N) [: z) c$ ]( L" k
         page=[True,"now_url.txt"],
    6 {* l, l+ E# u# U1 t     # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息7 |+ _0 o8 b+ \5 f2 M
         #clean=True,
    & P/ p8 n3 ~% E     # texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序
    1 ~+ I6 R5 [9 m  L" M& \2 Y9 \     texting=True,+ x2 ~. j# _8 s3 g( e+ Z0 N
         # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态) a" @  }1 v! W# ^  V; D. R0 n* x
         Thread_num=3,
    ; O+ W8 w6 Q% q0 n+ x5 v     # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态
    8 R7 v7 |! c" q4 X9 J/ W     cpu_count=1,
    4 q3 A5 f! J/ s1 E     # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态
    + m% }$ Y0 e8 p& Y, H     sem=5,
    9 _" C6 j: W6 C     # write_SQL 为是否写入数据库,默认否
    * }: ^1 I7 T# n, r' @! U  l3 c     # host 参数默认localhost2 q! O! V6 J; y/ }; B2 z9 [
         # post 参数默认3306' U& X; `& j. K6 ]
         # user 参数默认root
    - w2 Z3 D* e1 }: g     # password 参数必填,必须正确
    0 Z1 s( Q. ^$ `- g     # db 参数为即将存入的数据库名,若不存在自动创建4 {. y! O& `: ]1 C" o. l
         # table 参数为即将存入的数据表名,若不存在自动创建
    : r% X+ c2 p) M6 N4 v" E     write_SQL={
    " Z- Z! n. `5 ~4 \0 |         'host':'localhost',% O0 i8 o9 S: B% h
             'post':'3306',7 A) S6 Z. N0 z( p- a
             'user':'root',
    ' g2 ]" [. l* m/ t         'password':'123456',
    ; p3 S+ F1 g9 q; V+ H# |- m         'db':'example',
    : D# b: f' J7 X4 f) R         'table':'example'$ w3 g( T* {8 n2 G' K4 W: _0 _+ Y: k# H
          }4 u7 n% e( k8 `
    ).run()
    0 |0 a- J! Q- J) x; y, {7 t! I( t5 d7 x0 }
    介绍一下crawl参数设置:# g8 A3 {, K: W. m

    & b4 {9 R$ {* c  n0 x. e; o'''
    + ?/ i* V) ~3 Z单行代码爬虫程序执行6 i% |8 V; \4 u% ?* V
    :param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档
    ' L5 i5 @. [9 J7 H7 d  ?9 R6 Z, l:param url:即将请求的url地址,仅支持get请求
    / E$ t( K. W$ p/ J, n2 E$ _:param type_url:请求url后返回格式,支持text和json格式返回
    / r' U2 {% X6 F/ o( h:param Thread_num:即将启动多线程个数,默认为1单线程9 ?3 x& U( R; @! V* r) G! I
    :param sem:协程信号量,控制协程数,防止爬的过快,默认为5
    3 T, K1 J! k7 o: n7 r6 R$ I6 i:param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半
    $ h& n) a2 S$ E1 `3 n:param login:模拟网站登陆,保存登陆信息
    4 w* K# M) r: W" A4 w" K& ?) k% ?:param Parsing:爬虫方式,支持re、xpath以及bs4方法1 g2 V. e. h7 {% M3 k
    :param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,
    & [4 a/ S5 l1 R+ a                       多次报错结束程序,默认否/ Q5 V5 ]( {% V/ Q7 B* f0 d) |
    :param label:选择器内容,字典格式保存,8 {! C, M: T$ |0 ^4 d
                         字典值为列表格式,第一个参数为选择器,第二个参数为转换类型
    ( l4 v/ G4 B& m, ^9 @2 n                     第一个参数必填,第二个参数默认str类型
    , H' R8 c5 t1 \( N! i% ]9 ~:param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否# y5 h5 I6 v$ i4 U: P5 U, ]
    :param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫
    / C4 [! P$ r0 w! P4 s5 k, W9 ]:param page:是否选择断续笔记接手下次爬虫处理,默认否1 _# n0 R: d$ q0 q% W" d
    :param clean:是否进行简单类型数据清洗,默认否3 B: |" y/ T, F9 W4 t  F4 I& P; _
    :param write_sql:是否写入数据库,默认否
    2 u2 {6 p# g9 s/ m                         'host'默认为'localhost','post'默认'3306','user'默认'root',
    # D- y& @; @! Y# k2 _& W. A                         'password':'密码','db':'数据库','table':'数据表',6 @1 h, f8 K2 t6 c/ L0 k8 e
                             检测库是否存在,若不存在则创建,若存在则直接插入,
    * `6 K  |3 j4 |9 c8 Y8 ?                         检测表是否存在,若不存在则创建,若存在则直接插入
    / J+ c  i1 ]+ m! {9 B  Z. s. P:return True, ?0 K0 U! T$ N+ z4 |( a2 J
    '''
    " s1 J0 j1 j$ h1 [4 P, b4 T介绍玩法
    + z! j* D3 y3 p$ {6 j" _: E接下来介绍的均为调用第三方库的情况下运行:3 O8 C. H' a: s  u9 H: g, t/ V
    3 ^- ?. f* U3 {% E9 A
    from simple_crawl import request1 y7 k+ }2 s1 R* J* q8 z
    第一种玩法:输出源代码+ ^1 L& E) S8 t4 q/ e
    调用requests库进行源代码请求。0 v- Q1 M" X; ?/ N6 N7 f, c1 m* a3 S

    9 T: B! y# \( S1 j2 x* d特点:
    9 ~5 [. ^6 S" U请求失败则调用ip池处理重新请求访问,
    7 J% |- L7 w  r; o+ u出现五次失败默认网址输入错误。
    & v2 ?) o. E5 |% g支持text以及json字符串返回。默认text。
    / T0 `  n4 H% y) H7 B8 R) d! }& @
    8 l1 l' ~5 [3 ^- m6 H缺点:1 _% m, @2 t6 h4 M* ?: Z  W. m; I
    暂时只能进行get请求,不支持post访问# C4 V( W& p0 e6 @. S) x% c0 d3 `
    ' ^6 D/ u( j5 Z9 E, M7 @: {. e
    :return text or json" J5 X; G( ?# d( r( h; m
    ( r5 x+ l" b; O, U/ D# I: _
    request.parse(/ a$ {, z5 G7 e$ F, z7 a
            url = "https://www.douban.com/group/explore",
    : |* g: j1 p3 v* w) _" ^. H        type_url = "text"
    $ T8 h( S$ B/ O& }- }).run()) e/ F# C$ ]* M+ q3 ?3 s* o7 U1 f8 D
    # return text, @5 c' [4 L  h" Q1 i

    " d" E/ A( U. ^5 z+ O/ F9 i第二种玩法:模拟网站登陆并保存信息
    2 |* U4 e' ~( q调用DecryptLogin库请求登陆访问。: Q, s) r! J& n: h- J* w& A
    + i. L. e1 A& z
    ps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源  J. U5 Q* ~6 ~+ N) [5 ]
    在此放出文档地址4 \! z; n5 x3 f% `* x  R, y
    DecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/2 C0 F8 N4 T, r2 ^- k+ L: D+ L; d

    / z' y+ l. |4 }; I" j特点:9 q: L8 d2 p( l7 H9 ~
    将DecryptLogin库中二维码继承到此库(非二次开发)
    ) c$ h$ e$ B) S: Y: o1 P支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆): h( E( W! i3 e) d6 T9 x6 x  m6 i
    保存session.pkl信息到本地方便下次登陆运行) H5 E+ x" U" W

    * C% I3 g. u. A. s) h$ S缺点:
    , l, K* x3 |6 c) u4 F/ [" ~4 w% Dsession.pkl登陆信息过时无法自动删除。6 [. A% W8 }1 d: ], w
    导致下次登陆疑似cookie无法正常登陆。& _% A' y  t& E
    - @2 S3 u: C$ P5 B% G
    :return session
    * m! b3 M, z# l7 P& t. }
    6 Q9 e3 z* y# ~$ P% }/ u7 l. Xrequest.parse(
    7 o# |' ~8 C* F, R        # 臭不要脸的推广一下我的店铺7 l4 ]/ c9 P0 _" r+ T! V& I  p# U
            url="https://shop574805287.taobao.com/",
    9 X8 g9 C3 K' }' `" r, e' b. [        login="taobao"' K) r7 v4 I0 F2 _/ D7 H$ ^
    ).run()
    # X4 A* g7 o( K# return text5 n! J% U  |+ [6 m. E
    + d" h, K3 c1 C- @
    第三种玩法:爬取网站信息
    , @, A; w0 H( b. a* O* J爬虫库自然少不了爬虫的过程* b# }! V6 h9 y- \) x. ^

    ) I" l, i1 B3 J9 H/ {1 ?. K特点:) P6 R- Y* h8 S
    支持re库,xpath解析以及bs4选择器。
    6 J- g8 O* l1 |, f- ]爬取方法为字典格式。单方面输出。4 l/ N. U4 x0 O& c
    字典键为保存的字段名称。
    : ~  R" c6 s0 u3 p* w1 n  Q- v9 p* {0 P字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。
    4 C( j" m7 Y7 f! w: v. ]. }- |) z3 w4 F  ]; _
    缺点:暂无(等待小伙伴们发现)
    " g0 F5 o% m5 m7 z$ D9 c6 A) `$ C6 W, ~8 d# k3 Z4 o
    :return reptile_results
    4 ?1 d3 p; M# ]* v3 B% k/ ?
    % ]' B0 X3 T1 d% t) Drequest.parse(
    ! o- W7 l: h! ~  m        url='https://www.douban.com/group/explore',
    % }! U- `1 r  M- M        # 字符串格式,选择器方法。  S0 f$ q1 W6 H' C( R# D9 m
        Parsing = 'xpath'," _# m% W7 W7 l5 [. f
        # 字典格式,参数如上。) B; F: y' ~& i9 i. }
        label = {+ _; Q1 X/ B. A. V
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],# y4 f9 k4 o2 b1 O5 r9 D' X
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    ' r. t5 J9 K* U        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]- C9 N) T8 _( k
            }
    8 r) F7 b$ C( ~7 C3 K).run()! j: C, y. @, _' q' q
    # return reptile_results(list)
    7 s* T) z/ T( I" r7 M, j- ]* B
    0 T+ r9 w0 M( x, U' C6 D6 A" O第四种玩法:自由保存信息
    / D. z4 Q9 W2 j1 h1 O0 z目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。# s* y) E  [6 ^9 `: u
    $ v9 }5 s+ l/ Z7 _; j
    特点:1 Q! w/ b! I; C, a
    写入文件均为数据格式传入文件。
      [% Y) U! j3 e7 R  `2 P5 V5 R  o: L且输入格式规范方便阅读and省事。, t3 R& \- U3 Q* ]# b2 ?) y, g
    4 _$ w* R$ ^" ~
    缺点:
    9 }" I" v. k$ H; i" J; }* z保存格式仅四种,; {5 S3 z$ D% x& d
    不方便用户之后读写操作。4 Z% V0 ~; o; }9 K7 l: q

    8 S+ v; j8 A' M9 U- o  b:return file
    ( i9 R8 W' o. n" K9 I" n' y7 f1 I5 Z: [7 W( i2 X% U
    request.parse(
    ) @- L  ~% x9 }/ a3 P3 y  i        url='https://www.douban.com/group/explore',
    8 y8 f- }' Z  v; X/ m6 Z, ^8 ?    Parsing = 'xpath',
    ' u) x% j* q4 _* X    label = {: L0 ~, m' c4 p
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],# i- C- U9 f4 h+ o( ^
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    , Z! `" X6 C( t+ K7 @        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]6 j5 M. r5 y* s; t5 T, U/ n+ f  S
            },
    * K' \* ~% Q" }6 H* o% O    # 字符串格式,具体保存位置填写
    5 \* ]' I, \! X0 i/ P9 I" V& i    write='result.pkl'
    6 R7 V0 q  r/ P, k).run()
    0 Q1 s6 L( f3 H' R9 e4 p# return file
    " `, [* i) J, Y- X9 p( ]# T! L
    % \7 U3 r" h% h' |5 C5 {' w第五种玩法:读取下一页 url 地址继续爬虫) V7 F. w7 C' {$ n' j! V1 f
    这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~1 `+ i) \, L3 I

    ' d5 M7 B; V; f' L& d) B特点:
    , h- C4 m2 q- w4 O" u  U- l继承之前的Parsing参数选择器选择方法。* T( L; `1 Z: c, Y0 Q2 R6 D! y
    在这里可读取到解析后的下一页 url 网址。
    " T( k9 ~9 e2 s  _8 p方可继续进行爬虫处理。方便用户使用。' [4 O- d  |0 p: c

    3 @2 ?( Z8 N9 T" l; @5 ?8 F+ A! [4 n/ A+ K缺点:
    - [2 X/ r% l* F/ {  l若爬虫时下一页 url 地址改变,便结束爬虫。
    , U6 [2 U# g8 H2 R; F+ S) q只能爬取所给 url 地址中的信息。
    , U6 Y+ ]/ E2 d+ W; V2 m无法进行某一界面的多个网页爬取返回。
    3 p7 T6 y/ q1 @7 a, ^3 P+ n7 H造成访问页面单一流失。
    / A: S9 f. |( j% z9 s9 Y; G5 j7 a" [5 l  o4 \
    :return None
    ' f9 H2 `% V- Q* f
    9 s/ D- [" N* A+ |6 y3 Zrequest.parse(
    % k' b2 z, {; X, @  H        url='https://www.douban.com/group/explore',
    8 X/ c6 g5 H0 N, J4 `9 E    Parsing = 'xpath',
    & V; _  _' v. r4 w% e. J    label = {
    + z" v8 a1 Y  U5 s( c) m" F$ a        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    ) g  C; e# f; x+ ^2 A4 T        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],: [# c; X% j2 i3 ^4 Y! w" E( O
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    / c( i6 s6 m) W# J. E: j1 G  e        },9 M: D. E. \6 z( i* u6 L
        write='result.pkl',
    " A+ Z' y8 R+ }8 r: d4 T; L3 @    # 字符串格式,根据Parsing方法继续请求下一页a中href" |: R6 L5 }( w+ k2 h
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
      D: r/ v: v9 r% m8 y+ p  C+ p6 C! v).run(); Z0 I5 h% b3 P4 K2 G. F' d
    # return None
    ! b% P7 @# C% H. `- U4 G/ X6 Z/ u$ C4 c* V# p
    第六种玩法:爬虫网页保存
    ' v* ^* s* ]; B9 B3 L( Z- ^& R6 A( W听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!
      w# ^( X& |  o" R8 g. ?
    % u( X% l; `: x" n+ r3 N特点:# c( l' ~- z- U" Y+ m3 v; a8 r
    持续输出断续笔记。
    : n, q8 _6 F+ e( l, O: {将此次爬虫的 url 地址保存到一个文本文档内部。
    ) k& w* x* R$ P3 _  f* w下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。
    0 a3 m( l3 }/ l$ }' V% Z" N6 z
    : C6 a, D" v$ {* k- P' [缺点:' ^# \2 n& J# [1 ~+ H6 e
    读取内容不单一。
    " e: `, ]1 ?2 a' }9 n导致下次爬虫无法正确读取上次爬虫留下的痕迹。) k( T& w- I; X+ ]4 `/ O0 u

    ( p0 v/ F- t/ ?  U# y# n8 |+ T:return url_file* A9 _% ]0 h, Z4 z/ t) w3 X: [
    1 K1 U2 _8 P8 L, B
    request.parse(' j+ C- H2 Z8 g8 K. U& i$ P( H
        url='https://www.douban.com/group/explore',
    # ?- i9 K5 ~; ]    type_url='text',
    & y5 i! a7 o8 K    #login='taobao',; w! @- m" I* o  p  g6 A# D/ `
        Parsing = 'xpath',
    3 A( B  O: O' }    label = {' y9 b! x0 k8 z5 i
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],& Y% F! R: w: c
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],- }( R. O$ x4 q+ x9 K1 I  I
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]' T* a+ _+ j- ~& i5 `, S' G
            },
    ( J5 T+ _% k/ b" e4 p/ }    write='result.pkl',
    8 Q( K7 t9 i; Z    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    ! I5 L, n% z! s% I" y4 w    # 第一个参数为是否需要断续笔记。
    : t- G" }5 D; ?1 `5 z) a2 t: ^% _7 M" |    # 第二个参数为断续笔记保存位置。
    9 ^1 q% f/ H7 j" j    page=[True,'url_page.txt']# ~0 o: {0 j- \
    ).run()
    2 B( Z% S* M8 P- z- i; ^6 ~# return url_file
    , T) w0 S$ G+ r- w, q, r' S5 Z- d0 B8 s) }+ e) m, v6 t8 @& x
    第七种玩法:简单数据清洗) }+ R. _2 h+ @+ M* I' c/ [
    数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。# b2 Y* v6 s8 p9 `
    : _- ?# w( V6 c- C
    特点:, s7 l( N1 W7 H6 ^2 _$ n. q7 h
    本人曾写过一个底层数据清洗。; P6 ?2 b8 ^+ T$ ^4 z2 X# \
    能将列表格式数据进行归分清洗。
    ) e! t" ]% u0 j6 O) r+ ~, ]主要内容请参考另一篇文章
    & O1 U, ^4 r. ^6 H3 V7 o如下连接:数据清洗8 S3 `/ b* Q/ G5 s3 z
    " C* [+ b+ n: Z! g; x' l2 Z2 d0 a
    缺点:
    $ _* p3 {. [2 o  G4 g数据清洗格式简单。
    5 H* Y6 V0 ^+ D% ~; v) B数据清洗内容单一。
    6 R& Y+ o; h7 f无法完全做到绝对清洗。" u4 ?, h1 ]& Z& y$ @
    有待改善。9 I6 A4 }2 S  V6 f  E% `- U
    # D0 E  }* Z7 e* D- S& j$ }
    :return keyword_list, value_list
    . E, X' T' x$ o" w: g9 M. e- h& r& g& u: F
    request.parse($ _5 t: ?: a5 s
        url='https://www.douban.com/group/explore'," N( e) u3 c2 ^1 |: K
        Parsing = 'xpath',
    / E' w: M' y  I# T$ G    label = {
    5 E' g; F2 ^# O. U! p- Z        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    * R, a. I7 k- t' o) z! m        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    5 S% f. L4 d$ m6 C2 `9 v2 B1 K        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]  w) R+ |' ~& p
            },0 u! Z3 d! ]$ D$ o4 l8 i( y
        write='result.pkl',. e5 Q: T4 P3 t/ L
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    + d. ^: C1 e4 t8 [7 P: t& v  q4 h    page=[True,'url_page.txt'],
    8 J" L, s' f- J3 v% B! K2 [    # bool类型,默认不清洗, o* |& I" O; s# z# V
        clean=True
    * _3 t1 w8 ]2 W* {).run()
    $ G( x; L0 v1 x7 n0 R3 z3 i! ?4 }' s, @5 [% m
    第八种玩法:爬虫存入数据库
    7 o! _5 ?1 `# v2 s$ n3 {) Y" h$ g存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。
    8 U- _$ f3 ~5 z! V3 e* ?
    ( [' P' A8 b, s( X  n! s5 R6 T特点:0 U: p* X" e$ k2 m# d
    信息存入MySQL数据库。, L0 L: z$ g3 `3 N, K
    可连接docker远程数据库。6 T: c; j! F( G' p6 t; A' v
    数据库的库名可以不存在。. c  H! X( E1 S% c
    数据库的表名可以不存在。7 K; [- {8 s* E/ a8 S
    根据之前传入字典键与值参数判断表类型。, v  r$ Z0 B, S" D8 c0 R
    自由建立数据表传入信息。
    4 ]" p1 c; I# H: Y; F3 r" _3 R# V% X, \* e( B  Z* l) D) m2 H5 r
    缺点:
    % D' N, r7 G7 f仅支持MySQL数据库。
    & q) V" I, Y& L. x8 n2 ]2 @; W5 o3 b, m2 R6 I1 h
    :return SQL! s1 \6 t8 i4 {9 ^

    * ?  s7 I! E; {+ K# {$ c$ S, ^request.parse(
      V1 x0 ~0 B5 A3 P: f- l    url='https://www.douban.com/group/explore',
    3 H  q4 I6 h8 s" P    Parsing = 'xpath',
    + ^. C, ]* ~# M' ^+ R2 z8 B    label = {! Z: t* ?5 b: A$ A+ K
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],0 T7 B# c* F$ g2 b+ G. G8 E
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],  A4 Q2 |0 R) ~0 A# q
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    7 |! [% Y9 l* O4 `        },* J6 W# m. a; G
        write='result.pkl',
    ! A" b! A' Q# Q0 I8 N6 x+ \* N    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',6 P) P; e4 }+ E4 {! _
        page=[True,'url_page.txt'],7 j( o$ x$ Q5 F  T* t, x
        clean=True,5 q$ Z2 t2 O4 X5 {- M
        # 字典格式,
    # q2 c5 D7 F% ]9 C* w    # host可有可无,默认localhost
    / _$ F; ~* E& Y    # post可有可无,默认3306  T" F$ B& l7 S; d5 e1 x# b
        # user可有可无,默认root# X# \4 {9 x: Y& u& P
        # password必要参数,数据库连接密码
      h  k: j# E) F3 C5 q* P$ L% o    # db必要参数,数据库即将存入的库名
    , U# o/ l. y# J' g  F* T+ i    # table必要参数,数据库即将存入的表名
    4 P! w6 m2 p" l    write_SQL={
    / U) C! p) p4 l! v) O( F) Z        'host':'localhost',: Z6 l# [( \$ e# l! i
            'post':'3306',1 r. v: P- `7 {% ~9 u
            'user':'root',# m' |5 E* t5 ^1 \7 R
            'password':'123456',: ?; B7 Z0 i6 g$ V8 y) Y7 l0 |. i" u
            'db':'example',1 U: ?; R& l$ j8 R
            'table':'example'
    ; j' I" w/ W  F" |        }
    5 z3 d1 z1 Q" ^* R' r$ X    ).run()  O3 v1 v9 S0 E/ k4 c

    8 o$ x1 k; T2 a- K/ m- R  `第九种玩法:重新启动爬虫/ o4 e: F% X9 x8 R" _- k
    爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。
    . U, K8 }7 X8 r% d& B9 j' ]6 {% ?' [2 |+ h% c4 G
    特点:/ w8 m# T4 u; p+ ~5 ~5 \
    检测报错重新启动爬虫. N4 X7 l- Q" \- A
    无需手动处理错误信息7 [* \( d: ?: U* u2 V. x
    2 \' b$ y/ p! T' m
    缺点:
    & U5 W0 G1 \5 Q* i% |无法收集子线程错误。( @1 w* c1 m7 a) Z/ P, m( A
    ; o2 g: P4 C- B+ D9 Y
    :return None9 v  X8 ~% x- E) Q3 E$ B  r

    $ |5 \4 n4 s/ m, Nrequest.parse(
    4 v, V2 a+ ?; T; c        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    % l0 n7 k7 V3 r  p5 i' q, ?        #login="taobao",
    8 p! Q4 @9 q9 H4 ^% {        type_url = "text",
    , s2 S* U# [+ R8 e% p" @        Parsing = 'xpath',
    9 w7 R8 U: s$ ~        label = {
    : j. M+ J0 _) `. [: T: e            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],7 K0 c, x0 g  _% W1 Y1 N
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    8 D2 [# I/ m# b' d4 W            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]1 l, z! r1 i0 w4 l
                },- P( r& O4 ~" ?
            write='result.txt',3 E- n7 l" M7 v" q+ f1 H: I
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',- z- P3 @) H( w! ^4 j
            page=[True,"now_url.txt"]," i  b% t' F( N$ L  d! d
            # texting 参数为是否启用连续爬虫( g- G7 d8 u  l6 Y8 Z  a
            # 爬虫程序异常报错后重新启动爬虫+ q% q1 @7 X2 L2 M7 B
            texting=True," F1 i! S9 X! A4 c% H* Z; Y
            ###
    : ]- E0 _, Z% W7 s- e1 R7 s. T. u        write_SQL={
    . B, H6 A* @1 y3 `            'host':'localhost',. f; l# y3 V, t0 k" w1 M
                'post':'3306',
    ( d1 P( P) A7 j: R# q9 z' i" d( c            'user':'root',4 p8 f$ L3 u, k& p6 `" X
                'password':'123456',
    7 [0 N. c6 D1 `+ n' C            'db':'example',
    4 ^  p& n' |. I' O9 @  Y+ S            'table':'example'
    $ V) J; y. S" F' @2 u2 d1 A            }
    & w  v! \1 \8 Y' B3 C; d).run()* A9 M& g9 O% }4 z2 }1 H0 h

    " b6 e: J8 r4 K- s9 Z' y第十种玩法:多线程爬虫
    1 J, o5 _3 g$ e! y5 v特点:/ @! W2 k' w( ^* l
    爬虫速度加快,
    ' z1 n+ o1 x! ]% n, b* |. I更好的利用了线程。( P. I% }0 x. J/ [: M6 t& w. n
    : V  _5 l$ |# \0 W- E
    缺点:暂无
    ! s) w4 w! y9 a) X* A# J5 S
    1 s; @' \7 C: r. B2 L  G% t:return None3 E% z2 _: i  f
    7 X3 p5 `$ }, N4 Q% c
    request.parse(% `6 G5 w2 G7 ?5 _* s0 ]% V& R8 h
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],3 h9 I9 n. R. Q/ x& c
            #login="taobao",
      G/ ?! X  e/ c3 o& f9 N0 K, E        type_url = "text",
    $ _( T% [  t- Y        Parsing = 'xpath',- U/ C' V, ?( _  b- x
            label = {0 Q" Z# ], g7 E/ I6 Z6 |+ B
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],9 N4 }1 y+ r9 H7 T  `$ p. q' c
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],# S8 E2 E$ M. c* G. s
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    " f* B/ d. G# s6 h9 g/ ~! F            },1 w0 l1 k3 |; {! @+ X
            write='result.txt',
    ' ~8 ^8 o- |2 }- s        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',( o5 ~" F  i7 d5 L3 u, m- O
            page=[True,"now_url.txt"],
    4 _" V8 L7 w% R1 k2 X        #clean=True,
    & }* k# s: D) l' p. p# ?8 r: Y        texting=True,
    6 G1 e' ]( A. W" b( E3 r; R        # status="threads" 启用多线程爬虫  w! m& S* C- f3 n
            # Thread_num 为线程数目,默认为1 单线程
    ( G! k* c( W' @, }$ a  M6 e        status="threads",
    9 I# M4 `0 T% r; v$ w' |        Thread_num=3,% [( s5 y9 i2 f2 g
            ###
    1 q3 C' t$ [' w; L; |        write_SQL={
    & |, ?+ ]+ L5 P( p$ P6 ^  ^            'host':'localhost',
    3 D; o5 K7 G! ^/ v, U6 f* T3 x            'post':'3306',( Z, l4 A( D8 J
                'user':'root',
    / q0 `' k1 y, v3 J& A            'password':'123456',, U: q' F% `3 W
                'db':'example',* f) x0 ^! w- r8 ?  `- T
                'table':'example'' z/ {. g7 J8 {0 f) X7 T: d8 E, y6 I
                }3 A6 Y- G0 V' a7 |: C' y; @: J
    ).run()
    & Y' v. I! ^, K* m% O/ H6 t8 `8 `6 y( ~  L2 d4 y3 w. v7 }
    第十一种玩法:多进程爬虫
    7 P/ m2 _6 c) `特点:: U$ `2 O0 A" M
    爬虫速度加快," M3 y3 \, d+ c0 l9 g7 j' r1 w8 O
    更好的利用了进程。
    4 `; E+ P* y/ T, h
    * k9 n' S5 F& N; G4 t* `+ Z缺点:暂无
    $ H& ?% N" ^4 N0 P8 S9 |* Z3 }. g7 l' i  E
    :return None4 j2 O3 l% |* j5 F

    ( J* D" U' ?1 X/ n: ?from simple_crawl import request; P3 `. e9 q/ j" p, o
    request.parse(9 @( m' l; `; R
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],) b5 F) `4 U6 s) k2 r, _
            #login="taobao",
    ! [, W* p$ l- {- ~, k. H        type_url = "text",& d1 O7 {, Y( ?: }/ ~, W
            Parsing = 'xpath',
    ! V( e: E) K+ s  @" j$ X        label = {
    6 i6 J: ?- f/ V2 _9 X% `+ C            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    " q3 a# ]2 h6 u6 t            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    9 x, l1 n' ]  \' `$ U  ~* j            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    ( A1 A/ E( o# f5 x9 X+ p% s. u            },/ K9 u. _3 S5 P
            write='result.txt',
    ) {9 k2 Y5 _3 ?5 w* W        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',$ e& ?& \$ y) K  d. |
            page=[True,"now_url.txt"],4 Z/ D8 o" `, Y" M
            #clean=True," `, D. M) F& Q3 z
            texting=True,. s7 P; D2 }7 n( D, ?, c
            # status="multiprocessing" 启用多进程爬虫7 g: U) H$ ?1 |) ~% I( N, c8 E. ]
            # cpu_count 为启动代码核心数,默认为系统核数一半, B; q& F* q* R4 o) A8 O! m  j* y5 \
            status="multiprocessing",; o1 `3 ?* R3 q9 x: T+ }8 N0 G
            cpu_count=2,
    7 I: H  D! E3 n! F! L: K; q! ~        ###
    # B1 C# f( y" Z" E: P( k        write_SQL={
    2 l& v9 c5 B% k. Z7 O( V- z            'host':'localhost',
    ( b1 g7 i" v' U  u/ ~            'post':'3306',3 j* J9 T' Q" t6 [# T
                'user':'root',3 f/ J3 f/ O" R9 ^+ `0 ^
                'password':'123456',7 n2 I; ~5 [# T* |
                'db':'example',
    1 ]) d% v( J2 h! S7 G0 H            'table':'example'3 `3 l8 O  k3 L# n  v
                }
    : p" ^6 Z7 M2 w8 Z0 q).run()$ K. ^' F* d6 s1 N  @
    3 s; O( S4 a! {8 j$ @8 K0 t% T
    第十二种玩法:异步多线程爬虫
    + t" E5 ]1 b. j特点:
    0 O& X. v  p; b. T0 K爬虫速度加快,
    " d1 u9 D. O! }6 l" X, Z& m6 I7 H异步使得爬虫无等待时间,, s* S& h, e6 Y4 K( W. A
    同时使用多线程速度明显加快。5 l* o% Z& p1 L2 \8 p

    + d  t- R( i. Y7 s, k0 Y' b缺点:暂无
    7 W# k5 M" W4 i+ z7 E. [, A& P+ K' _7 s' L0 h. a8 ]" S
    :return None
    % ^2 X' M" g  _& O. g# |4 _4 R3 U$ u! [& B7 H1 e' H
    from simple_crawl import request. J  C! W* i: }4 R2 X
    request.parse(; Q7 l4 e% B+ z. b- g4 f
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    * J' X- J3 u. A. s# Y5 K( n  f        #login="taobao",
    4 |9 u7 j$ k: r9 U2 }2 w8 }3 K        type_url = "text",% H3 `6 V  ~) [# \  j, B
            Parsing = 'xpath',# K% V+ c. T# {3 s/ b' C9 o0 ]
            label = {# z$ @" Z; n' g, B" h
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],7 \& W9 \& y" p
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    $ b! G' z' t; J5 f9 S9 q! V6 J            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    . z8 a/ Y% g6 |5 o& ]' |            },
    8 b+ @; E$ g. M  v3 Y7 u        write='result.txt',& ]& ]4 S, L: `2 j  P; o
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href'," O8 k; _9 M- ?/ S+ u* [
            page=[True,"now_url.txt"],8 Z. }8 L) s( p  n5 u
            #clean=True,
    ) }3 _7 P: S# S' {        texting=True,
    7 C: h0 ]! p( [( X# U5 E! O        # sem 参数为异步引擎数目,默认为5
    2 f& Y% e" n! o8 A. k+ r3 y        # 其他参数同上
    / o( j1 ~( L2 k8 Y  `3 Z        status="aiohttp",
    " Z; d1 K9 w/ L' \- k        Thread_num=3,
      i) A: N* l" I        sem=5,/ R  g% _* S# ]5 |* q
            ###' E0 J% d' m9 T9 G" a5 d( `
            write_SQL={( i% M% u' k2 D4 d& e# C0 Q. c
                'host':'localhost',$ f6 M$ W6 v' L. [
                'post':'3306',
    ! j; `# ~& k  e9 I! A            'user':'root',% P9 x( t; R. K/ R- n  U
                'password':'123456',
    # h8 y- s8 u& S/ ]/ d+ B/ `            'db':'example',
    ) w3 u& x. x* Q! ]            'table':'example'
      h7 f' I! X1 e% ^3 W            }& ^0 Z9 |' F$ ]" J
    ).run()% W% B) o: x  Y$ H0 `1 V

      G  z2 \6 g) K4 V第十三种玩法:异步多进程爬虫! b6 F9 Y- ]9 Y: h4 o
    特点:7 P) Y% d' J! C) K( O% ?- k8 O
    爬虫速度加快,
    ! g# B, p1 K% O, T4 t! a0 b) F异步使得爬虫无等待时间,
    5 f3 e' I, k4 m* {同时使用多进程速度明显加快。6 |4 l1 ^: @5 q- s
    5 b1 }" S9 D, \' |9 \1 f
    缺点:暂无8 |0 @$ |. ^# M) X+ T
    1 X& p" ^- K  g4 `+ O  G
    :return None
    7 b! ?' `; F; L  ~* h
    ' r  b: F. X- [2 b  o+ j4 ?. Mfrom simple_crawl import request" R' d9 ]! F# u' a7 U8 U, }1 l
    request.parse(* f2 Q5 Q: W4 R* B% z
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],3 Z" X% P9 x0 K1 l# f
            #login="taobao"," r& A; g1 \+ A# z
            type_url = "text",
    - K4 P3 j* b- }& U8 k/ ^" Y        Parsing = 'xpath',6 {. t5 G) X1 a" N- y0 D% y
            label = {
    ( r: J/ v- |, K. M            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],9 d$ ^# ]) E" n0 E
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],4 _& R8 o0 H/ v% Y! C
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    # S% p5 y4 y; v, x' G            },- M  L# H. l* N' F. s9 Q  X4 O
            write='result.txt',* }  x3 x: J! o  t7 C9 o
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    8 g: v' Q5 i; u6 y# |% q3 t        page=[True,"now_url.txt"],
    : T4 o  x( _1 A# |! K        #clean=True,* ?! v/ C; k/ v' D" x4 T/ d
            texting=True,
    1 o. ?( ~7 c2 f) `        # 参数如上
    4 @& x5 i1 s# b# W        status="between",
    ' }' U) Q# e0 S+ x        cpu_count=1,1 [" C  p0 w7 Z# Z2 B
            sem=5,6 u7 P' ?1 r$ K) a+ g( u
            ###
    $ r" P& R6 A7 Q7 p  q5 T8 Y! ?# B5 X        write_SQL={
    1 q9 n& q7 Y* _: _, [            'host':'localhost',; F1 I$ Z5 c! q: |+ [0 R2 L( O! E6 Q
                'post':'3306',( D# r: f9 j2 T! S8 [. Y; m
                'user':'root'," \3 j+ O. B: p
                'password':'123456',
    2 g  ]( J# p/ f, \. @            'db':'example',
    / Q! h' h5 ]& ~6 i            'table':'example'( n, F, {' c$ r7 C3 l7 A/ ?
                }
    , K# s" k% H! u: K2 M).run()8 \) a/ q7 ~+ W

    9 m7 Z( D5 X) P; s# f4 y) q( ]7 m: j. o+ ^4 |
    功能介绍完毕🤞( ^! {  z: l. a- s8 C" u9 g
    最后还是希望你们能给我点一波小小的关注。' h/ N' }; E6 [3 q3 G! R' R" p8 f
    奉上自己诚挚的爱心💖
    * K" M) b' T0 S, S2 R% j% |————————————————
    " t( l! H( n" c7 U  J版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    & S, {* @, X+ O原文链接:https://blog.csdn.net/qq_45414559/article/details/1060056847 K' f: \; O2 v
    / q0 q) c8 y  O9 `3 t5 i, c
    / p; J1 r) o8 Q
    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-4-19 12:17 , Processed in 0.431870 second(s), 56 queries .

    回顶部