QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5408|回复: 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_crawl4 Y  A) D# y, t8 ]! i1 s
    simple_crawl
    3 P3 q9 _" ?- g# Y) N+ E+ z( X% Y/ o仅需一行代码即可达到爬虫效果7 b7 W2 c8 [% \: t
    项目地址(欢迎star):https://github.com/Amiee-well/crawl
    & i; E% s- W+ T+ Q# G使用方法
    0 [+ }" J8 p; k9 J3 cpip install simple_crawl( |" b; {- [, \9 G5 N
    - K) C4 Q9 C& ?+ m2 E
    ### 以下源代码为简单介绍,详细功能介绍再源代码之下
    4 d* ?, p+ |% Y# Y7 l; Kfrom simple_crawl import request
    3 g5 g# A% Y! d+ P- Yrequest.parse(
    % A. I3 G( r- W; |$ c$ k        # status 参数为运行状态,支持单线程多线程多进程协程以及联合
    # p5 R0 @6 U8 c        status="aiohttp",; J( L& I6 D& G0 b1 ~- r! R
            # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式4 B. E8 c) v7 Z4 C
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    & S( {1 x3 }$ }        # login 参数为获取登陆信息,如淘宝等网址需要登陆信息, U7 T2 I( }0 Y# m/ o9 L6 l; b
        #login="taobao",7 G, ^" z  R" H1 L
        # type_url 参数为返回源代码格式,支持text和json,默认返回text+ f' @" S) ?0 d( n- l0 d
        type_url = "text",
    + ^' A' \) i0 C( M+ v. ^    # Parsing 参数为解析方法,支持re、xpath和beautifulsoup
    ; E2 b/ V; @0 Q# \: n6 B" h; F7 ~    Parsing = 'xpath',
    4 m6 q' a4 y2 X    # label 参数为爬虫解析过程,字典格式,详情见下方, z2 x0 E! L: C! e
        label = {
    6 m! \0 L& @# Y* F$ L3 l            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    8 d/ k- ~2 c9 X- I" w1 L            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],6 ~8 h( o4 U3 b( F& w
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    0 x+ {3 h( ]* c) _6 L! B! I2 Z" N$ m     },
    6 t+ ?5 Y& ~* l4 n     # write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱
    7 ?. C" y" _* C8 u5 i     write='result.txt',
    & {/ _) J- P) w8 ~& ^9 U2 H% y0 d     # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫6 G& a5 V$ k: _& c
         next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    $ d# U/ Y$ J. Q3 N( O0 p     # page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫
      p: `% M% Z. K     page=[True,"now_url.txt"],: A, p5 S* Z3 y3 L$ H1 m! l6 Z
         # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息
    % H  n- _$ ^$ O     #clean=True,* E. r: l8 N1 y; ]! `
         # texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序5 _( t7 v/ x1 A! D
         texting=True,
    " T, h2 N$ |! G3 [' Q# t2 n     # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态
    * U3 Y) u* @( `2 U' ^2 u     Thread_num=3,: m3 |$ y; x6 a# g0 H
         # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态
    + X9 Z. c. n1 S) ]3 e! U     cpu_count=1,3 t3 n: t& X3 s! _+ z* X
         # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态
    ( s! O! Q, ]  V     sem=5,
    / M( Z) m& H" i6 m2 e: N     # write_SQL 为是否写入数据库,默认否
    4 J8 N$ b; J0 x* {0 j     # host 参数默认localhost
    6 k( S& {7 F0 M2 P# M$ \9 Y, x% Y     # post 参数默认3306
    / o9 G3 N/ g- j: P1 ~& N) P     # user 参数默认root
    2 x+ d. P+ A6 g( F5 z     # password 参数必填,必须正确
    8 i! Q/ ]2 S9 W! U     # db 参数为即将存入的数据库名,若不存在自动创建
    3 a* s2 u* `) \  t8 j# ~6 a     # table 参数为即将存入的数据表名,若不存在自动创建
    ( J" Q7 w3 A0 |     write_SQL={7 b. v0 Q) x! a3 v% K' F
             'host':'localhost',% z" C5 ?5 o" \
             'post':'3306',5 k6 Y: ?+ {* _5 ~/ I5 u$ C' u
             'user':'root',
    * |5 ?0 d: G5 e( E         'password':'123456',; i# f$ z, E& ~; r! g  o
             'db':'example',. j0 Y- f6 J  `: p* j+ V
             'table':'example'
    : x/ a+ f, p, h3 f/ t+ k0 [      }
    " f) k7 v7 S5 E/ t2 P).run()
    - ~  B: j8 Q' S7 M# K
    1 Q  y0 [$ a' F- p3 c介绍一下crawl参数设置:6 V, s- L, W$ }

    0 E4 Q. R( u8 o: m6 b9 D# y. E'''6 N- V$ s- K8 F5 d; h
    单行代码爬虫程序执行
    9 _8 N6 p( a2 z0 A:param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档
    1 L5 c% U' M; \:param url:即将请求的url地址,仅支持get请求
    3 ~) Q3 R7 j  N$ s/ D3 ^6 x:param type_url:请求url后返回格式,支持text和json格式返回& l- V5 T3 {9 @4 q. P' \8 y
    :param Thread_num:即将启动多线程个数,默认为1单线程( z* ?# w0 e; `* \/ p- k
    :param sem:协程信号量,控制协程数,防止爬的过快,默认为56 H! N( r8 Z# u3 t" a- C
    :param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半. v: v; j  K& p; u: b/ t8 O/ @) s
    :param login:模拟网站登陆,保存登陆信息
    9 T& N) Q/ r$ k:param Parsing:爬虫方式,支持re、xpath以及bs4方法
    6 u) g0 n( T$ t* w. @/ I) k:param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,
    4 Z- D- B2 _9 k; x% g                       多次报错结束程序,默认否& c5 L$ g9 B( r+ Y) Q( J) p+ Q
    :param label:选择器内容,字典格式保存,
    1 f2 G$ e/ [  b% K                     字典值为列表格式,第一个参数为选择器,第二个参数为转换类型& A( {+ a9 l2 C' R5 d4 p
                         第一个参数必填,第二个参数默认str类型( ?  \! l1 o: b
    :param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否8 s1 f; R1 ~1 Z" g
    :param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫
    ( W- k5 p0 A# s/ a/ B8 o:param page:是否选择断续笔记接手下次爬虫处理,默认否& P" G  s$ e( v/ Q; y
    :param clean:是否进行简单类型数据清洗,默认否
    ! a1 S' C. ^% X5 o7 A% U1 h% ]:param write_sql:是否写入数据库,默认否
    4 d8 M- o0 Q* P  C: y& H0 A0 N                         'host'默认为'localhost','post'默认'3306','user'默认'root',
    1 E7 [# V8 j0 z& J  C9 s" o- G                         'password':'密码','db':'数据库','table':'数据表',2 D2 h0 x8 U  V  i2 y5 J. c
                             检测库是否存在,若不存在则创建,若存在则直接插入,
    " g0 [$ a. d7 {0 g3 w                         检测表是否存在,若不存在则创建,若存在则直接插入7 {' d! o2 a, H/ \4 b+ E
    :return True7 j/ `) h7 ~' N$ ^; D
    '''
    1 p) K1 P) M& e4 |介绍玩法1 P+ I( L+ Q' Q9 h) W/ E) O
    接下来介绍的均为调用第三方库的情况下运行:
    5 e  N2 T9 O/ `6 q; Z  C0 G3 \1 E% E
    $ K! u0 ^! F* G. `" X# a$ [, Ifrom simple_crawl import request
    5 O& j! S' ]: _/ O) S! t7 G第一种玩法:输出源代码
    3 @  Q( E, n2 v3 j3 I调用requests库进行源代码请求。' }2 C/ E9 L0 E: p5 {! g
    ( C7 z. b, f8 {2 r
    特点:
    " U8 g6 k1 H3 a; a- N3 b请求失败则调用ip池处理重新请求访问,3 X5 ]: a& V) o7 m5 t
    出现五次失败默认网址输入错误。" U, {& n6 }: n' l. v7 ~
    支持text以及json字符串返回。默认text。
    9 m6 y0 b9 P7 ]9 Q5 r1 h
    ) I1 m- _+ Z( E缺点:- S7 Y3 _+ E* \* \* S# ]
    暂时只能进行get请求,不支持post访问
      k* S, t: S, r; W  B* e) Z. R# J# P9 k  q
    :return text or json* }2 }) q5 F) f: w

    . H, v; Q& N+ drequest.parse(" E' `2 w8 @1 J/ z' v7 t/ ]
            url = "https://www.douban.com/group/explore",% l' D# j) o- L1 D1 f+ d  ?
            type_url = "text"
    2 I+ c* G( M# c6 A).run()
    ( I. }7 q$ T- s, g: g$ {* X( l# return text. {& |2 I8 G, U* @( L3 J% R
    : s; c: y0 @5 D; {1 J& r
    第二种玩法:模拟网站登陆并保存信息4 r" p+ E( t' e
    调用DecryptLogin库请求登陆访问。
    2 `9 y/ _3 E7 u
    - U, r# l& T) _3 a; e. _" J) ups:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源
    # i$ S7 c! t( c  x- `( u( P在此放出文档地址
    : \8 n1 o8 e! ADecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/' S& e, r0 P1 O1 v5 `7 f8 k

    5 q" @% a, R% g  B1 R. ^" K4 t特点:
    & ]* b& k4 m) Z- I将DecryptLogin库中二维码继承到此库(非二次开发)
    7 b$ Z% s$ f' D7 L/ ?5 q4 h' L支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆)( C; R; n9 P) Q6 @
    保存session.pkl信息到本地方便下次登陆运行
    : f& T* p/ p9 @& L
    , F1 G+ A) R" K) k缺点:3 h" V: S  K- ^0 \3 Y
    session.pkl登陆信息过时无法自动删除。8 P9 c+ R' L" D) z7 g6 Z
    导致下次登陆疑似cookie无法正常登陆。
    . E; Z0 g. i* ~
      v$ w0 o7 _! T5 Z6 ]: c% g:return session2 B8 Y% n) b8 v2 _2 ]! x
    " J5 Z; Y# ]& [6 Q$ b
    request.parse(
    8 n" U, o& X7 L0 E: @        # 臭不要脸的推广一下我的店铺
    4 A' T' z% w1 C( [8 S2 E        url="https://shop574805287.taobao.com/",( _& b" z$ Y& ?4 T8 F
            login="taobao"
    8 S+ O9 K( q5 K, A  W5 J4 a; s7 s).run()
    0 z5 J/ l- ^. }4 {8 ]# return text
    6 }3 @7 d; ~  E4 n$ o5 a0 Y; S
    2 ~2 e2 o& J1 |. o第三种玩法:爬取网站信息5 ~2 _% V; w4 @8 [) l/ p6 V
    爬虫库自然少不了爬虫的过程
    7 p  v; S8 f! h
    ! V7 r4 S8 j0 H6 Y4 e特点:
    - `. @4 A0 o0 t+ ?( Z支持re库,xpath解析以及bs4选择器。
    . `5 R+ O& n, @5 d5 C0 o爬取方法为字典格式。单方面输出。; z& l1 e1 I6 |. t" T& P
    字典键为保存的字段名称。6 V4 D& E: b# L3 u( v5 W
    字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。+ N- \2 f( H8 ~; h) V
    " N. e. j  s/ g$ G! E
    缺点:暂无(等待小伙伴们发现)
    6 K; I( l7 W! b* W: i
    4 q9 `4 Z( f3 g# t8 K:return reptile_results
    $ j* K: g8 S1 k6 Q9 X+ d
    4 ~$ p* r0 ~- O9 o: s" erequest.parse(
    1 P* a$ y- `. Y4 ?; j8 z0 J) [0 }        url='https://www.douban.com/group/explore',. u( d: X7 [* q
            # 字符串格式,选择器方法。
    # v8 a' f- z9 U# n5 w; W    Parsing = 'xpath',) D# F/ ~4 N% a- H
        # 字典格式,参数如上。3 S* }8 q- o6 {; ~7 q2 R2 s, v( U  d
        label = {
    3 s. y: r  q' `. P9 l; z" K% a        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],/ `; x6 [7 _3 V% G& r/ @
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    ' w1 `$ G- X: z7 C+ Q4 s. z        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]3 V9 W% Z! `6 n
            }7 }( P6 S* ]. O4 ^
    ).run()
    * i3 F; R/ S; Q+ \+ j# return reptile_results(list)* l: Q5 Z% l$ d' f* [) k  a
    4 S) a+ B7 n+ e3 |
    第四种玩法:自由保存信息
    9 M( A$ t" N5 s# u5 B0 R目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。
    ; u6 D; H% `& V, C3 d4 N$ ?: k; S8 D! C1 s2 @6 I& P. |1 I. n
    特点:
    ; [# h3 E% y- x7 m6 ^写入文件均为数据格式传入文件。: O, t0 |7 O# `
    且输入格式规范方便阅读and省事。
    * }/ f; x, o! a8 f. B
    % L' u' U3 ]! P# h5 B) ?缺点:
    $ T( r1 W+ i/ D" D) ~保存格式仅四种,
    $ o, |) D) m( H不方便用户之后读写操作。4 ]6 z& |8 D- D$ J6 Y

    + O3 M0 _2 E* `0 [& X2 d+ J:return file' i9 l1 |# w8 _# Q; J5 t) b7 K

    9 \" d% V- a. Q0 F1 H# ?4 \0 Lrequest.parse(
    , \# z; X3 o7 A3 U: F% z4 W        url='https://www.douban.com/group/explore',
    * v8 s9 i- r1 U1 `0 ], j5 R$ V    Parsing = 'xpath',# w" u4 h5 T; \3 A
        label = {
    3 {+ l' p; x% Z& e        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    ) A. {9 g) ?. U' H" J. {! x        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    7 e! N$ j7 t6 i+ {4 E) y! W0 m( H        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    + o! ]  c+ d5 |- |1 k; v/ P        },$ p( G$ z7 v0 G& e2 z
        # 字符串格式,具体保存位置填写
    5 M' P' U4 }7 ~  V% O+ E    write='result.pkl') G* ^8 w9 f# f3 p! n) t
    ).run()9 p. u3 F/ _' ]8 c
    # return file% a/ d  P; _" m( x, j. N0 F/ N
    + R) H7 _: U2 p4 Y
    第五种玩法:读取下一页 url 地址继续爬虫
    9 |0 B3 w+ K- a) O4 l8 i% ^; x8 Z这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~4 w  P# c$ v8 z- O) w+ |2 [
    1 s6 O! T2 ^* C6 Z5 c0 R
    特点:
    ! ^! _' o. q" C- D# g; L继承之前的Parsing参数选择器选择方法。8 M- G  l# c0 `* E# C( E
    在这里可读取到解析后的下一页 url 网址。
    $ i; A2 F$ J' g$ C9 @  x' |( V方可继续进行爬虫处理。方便用户使用。
    - r5 s4 j8 n/ v2 ?( y8 a3 T, P# ~
    9 i) X! e0 k- }; S; H缺点:
    1 Q* u( x9 |, b0 ~) p* O2 O若爬虫时下一页 url 地址改变,便结束爬虫。
    1 i/ t) i" L2 d3 y& A, i- T只能爬取所给 url 地址中的信息。4 A% q; k3 l, v+ D) w  z
    无法进行某一界面的多个网页爬取返回。& C5 l9 G7 m+ X. M0 B* ~* ^
    造成访问页面单一流失。$ Q- M+ t0 ?& `
    " t8 j: c, \# l5 R
    :return None- w0 x1 ^; M) P: `1 z

    # r: h0 O& {. Y, orequest.parse(* g8 E" W2 |9 m" s" c, G' a
            url='https://www.douban.com/group/explore',% [7 w. s1 L) x# T7 F
        Parsing = 'xpath',
    & S- ~& S6 S- x: l5 `* C3 p    label = {8 A! y$ g4 u3 X1 d$ P" Q% L6 a
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    % n# x, M+ X& ?5 v& G        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],$ ^. J- M) ~! e5 ?! ^
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]6 P5 b$ N8 ?7 Z$ p% W6 @- w; l  n
            },
    ( d( Z  f  L9 w0 |( r# P    write='result.pkl',# ^2 y5 S/ D8 a9 H- ?2 T
        # 字符串格式,根据Parsing方法继续请求下一页a中href  Z2 L4 N5 ~/ V2 j* I6 g
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',1 _/ N7 s) h  j% t
    ).run()+ [) G' Q. t+ O$ Y
    # return None 8 N' y1 E+ I4 ^# S9 X3 h2 r; z
    0 K: w6 w' Q' @! O$ b) T9 d! T4 A: {
    第六种玩法:爬虫网页保存: d! c8 x7 t& B; C9 O
    听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!5 N0 s, r9 C& Q+ l0 \
    ! s: n9 p& O( X" @
    特点:+ V% z  m2 q9 G- S0 Z3 P
    持续输出断续笔记。
    $ h/ ?2 ~5 d6 [$ a' ~; Y. s将此次爬虫的 url 地址保存到一个文本文档内部。
    + j, ~; N. [, k- P下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。; d' L8 X2 @* h5 _  U7 L

    & v4 e2 c5 d$ V6 v0 K2 i缺点:
    $ G& i) H9 r; Z8 P读取内容不单一。4 K; g4 f" q5 @0 n0 v2 P; R1 N9 M* T
    导致下次爬虫无法正确读取上次爬虫留下的痕迹。) E) x: b3 m+ \2 N$ j1 `. F: e3 ]
    7 W7 I+ F  s% _  H" D4 B! o' J2 k
    :return url_file
    6 C3 H: d% t3 B- ^# J
    1 T# H/ q6 N9 Z9 z  g& Frequest.parse(! D1 |0 w0 J( R" P, y% F
        url='https://www.douban.com/group/explore',4 r% W4 P3 V  \5 G; g. y% d- Q2 H6 ~
        type_url='text',
    7 C8 t2 z- s5 b$ T4 C    #login='taobao',& U% R% c6 r$ h5 D  n
        Parsing = 'xpath',
    , M* Q. j% n+ R( B) h1 L" j    label = {
    ) H' V. w8 P, x1 f, h: n5 k        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],  h0 L6 P/ o! {
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    1 I! l. S& m3 w1 q" V" U* t1 ]        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    : X! u4 h5 ]: E+ Q9 Q8 ?        },
    6 W0 `& ^, ~, w    write='result.pkl',4 a- \9 Q& C$ m! Z
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',' o: ]% O. O, R' _, }$ K1 x
        # 第一个参数为是否需要断续笔记。
    - O/ B, E9 u; K0 S: S6 }    # 第二个参数为断续笔记保存位置。+ v- l# L6 K" V6 E+ }. ]  F
        page=[True,'url_page.txt']9 t5 g) W% y* i1 T& o6 m3 Y
    ).run()
    ' @, j# A: `# u9 q; i2 j( Q4 U# return url_file
    / L) R' j& S3 ~  M" Z: Z
    ) [8 _  ^$ w* A+ a. X第七种玩法:简单数据清洗) k. W, Y# C  C3 \
    数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。" c1 }. q. L/ W$ @
    9 O( o% E; c4 E5 T" y4 J3 c
    特点:
    4 Q$ {9 m: @& T( @& y. H! F- r! ?本人曾写过一个底层数据清洗。: K8 J: G! q" E7 x. i; H
    能将列表格式数据进行归分清洗。
    6 _9 F6 d$ }& {3 }9 ?8 Q主要内容请参考另一篇文章
    ( @  v% R! R  H' J5 {, n! x如下连接:数据清洗
    , m! c9 n: {, |* o
    / z, ]- i2 v& o. R0 ^缺点:1 {# _1 J! s3 N7 q0 p( C7 J
    数据清洗格式简单。
    0 [/ S! O5 a" @6 j4 P. i  r数据清洗内容单一。
    ! h( `! [: ^' A5 Q无法完全做到绝对清洗。) L( {( F  Z7 p
    有待改善。
    4 T6 ?" b: T/ q8 B3 @8 P8 B  h8 e" k( N# x9 T& D( T" x
    :return keyword_list, value_list
      }+ |  J8 ~3 j* F, \+ J* {! |' f, g$ P; E3 \1 u
    request.parse(" ^  D# c4 G8 u* j# V
        url='https://www.douban.com/group/explore',' h+ u5 n6 b. }0 ~$ z: Y
        Parsing = 'xpath',
    + M) W: r" Q( m    label = {4 x; k1 \* Y! X$ \
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],) a  R  p0 N' I/ O; }. C% m& b
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    $ N4 P" R- ~: W, B. ^* A        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    # z9 V/ ^/ [5 W        },
    1 G! U/ |2 H+ E    write='result.pkl',& }' P! {, G% o0 A
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',# I; U4 z( P; |
        page=[True,'url_page.txt'],
    0 ~0 _6 v5 m3 W1 ]: ~/ C% F7 T8 D    # bool类型,默认不清洗& ~5 `  e; ~2 x+ U& Z
        clean=True
    6 d. B+ `4 {2 [).run()' `; D2 x( ]! H. V; s+ P
    ! u* M' e3 M" {' k  e) ?; ]5 w% i
    第八种玩法:爬虫存入数据库
    # y, s6 R% Z" v) V. Q  s存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。
    8 ]' t7 ?) i1 X4 M$ g8 g5 P
    4 ~2 [6 y4 ~  w" ~6 Y/ L特点:1 d1 h( \* C/ f9 M
    信息存入MySQL数据库。
    2 n0 m9 `; Y+ w* _5 [; o: Z可连接docker远程数据库。. Y4 a" J6 K5 f; h- I1 k! u6 [
    数据库的库名可以不存在。
    , h* X# H7 v  Y, _; U" D/ K) z数据库的表名可以不存在。
    1 H/ ^9 P! j/ t" q+ _. ^( I3 m* Z) e+ T! Q根据之前传入字典键与值参数判断表类型。9 C% ~/ h. x7 U% l" W
    自由建立数据表传入信息。; f# ~$ N3 ~4 i' a. L- s
    3 q+ T. A1 d; S7 t0 ]9 ?
    缺点:( I4 q) F* O9 L7 j; A
    仅支持MySQL数据库。2 m( A% i! |4 j) F& c
    : u& H7 m  U8 m: P: g8 r
    :return SQL
    1 f2 u  s: G5 n! S
    - Z  N# c0 T0 O; Y% L9 vrequest.parse(8 _5 d% I. k, m" O! Q* E6 Y) j( c( F" u
        url='https://www.douban.com/group/explore',
    & j9 }$ b4 d1 a1 M6 G! U% K    Parsing = 'xpath',
    4 N3 j3 X' x7 l4 n0 I7 L' S    label = {
    7 y7 k6 m' u/ Y- M        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
      l- H0 n$ @7 K8 ]        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],/ D5 M1 G1 x2 f& H3 Y% i
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    9 M4 O- }8 y* N  p        },1 \' t7 j) }8 a) W$ x) M1 Y
        write='result.pkl',3 m4 R8 }  Q( b+ g9 J) @
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    ' R. i! Q! z! ^0 E' `% E    page=[True,'url_page.txt'],
    . }% t4 ?- O9 \: F9 Y* R    clean=True," O+ I$ Z7 T5 D% h/ b! p
        # 字典格式,0 V9 H  \) U4 n% c
        # host可有可无,默认localhost3 w4 z2 x4 L4 w$ _$ P" I/ n9 {
        # post可有可无,默认33067 v6 |  x2 ?" P" `" _; h: G
        # user可有可无,默认root
    5 ]( k, ]! F8 n+ v1 j, L7 k. R/ A    # password必要参数,数据库连接密码
    $ i+ K% t- M9 G0 h9 S    # db必要参数,数据库即将存入的库名
    ; n/ l! A0 o; z    # table必要参数,数据库即将存入的表名" [. U% \# a- q) R( @- c
        write_SQL={# w. a/ x0 O1 L! ^0 E+ ^( I) y
            'host':'localhost',+ [" f6 b9 E* h  A2 M
            'post':'3306',
    4 o, w4 H! I5 C' J' x, K1 v: C        'user':'root',
    3 R4 v2 m* C, j; p7 o" j        'password':'123456',+ L) v+ R! [8 l. G. r  F
            'db':'example',
    + K. |0 i( w% Y7 s/ I9 ~8 U        'table':'example'
    0 g. I* I7 T6 S        }% W2 N/ o# p" s; V% S2 O, [
        ).run()
    3 Y* w) ~6 ]5 j; y- e/ n
    " N1 I; S  q* {  U第九种玩法:重新启动爬虫
    / X( ^: B7 J9 T; h9 R- h* ]爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。& W7 i# P- D/ ^4 C

    0 I4 S& m+ _: N% {/ m4 `2 f  w特点:
    : l6 R7 H* V: ~7 K) r- j9 C检测报错重新启动爬虫5 |- n5 @+ M* i0 L1 {2 K; i; _
    无需手动处理错误信息
    , K1 N6 ?7 v) `) l4 G" l6 L) N/ {. h$ p( x  I1 h0 V+ d5 j
    缺点:  s* [" E- {0 V( Z" I6 z
    无法收集子线程错误。6 ~+ f- F# u, `

    + r$ j! N) _1 v" Q+ j) H  y:return None
    6 x7 z' O$ t8 s1 q* K) o7 l8 x; F  ?: V6 h, i
    request.parse(
    ! l4 G2 g; d6 q        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    , D- }/ Y. }) k- U        #login="taobao",
    : L% }! S% ~3 J7 |% T" A4 A# `        type_url = "text",9 B% [2 H0 r7 P" y/ b$ c
            Parsing = 'xpath',
    : O+ k, O  N0 ]        label = {  p0 T8 q. t' s
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    , `& c# M  ^' P. [& j            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],* ]( \6 c/ r+ ?1 @2 b* K
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]7 j/ G7 i1 S) j$ f& C3 l; s% A* \6 Z
                },4 N8 F) Q. x/ v3 ]* a) ]+ a( ~
            write='result.txt',* ]7 |/ r$ a8 i1 E' [
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',% W  H/ Y1 ?. o
            page=[True,"now_url.txt"],- O0 ?( Q2 _  k: N1 v5 }' t) O! K  r* D
            # texting 参数为是否启用连续爬虫
    1 D. j8 {. ]0 |( ~, a6 N! R        # 爬虫程序异常报错后重新启动爬虫0 F2 g8 I! ^8 I  U0 y* [) j
            texting=True,
    0 A' u5 w/ |6 E/ J0 r: b* H        ###
    ) L! F  y) f- J1 n        write_SQL={) x' v0 o" Y' u0 e3 W
                'host':'localhost',
    3 d: ]" E9 O' I1 _0 ^; A            'post':'3306',
    / o  @; L$ @7 d' {) ]            'user':'root',
    , Z7 i8 t! s% c0 X            'password':'123456',
    7 T0 G# g7 n2 A2 y2 |% }            'db':'example',( y4 _" C8 M; G/ ^4 Y
                'table':'example'0 N( {1 F0 U2 ~
                }1 G8 ~/ d6 m$ e/ B
    ).run()2 r; n2 n; L  \2 ]0 }) {( L5 Q
    / A" _, b2 J' K% e5 ^
    第十种玩法:多线程爬虫
    ) Z! n9 @& B: n特点:
    ; }- W, K  ^4 N% l, v. Q* H爬虫速度加快,
    ' _1 b' Y0 L  G2 H' U更好的利用了线程。
    $ q: l/ f  b3 B" G
    * _8 n* p) ^) N4 w缺点:暂无' M# @( y" Z' I. x( c, y4 ?7 T

    3 D9 A7 _4 K7 b# @:return None
    4 N, z' ~" w% ^$ ]
      L! p2 U# a& q6 L- Q6 lrequest.parse(9 z, Y/ {9 R+ o
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],2 R2 c- O9 Z8 ~8 P
            #login="taobao",4 e5 K4 L) y! a, F: m7 u
            type_url = "text",
    ; Z, ~# p; |& Y2 k        Parsing = 'xpath',8 [) H4 o0 A! }( i# k$ e2 _
            label = {, G4 P. I' R0 `
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
      |, i9 C5 V: @. Z7 `8 M( L            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    ) M, d5 C; Y& B- @& |- R# a            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    7 j- }2 O' O% X6 _! P" @4 n            },
    ! v* v9 g' n' J. Y; L. T; v        write='result.txt',. u( }% N  z- D2 R. a* G* |
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    ( o& w; x) [6 s6 e" y        page=[True,"now_url.txt"],
    $ a- o5 q1 v$ j        #clean=True,2 W6 ?! o8 n9 D# t/ @; ^3 w* ?( f
            texting=True,! L9 M8 W* v- J* Q, P2 }
            # status="threads" 启用多线程爬虫' n7 v$ L' G. D5 G3 ?% B
            # Thread_num 为线程数目,默认为1 单线程* Q, f, s1 M# r  X* `) v! ?" ]
            status="threads",; A7 l" h2 W9 m: F: E/ z
            Thread_num=3,2 w' @: [! M# `" |
            ###1 A. t# C3 }  M8 K( l7 u
            write_SQL={
    7 M& s. K! P7 f- R. H- m5 a            'host':'localhost',
    6 o# [" S+ d8 S            'post':'3306',
    + Q3 A, c7 c+ C) v, m8 {9 i; c  J            'user':'root',/ n" C) O6 i; O& l
                'password':'123456',& |. y$ ^6 k  N3 J
                'db':'example',  C: e% [+ X$ n2 _2 [) N7 b
                'table':'example'
    1 X  L! n" [" _+ p8 W  ^7 O1 l4 s: |            }
    ) }6 z- i" O  T' H$ B% t# K: \).run()
      f$ q9 w% h' q7 q/ ]% ?" ^, T0 }0 V
    第十一种玩法:多进程爬虫
    5 M- ^/ @: G6 J特点:
    . H& D) |- C7 p* l6 V: f2 X爬虫速度加快,- ?! l! k0 i9 ~8 t2 K6 J: R
    更好的利用了进程。& P/ j) l; D" L9 J1 ]

    % B- \% B. o& \; Q; y& f' x缺点:暂无
    * j$ Y1 U: W) Q
    ' H$ O  u0 @, C) F, r0 g) i" x:return None
    ! R2 y  \0 W2 P# ~* u) |* w7 D5 l% i
    from simple_crawl import request3 N8 j7 q) @5 w6 k
    request.parse(
    7 B( N( ]3 y! T( p" x/ S- x- a* S        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],1 f. T3 ^/ ^( i- H* D$ S
            #login="taobao",1 k0 _) @: F5 R  ~% `: ^
            type_url = "text",
    / G# `  Q9 W% _8 ~+ q/ l        Parsing = 'xpath',* ?; p: _! Z$ B% f5 l
            label = {& ~: ?' T' O/ @+ C/ \0 v; m' P& z
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    9 I: [. H. e% E7 Q% b) ]            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    9 P( N. `0 t" ?7 V! u( H4 _4 [            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    4 K  D6 v! g5 `1 M. t9 E            },% C+ A* ]! {6 m  \7 S! D
            write='result.txt',5 z* i# S" f* O, E
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',9 R# Z4 ^9 _9 R+ v+ R9 e0 O
            page=[True,"now_url.txt"],
    4 ~: a( A; x2 y; O1 @5 j        #clean=True,
    * S' f& d, q( Z& {4 K        texting=True,
    4 P5 K) W" E+ _+ v! m        # status="multiprocessing" 启用多进程爬虫# {: `& `0 Q/ `8 d
            # cpu_count 为启动代码核心数,默认为系统核数一半
    8 n3 u% z0 I6 y5 B        status="multiprocessing",9 A+ m* w, \$ R
            cpu_count=2,
    5 z( ?- h6 [% s& W        ###6 T; s" L7 d( Y4 q& k/ z2 c! I
            write_SQL={" f& @; b4 _: E" Q6 ^5 w2 F8 e
                'host':'localhost',
    " O8 L: j( k( i            'post':'3306',
      E* |7 s. M5 l8 U6 o# `            'user':'root',1 l: Q+ u, `; {- S" e% A
                'password':'123456',( j  G- f: \$ i" G5 b! P  M
                'db':'example',  P0 I  Q* w+ P' T# _; c
                'table':'example'- ?, J) i* j. s* Z3 `$ G2 Z9 c* f' \
                }
    - B3 C3 U- I. v# N6 R).run()! F) ^/ x6 i, T9 Z$ P

    $ l3 ^5 e. l2 c) X; ?8 `) V+ S第十二种玩法:异步多线程爬虫
    1 g' u+ o, _- m特点:
    & \, J. A8 _8 B爬虫速度加快,
    + h8 k& W+ m& y5 ?, e  L异步使得爬虫无等待时间,
    ( ~5 |/ f4 F9 w3 y同时使用多线程速度明显加快。, J; A; _' J. v) a2 w

    : i2 T( z" x- K缺点:暂无4 X8 h) U2 O7 E; T7 v; F2 I

    : {  e) `, x' I9 O4 @:return None
    ! E* a- j# ^: G. y, S+ E) c8 j3 \2 ^: f7 O+ C% I) d
    from simple_crawl import request' E, X- }% A# x5 t2 ~  f/ W' b$ W0 a
    request.parse(
    " [) u  r" @/ h4 D. R# {, R        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    % @" _2 O! a1 \: k+ M) e        #login="taobao",1 v% c* W/ ]/ l/ }) `& y
            type_url = "text",
    9 A; v4 j( h4 u        Parsing = 'xpath',' S2 I/ N' Z. `" M  ]/ O
            label = {) g0 G/ F# q; C7 @) F5 E# d( a
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],7 U* Z) T* I5 d* p& O
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],' Y5 M: u: r% B$ W2 X. K
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
      |- J+ |+ [. {2 s9 ?            },: J0 y3 a) }+ n
            write='result.txt',
    $ b' ~- m% @4 s% U0 [0 t9 J' ]        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',  i6 n' k* z0 R) \' s
            page=[True,"now_url.txt"],1 r& e* R3 W  s
            #clean=True,
    - C6 \3 D6 R+ z+ }        texting=True,/ G( B, a+ x3 @+ K- r$ D/ ^
            # sem 参数为异步引擎数目,默认为5. I9 f( ]: ]! J" R* x1 S
            # 其他参数同上! a+ x$ j( I- x1 ~1 Y3 O1 ^
            status="aiohttp",
    ) r5 A7 y" m, I4 ]& w) C4 @4 }        Thread_num=3,8 ^0 m8 f; X+ p  R8 Z* s; k% {
            sem=5,
    9 T/ j, I8 j/ k        ###
    , L0 U# F9 V( }3 N8 [9 ^( f        write_SQL={* @6 W" `, M; A6 Y7 |6 r
                'host':'localhost',. ]2 W9 F' l) p/ O' T. V$ l
                'post':'3306',: T, s' U. o+ L4 U' o7 V  A
                'user':'root',
    8 `% i2 w% K1 O  G- I- g0 Z            'password':'123456',
    7 x& P$ ?; c% h6 C- a4 M( Q            'db':'example',  i4 x# u/ Y$ e% X2 j
                'table':'example'
    ( Y' Y* I, B. s            }0 X: }7 ?7 i$ i
    ).run()' ~, [: _) H7 d- W0 l% _
    # H# U5 E" }1 u9 P' x3 d
    第十三种玩法:异步多进程爬虫
    5 p& X9 M) D0 [- H6 `特点:, v  _9 W: T' U3 J8 z7 X) l  B
    爬虫速度加快,4 T& q. L* r& X' V/ ~
    异步使得爬虫无等待时间,
    * a* O# n4 m# M( k( |, l4 j同时使用多进程速度明显加快。
      E6 w; [8 o  _3 [  O$ H2 k
    5 C2 o7 e" j- ]" W5 k. _6 S* ~/ p缺点:暂无! n+ [0 Q7 Z0 w

    9 ^4 s! w- g6 i- {:return None
    ) k7 e6 P: f" N! N
    - I" V4 l9 d) J: x8 }. {from simple_crawl import request0 s/ y* F: ]5 o4 y& z3 j3 H
    request.parse(6 z& F* q$ V7 F4 q) R5 E
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    " z7 R- @$ i* f# _5 c& \6 a1 u        #login="taobao",7 o, D: o- p2 @0 y/ a5 B
            type_url = "text",
    ; N4 G# {( |) M        Parsing = 'xpath',, g2 l8 k  |8 W( v
            label = {
    ' v7 {( P# d3 I8 ^4 |9 ]            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],5 `& c4 F1 j3 d& ?7 q/ _
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    ( r. I. E! U. ]5 d) s- e3 T+ Y1 `( H5 a            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    7 L' u" m8 Q! {& _! H            },+ l7 I# _  k; P: [' y$ P
            write='result.txt',
      o( l0 ?5 g5 ]. M' I# T        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    ' G5 }- N1 D: j, }& F* n0 O        page=[True,"now_url.txt"],
    $ {9 v% b; `( o8 Z" J6 r, I+ y! A( }        #clean=True,6 w! g& y2 S; Y1 x& [* J! N
            texting=True,! ^) t# n. I  O2 o8 q* k1 A
            # 参数如上) X9 X4 b- G) n! b8 `0 h# G: P
            status="between",
    - D7 s4 r# c) f% i        cpu_count=1,+ B  M4 f/ x$ r. ^5 A
            sem=5,6 X- |$ s. ]* f
            ###" ?! I8 ?5 o7 t' Z% J
            write_SQL={5 |) M0 P& N. L+ Q1 {9 d2 {& J
                'host':'localhost',
      L) W6 \( c& ?$ o- m: x/ s            'post':'3306',3 o4 z- d4 }) l
                'user':'root',
    / M' r. z9 s. C            'password':'123456',
    7 ?% z/ n: m6 M  R8 O; V            'db':'example',: c; V. ^% l) _$ Z  D* p5 w* q
                'table':'example'+ D' r* L4 U3 l8 A; \0 A" w
                }; `1 c4 P5 s9 a- I) ?% Z
    ).run()
    + s, G4 a, z' C; \0 M1 Z* h2 _; q; B, I  D! }. k! K7 L  j
    0 ^- w, c% o9 ^$ p) O, r
    功能介绍完毕🤞
    * m+ L4 @: O4 T5 c6 t. l最后还是希望你们能给我点一波小小的关注。
    # G: I+ d) y$ L' Z奉上自己诚挚的爱心💖: m/ \/ W5 U' f+ v) ^, C
    ————————————————
    2 H, e/ w8 S1 }" n$ e& r版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。4 a- L7 E' L- q2 \! q
    原文链接:https://blog.csdn.net/qq_45414559/article/details/106005684
    # a) d$ L) B* y. N9 o, \  ]' W: {: C: c$ c) m# g! R5 z- w
    + y2 y. U; X5 X
    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-21 17:57 , Processed in 0.379795 second(s), 56 queries .

    回顶部