QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5443|回复: 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_crawl7 g0 R/ `4 b+ O1 _- I7 k7 g& w
    simple_crawl
    - b2 G. ]' V8 l3 X: y仅需一行代码即可达到爬虫效果
    5 Y+ K7 q/ M, X项目地址(欢迎star):https://github.com/Amiee-well/crawl/ y8 P# l/ i+ r* r" B5 T- y
    使用方法
    0 J4 }/ _3 u- u5 i. mpip install simple_crawl6 J. ?0 [( ?: A) J; e* C& n1 y  Z  L
    4 f: x; \  l3 w+ [
    ### 以下源代码为简单介绍,详细功能介绍再源代码之下8 c. _) B0 E' p1 A# {
    from simple_crawl import request
    6 z5 Q+ f( ^- K; o3 c" q" erequest.parse(1 f$ V8 J, [# m) V
            # status 参数为运行状态,支持单线程多线程多进程协程以及联合) v) Z' l/ Z3 l; Q1 F5 ]
            status="aiohttp",' ]; d4 w3 e6 [3 z$ X: m
            # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式9 h" E9 Z; y, S
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    0 Z, T( }% U1 C+ @, T6 x  h% w9 E+ a+ [        # login 参数为获取登陆信息,如淘宝等网址需要登陆信息: X- i2 V2 ]2 h. Y* T
        #login="taobao",6 O0 Z- |/ o6 q( `( ?
        # type_url 参数为返回源代码格式,支持text和json,默认返回text3 `7 C' h& D* z- H" v2 P4 @
        type_url = "text",
    # C1 D% p% \6 n    # Parsing 参数为解析方法,支持re、xpath和beautifulsoup/ X  f% _' @6 _8 u# u
        Parsing = 'xpath',
    0 R& ~6 i& d0 W' h1 f. G2 e9 L. |    # label 参数为爬虫解析过程,字典格式,详情见下方
    $ h( g1 u, E+ e1 L6 c; H4 h# `" B    label = {
    $ a: k4 ~4 H; m/ q( `3 m: N            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    ) P2 j$ [8 @6 V$ X            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],: q4 L" Z7 |: j7 j5 I8 ?1 I
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    * Z+ U7 `8 L5 W* W  l* H     },) z# I5 g2 z/ z' Z5 u+ B
         # write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱
    $ W' J# n( P7 c5 ~     write='result.txt',8 ]1 a* ~/ U* Q9 A$ X5 S
         # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫. }9 G& t# [# `7 U; v
         next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',: N2 f, g! R6 r' L0 H4 T! Q
         # page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫
    9 R; Y, H: }# l7 R! v7 S! `     page=[True,"now_url.txt"],- w- Y  [* ^5 i. o
         # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息3 j  P) E+ S  C( z% P: Q
         #clean=True,
    ) |2 J6 T8 m7 \% p# K0 R     # texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序
    ( W% ?) u( x2 Z5 g     texting=True,; l" h1 r" c- c* m: o. I
         # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态- v, x' a. }) D
         Thread_num=3,
    8 Y4 w$ z* l; o- c& t# [6 W     # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态6 j$ m; j& u$ I5 x% a
         cpu_count=1,. C1 p" \4 H' ~. N6 F
         # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态
    1 [8 [! S0 U! u  w1 T     sem=5,
    * L4 a7 w; ?# |* ]     # write_SQL 为是否写入数据库,默认否6 f; K4 L" C; P; m* C
         # host 参数默认localhost
    , V' ^/ C4 y7 L& R     # post 参数默认3306
    , n  x+ t. _. {" n1 H" L     # user 参数默认root
    : G$ d3 B  O; y& Z     # password 参数必填,必须正确
    2 k( n9 X; W  V$ W" |9 q+ d     # db 参数为即将存入的数据库名,若不存在自动创建
    # S! n8 \+ W, M% K' z4 y     # table 参数为即将存入的数据表名,若不存在自动创建
    4 v4 m9 C0 M( n( K     write_SQL={
    1 L% K( h5 `: e6 w$ z         'host':'localhost',% D; ~1 f0 ?3 F/ }4 N
             'post':'3306',+ @9 r# X5 a: }- `6 {* J/ n. L
             'user':'root',: O, p5 I$ M7 ^+ t
             'password':'123456',
    : M2 e1 T" O$ s0 q- [! Z         'db':'example',
    0 ]: B; D/ f) G) y( g         'table':'example'
    4 O7 N  C* p9 Q; [  c" U      }
    / q% T, k/ r& t& @).run()
    # x, V+ L* s4 d% J+ t; B% [# P# y
    介绍一下crawl参数设置:8 N, z% \4 B1 {

    5 C; n$ E  J( ^6 t+ U. A'''6 o, L" [. A2 w; p% V: U
    单行代码爬虫程序执行! o5 S* N' K* H0 s! c) y8 P
    :param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档
    7 {' H4 g; D* h:param url:即将请求的url地址,仅支持get请求5 S, [# W" E# {7 B' Z* L
    :param type_url:请求url后返回格式,支持text和json格式返回
    / ^1 ?0 o5 H4 V0 @7 i! U* u6 W:param Thread_num:即将启动多线程个数,默认为1单线程) \- ?. V% d! X3 j. ~
    :param sem:协程信号量,控制协程数,防止爬的过快,默认为5
    ' [" Q- f3 |$ i/ A, {4 L3 ^:param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半0 R) H$ \8 k& w5 g
    :param login:模拟网站登陆,保存登陆信息' W# a% i+ P7 F) Q( S
    :param Parsing:爬虫方式,支持re、xpath以及bs4方法
    5 f$ V8 J+ x$ \  f3 N/ Y& @:param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,
    9 ~2 k% w& P3 L- v                       多次报错结束程序,默认否3 M9 O: G9 K4 W$ H
    :param label:选择器内容,字典格式保存,; s( Z. I  _( [3 a
                         字典值为列表格式,第一个参数为选择器,第二个参数为转换类型4 l1 z) l2 l& Z. u7 Z
                         第一个参数必填,第二个参数默认str类型
    : k/ U5 g5 h3 r9 {% H0 h7 c:param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否' X8 H; a2 Q) z6 {$ P) S
    :param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫
    ! O8 [8 y0 {$ _:param page:是否选择断续笔记接手下次爬虫处理,默认否8 n7 k8 H+ j' L  L, x+ P6 [
    :param clean:是否进行简单类型数据清洗,默认否
    / U9 u2 f# ^& l7 u:param write_sql:是否写入数据库,默认否( [5 U0 T7 H# L. [8 V/ [1 Z. E
                             'host'默认为'localhost','post'默认'3306','user'默认'root',3 C. J, k7 `2 |% J- R* j
                             'password':'密码','db':'数据库','table':'数据表',  Y! P7 g, T9 l$ S) }8 f
                             检测库是否存在,若不存在则创建,若存在则直接插入,. F1 w# C9 L. J- ]+ W
                             检测表是否存在,若不存在则创建,若存在则直接插入
    ! X  F- R0 M: f% K' c:return True
    $ D  E) v+ _9 W8 j2 ]; g'''
    7 ]# ^+ V) i7 g8 N' k介绍玩法
    - M7 n+ K' \0 j4 q. U接下来介绍的均为调用第三方库的情况下运行:
    9 W1 u! j2 N7 x6 C. s/ ?) y( I8 n. y) R
    from simple_crawl import request
    1 W9 d/ W! b- ^* W* y3 H2 g' ^第一种玩法:输出源代码
    " n( I/ a8 O4 z9 f" N' p" C4 k调用requests库进行源代码请求。
    : U  \, t# I* F, u
    5 |7 O4 M( N% S* _9 D3 w特点:
    2 v  j; h$ n4 Q* k- F2 U请求失败则调用ip池处理重新请求访问,1 Y) y: ?8 e+ o0 X* M1 M+ T
    出现五次失败默认网址输入错误。* L# ^7 x/ ]: D+ T# V
    支持text以及json字符串返回。默认text。
    - }. E9 A" j: g% `$ T2 b- v& A/ Q* n+ ?+ ?2 E6 W
    缺点:
    : t& A5 O! J* @8 i暂时只能进行get请求,不支持post访问
    - Y2 j7 _3 b) B( u% D1 |9 k6 g# b" K9 l
    :return text or json
      t- S5 r, @1 h. @8 x& y/ D' d* R4 a: A
    request.parse(
    & d% f2 H' Q6 R$ L5 B% A        url = "https://www.douban.com/group/explore",* ?1 N' b" Y9 ?
            type_url = "text"
    + b: |. U6 u# {/ ]. U) X).run()  x7 y+ l. X0 ~  q# L3 l* V- u
    # return text' p- }# a/ t$ S2 T1 Z5 `1 g

    4 @9 `9 a! D7 O) j第二种玩法:模拟网站登陆并保存信息& x$ ~- t! q% K5 S" ?
    调用DecryptLogin库请求登陆访问。$ U: x7 k3 B+ K- W) Y) g

    ' ?$ w; \2 @4 f  |- F: A. ?! ]ps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源5 t8 I# z) a1 k. D7 Q0 N7 s
    在此放出文档地址! j- i+ }& v. |0 |2 B. h
    DecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/
    & a0 S( @) }  B2 w3 q( C/ R) y7 @% n
    特点:
    2 Y2 P* ^8 [$ `* l8 L7 l将DecryptLogin库中二维码继承到此库(非二次开发)1 [/ I4 ^2 o- B# P
    支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆)
    5 q5 k1 i" f' v保存session.pkl信息到本地方便下次登陆运行: x( O0 E& U3 A
    . \7 t) W8 K+ g, x
    缺点:
    ! x) \* |, l  F$ K4 vsession.pkl登陆信息过时无法自动删除。
    / P1 l$ j/ v6 B5 x导致下次登陆疑似cookie无法正常登陆。# A4 t& R/ [, p

    3 C, o; ~. E2 r7 ]7 m:return session/ W, |9 g+ [& e: }4 ]2 @, n

    ' T& P! A; j; V4 h  ?; _request.parse(
    9 v: M4 Y% d6 C. W+ W        # 臭不要脸的推广一下我的店铺$ H  V; r" z& |; a
            url="https://shop574805287.taobao.com/",
    - f* g. H* a" }        login="taobao", N- k: J! L  n; ~1 c
    ).run()
    * X; M& o4 }- c8 D5 d$ e/ G# return text
    ) f( m# C& y7 R, C9 V, g0 ]+ n  v; S% Z1 z
    第三种玩法:爬取网站信息
    2 z' F7 ?0 f( k5 p: N- u爬虫库自然少不了爬虫的过程
    ; i9 y5 F1 z0 w# t; y9 T( S
    . z- b7 n% g3 k8 o特点:
    ' [& n2 }8 h6 @- s* Y" R1 i支持re库,xpath解析以及bs4选择器。* X1 p- }) i- b. w. J% g/ v0 u
    爬取方法为字典格式。单方面输出。
    ! k! m7 \5 `5 @! [/ Z字典键为保存的字段名称。
    ' V' m5 l, _: z字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。8 X- Z) t: c! `

    ; F. Y  P$ I" ^8 f: |缺点:暂无(等待小伙伴们发现)
    ) Z6 P3 v) n% e* G
    $ E5 D  a' v6 v6 A' v:return reptile_results4 h4 p. o0 ^( u
    ! Q$ v9 [. @. [) }
    request.parse(( _' J6 M( a- @! d+ U  y
            url='https://www.douban.com/group/explore',9 `6 X! ^: E% W
            # 字符串格式,选择器方法。- x# {7 |- |7 H1 Z4 H& ~
        Parsing = 'xpath',6 j" }" X) a% e; e4 {  F' _3 O
        # 字典格式,参数如上。
    * P. j( |/ z6 h6 \8 h3 c2 h- j    label = {; o, U4 C6 ~& J. R& @
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    4 S9 m+ i2 ~5 E- E7 r, o* E( N* c1 l        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    $ z+ A& {! v$ K# g' {        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]8 Q# c% l: y/ }7 E8 q
            }& L& c+ H. j* O* }% l% ^
    ).run()
    ; h! q2 Z1 S" ?, a% `, n# return reptile_results(list)
    2 q. h# |( \6 F" F* c( x/ o! h$ ~5 U9 h& j6 b! s1 z
    第四种玩法:自由保存信息
    : q7 n& q+ p" }1 R% i# m目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。1 T- G0 D1 Z# l  I: d

    ( A$ ?6 d2 D& j0 _( X特点:  `  h8 G( H' X+ z
    写入文件均为数据格式传入文件。
    & E+ t/ n7 V  C) h6 x且输入格式规范方便阅读and省事。6 f; u8 {( l. S! l

    + s8 K* B% b) f缺点:
    % R% i5 E+ E- l! Y3 ]保存格式仅四种,
    ' i8 V+ j6 m3 U$ B+ M" A  ^不方便用户之后读写操作。
    ( n1 I. h( D7 G% }( y8 x# `+ X/ `1 [/ `: Q+ K& e( J- @/ U8 c5 ]# @
    :return file
    8 @: c9 [) V( [4 h4 K: z7 X0 m# p2 R" \1 z; F. l
    request.parse(
    ; ~1 p+ f, i* `/ ^5 H" N+ O' w6 M+ o        url='https://www.douban.com/group/explore',5 a0 Q5 U6 U0 k3 t
        Parsing = 'xpath',
      [, ]8 M: z) A" l) r    label = {' q/ _3 _7 M! o& _/ i+ Q9 I
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],4 H- a. j" U2 d8 m4 I6 w4 I9 o
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    ; b5 x( X8 ]. W8 b- X        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    * y3 L6 r2 H7 u2 g8 Q. D        },6 @5 o" |: l; a# P3 c, h
        # 字符串格式,具体保存位置填写6 M: n* J+ Y8 a+ U. ?0 c
        write='result.pkl'
    , D2 s/ K/ n9 h$ x4 S).run()% N9 P3 Q3 U. Q: B) V( B% F; B5 B5 x
    # return file8 [) p1 h2 G/ J# _1 Z( F
    * O$ q- @' \( G' m4 X0 p
    第五种玩法:读取下一页 url 地址继续爬虫5 m( U. m0 M1 x6 Q9 Z7 g: D3 |2 n
    这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~
    + h0 h7 l+ |, N7 d% K. I( E- E# m8 j
    特点:
    & e! O# f& Z* U0 H( i' `  A继承之前的Parsing参数选择器选择方法。- v- A8 H$ I( p- y+ @
    在这里可读取到解析后的下一页 url 网址。
    : P: k: p/ y& e9 T8 s9 s方可继续进行爬虫处理。方便用户使用。6 P, I4 _& I! A9 U2 D% x
    ; Q7 \1 v6 B0 q
    缺点:
    ( B/ G# f6 U( i# L. `若爬虫时下一页 url 地址改变,便结束爬虫。
    . S+ ]1 ^4 ~3 x$ Q4 [" [9 c只能爬取所给 url 地址中的信息。
    3 }" i7 K" k$ ?- `无法进行某一界面的多个网页爬取返回。5 |/ o$ o' Y4 n, o
    造成访问页面单一流失。8 F, f8 V3 k! V& P( B) H

    - I  W2 S$ i/ j/ p' A:return None
    $ t5 k& T2 M/ M- D/ k4 u! W* E
    2 e* |  M; R: T2 E) M% b$ u1 Grequest.parse(0 M, ~/ G: m$ t
            url='https://www.douban.com/group/explore',7 d( o! h" k9 b, j) W' U* s% f; s1 \
        Parsing = 'xpath',
      w$ V. Z, j! y4 g  q, ~    label = {' t. w0 x0 a1 ~" {' n2 O: E
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],8 m, Z# N+ g$ n5 ?
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],2 @4 E% t% B' ~
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    ; U+ W' [- @- e0 ~7 ?        },3 N0 a* B& q+ r+ C* d
        write='result.pkl',) ?! u! ?- I' D  h' ]0 m  e
        # 字符串格式,根据Parsing方法继续请求下一页a中href
    5 J4 @* I. D0 g5 x; m4 Z    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    , L2 z( h0 Q% z$ P).run()
    - H# O- ?+ l0 E/ Y$ x  u6 C# return None
    0 p3 H) A/ V9 n4 J
    1 R' H6 u4 G2 Z* t第六种玩法:爬虫网页保存
    " m: \9 F5 [4 T听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!
    ! k( p$ y; o' G6 x( L- v
    - u6 Y& g' z$ d0 M特点:
    $ L" G) N3 b4 k5 {" x持续输出断续笔记。9 H2 Q8 _, r5 _- t' t
    将此次爬虫的 url 地址保存到一个文本文档内部。
      x. g& L0 v7 M4 o. B下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。. u4 R+ J0 q1 k# |8 ]
    3 \6 }! r5 k2 U/ e
    缺点:
    ; Z! w+ Q1 ?3 o! }# G+ L& T' x+ `读取内容不单一。; _4 L; V6 Z% N. ?
    导致下次爬虫无法正确读取上次爬虫留下的痕迹。
    " H& |2 C1 `6 F, o4 T! s
    1 K* B( i5 O/ o:return url_file
    : ?0 {! Q  C; F5 i* M2 a" Z- |0 [; c6 P$ {
    request.parse(0 ~+ `0 H( l7 j- e9 ], y9 V
        url='https://www.douban.com/group/explore',5 K1 l6 l, Q1 `5 \- K! J
        type_url='text',1 }# ~) C4 L7 @+ y. }; E
        #login='taobao',8 s0 T  f/ T) b+ ?$ \
        Parsing = 'xpath',: `5 _+ u' l1 |
        label = {
    7 l8 @9 @7 y3 }# i8 Q# E        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    ( Z1 i+ j: C- ~7 f        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],% `! w$ y; E  C! X! `$ _  @- k% o
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]  \3 n$ A) u2 m) ~
            },
    & O" r( y, a. n" y    write='result.pkl',
    / b! B/ V8 r5 m. ]$ C    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    ) w3 n4 g1 ]! K( a; [4 N4 f5 n    # 第一个参数为是否需要断续笔记。# T! i$ G9 r5 r5 l2 W. g
        # 第二个参数为断续笔记保存位置。
    , ^3 L9 }! |" i% L% v& G    page=[True,'url_page.txt']
    # s" `! P: c5 {; h5 }. ?1 t% N2 b).run()& |- B1 R$ v3 R: F' h$ P
    # return url_file2 ~( f$ U; G7 o- [, Y4 K

    ; ~  d; X+ h1 O( c+ q第七种玩法:简单数据清洗( y- o4 a% T3 b4 Q5 M
    数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。$ p- j: I1 N6 ^
    + q* Z, Q, a$ u/ p
    特点:8 O* \7 `6 i" v$ ]4 C5 J
    本人曾写过一个底层数据清洗。
    6 J/ ~1 R- p% u; M( Q( X能将列表格式数据进行归分清洗。# c; g1 S: K; c9 b) f/ d
    主要内容请参考另一篇文章
    ! O& `8 a& U: o4 B( l如下连接:数据清洗
    # N# _) }! h4 a! {6 o# @* w2 k7 R: l) P% [4 x; O& d1 _
    缺点:
    ) x6 L$ y1 u+ t8 u& t  W数据清洗格式简单。
    " ^4 {6 `" M! Y  ?/ G6 w  I数据清洗内容单一。1 o2 B0 Q; L  [$ y" S
    无法完全做到绝对清洗。
    ! y0 f8 M4 q" ~4 y7 J- ?有待改善。: L) q7 k+ D9 P2 B% \* W) T+ h
      U; D) Y+ u4 `+ f  {
    :return keyword_list, value_list4 c, }* [3 H3 i) x, o9 c
    . ?& K; t4 q, ?, A2 N9 G1 f8 U3 T
    request.parse(
    7 r" A9 H9 E# @, W    url='https://www.douban.com/group/explore',( }9 J2 [. M* I, Y$ U$ {
        Parsing = 'xpath',; p8 l7 Y4 a. T2 D/ L9 d. n
        label = {. x* A: [1 l* j6 o! S: Q
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    - n$ Y* P: N& d* N# M# \# {* V        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],7 t+ P8 T) J; j6 [! `
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]4 F. H7 f! f2 @. l* D( n8 Y
            },
    ( {& o# K, G+ c- J. [    write='result.pkl',
    2 Z/ Z3 ^8 j! Z# [7 U    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',2 }, m0 A2 F9 \! T
        page=[True,'url_page.txt'],) u* ~- R  t3 G) x5 L$ f/ }
        # bool类型,默认不清洗
    ' `+ q6 Z3 Q. ^2 B5 w2 z* s5 y+ V    clean=True
    4 [/ p" a, a# i8 H9 n9 z0 s9 P).run(); Q$ d3 L0 T1 r9 K7 T4 M& Z9 l2 a

    1 T, N  g1 Z/ g3 W& e第八种玩法:爬虫存入数据库
    # @# Z3 O; A) V存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。: c3 q# C, `! j, \5 M# c+ [

    , Q. v: u8 c) c) ?特点:+ r" i0 x4 }! P3 N+ [) \) P
    信息存入MySQL数据库。
      M$ V2 @3 V: w* d& Y1 i- \5 x可连接docker远程数据库。0 A" E  M7 s0 z- }
    数据库的库名可以不存在。/ G# I) F8 p. Z0 G  p2 u, ]3 ?
    数据库的表名可以不存在。9 X# |5 ~- m: `' g- U3 `2 B* s
    根据之前传入字典键与值参数判断表类型。4 @" d. r8 b/ C
    自由建立数据表传入信息。
    ! o! Q1 j9 \" x( |
    $ M- r! n% T; M: t) e" L) T缺点:" o0 R; R3 n+ a3 |5 @! I# M
    仅支持MySQL数据库。
    # A6 q# I0 C# k4 A, H
    ; b) v' P- [1 E) f:return SQL
    2 V/ h" n# s: }+ y# K# W2 c* p+ D( I: `5 k
    request.parse(
    / `" ]" n, _3 t    url='https://www.douban.com/group/explore',
    5 ?! c2 x! v2 [5 Y' c    Parsing = 'xpath',; H1 z6 W7 e* B2 W' j2 Q; M6 }$ b# n
        label = {
    " H* Q2 w# v/ C- W) E+ `        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],7 K! t. f4 O& h- H
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    7 B' |2 @+ s4 ]: l) ?# t) T- }        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    & J( ?' ~- j. u! d8 E( v        },; c: k8 }# E: q, K3 [5 v
        write='result.pkl',
    ( k" f6 R% D! x    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    0 B4 Y8 }# w- q    page=[True,'url_page.txt'],
    7 `2 i/ D8 z( m4 t, z% u2 I( m" l    clean=True,
    % a: K9 q3 @/ i4 S. O' R    # 字典格式,
    0 \& G& C& o; B! V) J! {- `$ ?- L    # host可有可无,默认localhost
    9 f. h# ?1 m  n8 g    # post可有可无,默认3306; ?0 B$ q+ i* b/ B  _) p# k
        # user可有可无,默认root! `8 q" ^6 q2 e& u1 k. B; X) _
        # password必要参数,数据库连接密码
      _( F4 @- t! l1 \3 `' z& j- ^* g    # db必要参数,数据库即将存入的库名+ [- i8 E( L7 a$ Y8 i- u
        # table必要参数,数据库即将存入的表名
    - B$ E, ?' N4 M+ M/ J" p, C/ B    write_SQL={3 i$ t$ m7 P9 _6 t6 Y8 L
            'host':'localhost',
    - L5 T$ s1 b/ a  p$ Z2 ~        'post':'3306',
    % z$ e- C# i0 p$ G5 |2 \. `        'user':'root',/ b' f4 G" \* ?6 y( q' Z, r" L: h
            'password':'123456',& \1 N4 q7 |2 }
            'db':'example',+ g# x  T& L- k  F9 F
            'table':'example'/ x2 f' d. r; i  m
            }
    $ f/ u! ^. ~8 |+ v5 B7 A# _    ).run()
    2 R) j( `4 F- x* P( f- u1 U
    : U, M! R! [4 K4 }第九种玩法:重新启动爬虫
    & |6 f6 ~5 G6 ?( R. V* C& l爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。8 q2 U; _! ?9 ~/ ?
    / x5 o2 I6 t3 K6 F
    特点:4 {6 i; I0 Z& _+ n' y
    检测报错重新启动爬虫
    8 G4 Y' ^' ]) R+ j" R' X. Q: I无需手动处理错误信息
      S) @+ p6 ^9 N# C# Q( V7 h4 ^0 ^3 o+ }
    缺点:
    + P5 ^" P; r* p- M# u5 O* d4 T无法收集子线程错误。
    ! j$ e6 ?0 x) Z8 Y) n$ ?# i) V/ V3 F( Z  F' k2 z
    :return None5 X; {! r3 U' f' R$ |
    . c' g2 k$ ]  [
    request.parse(; ]9 C7 c( t: t
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],0 h+ n1 e' _2 k  L0 K8 x, T
            #login="taobao",
    - _  |; h' L2 H6 R3 z) W, n1 r        type_url = "text",
    * ~. z3 k+ U# N8 F1 ]+ y        Parsing = 'xpath',% p0 M* f' `5 b) x# d% I/ O# @+ f8 S
            label = {
    # u" v( v& j: Y4 D0 g* b            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],  q! D6 _4 u; s1 r1 s
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    6 k% _; Q2 {5 W( b- U# s4 ^            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    2 u0 N* t1 l$ H7 o7 o) _            },3 r8 `" S4 U7 Z* J) d9 c
            write='result.txt',
    % k1 Y: p: y4 ^0 E6 V        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    ! W# {* |( t' I. l- N! a        page=[True,"now_url.txt"],
    ( p5 G, a- @( y7 ^7 y, L1 O        # texting 参数为是否启用连续爬虫
    3 K6 [4 Z; q/ }! W& P        # 爬虫程序异常报错后重新启动爬虫# g" Q9 m' }' K
            texting=True,# P2 Y; ]$ C9 {) E
            ###
    " Q, r4 ^% w& K; {% Q( g        write_SQL={
    4 T% H5 _8 r4 t7 T8 i; F3 R- P$ h9 D            'host':'localhost',
    / H' I; X% H+ d6 K" A            'post':'3306',3 ]! O/ w4 d# n' a
                'user':'root',
    ) a' B8 I+ P; n; H' L% `            'password':'123456',$ F( G% Z8 S8 p/ d( y
                'db':'example',
    0 V% r. X% n8 L            'table':'example'
    % f3 v2 v" }% W; s& x            }
    % Y$ P/ T( U$ g).run(). A  [% g- K5 {" p7 N' a
    - B( T, s1 _1 F5 }
    第十种玩法:多线程爬虫" ]7 L/ q4 s$ d2 D3 A; k
    特点:- {7 ^( i" m) A1 I: @
    爬虫速度加快,& F! y/ i- z+ c: G: K& N
    更好的利用了线程。
      G! l3 N* C& x' ^' z1 _. ?4 a; D& ?1 `/ p9 x
    缺点:暂无
      x: [% V; `6 O
    7 ]& H; ?9 P4 g:return None) _& l6 }) E4 c  i0 B( f& V
    ) f/ ^  C- E* }
    request.parse(; n1 N& v! U- Y; d+ H( ^
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    $ O& m: H6 d- X& ]2 c* c, T        #login="taobao",' j8 j0 m- ~' `9 `# @
            type_url = "text",6 y# H  w- k% |& f
            Parsing = 'xpath',& k, _* I- g& f
            label = {+ r5 \- N* H* T* D2 ~& r
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],3 X( U, ^0 }" u- b
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    8 k" @, Q9 l5 s) {            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    7 R, H: k- l, _1 x/ e, y& ~            },
    4 K) Y3 p6 ]/ ^# @& E, ?8 j        write='result.txt',
    % L1 N% i7 v& r: x$ B: ]' H        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    4 u* H( ^( k) ~8 j& w        page=[True,"now_url.txt"],, v" j" n1 j$ x; R7 n6 h. u
            #clean=True,
    # o7 z# f' }" y: \        texting=True,7 o+ _* K" x8 S2 V! Y+ W0 _
            # status="threads" 启用多线程爬虫* T9 \( o& S# L3 s) z$ \
            # Thread_num 为线程数目,默认为1 单线程
    3 _; J4 t+ V" g  t2 r! u8 E        status="threads",
    ! H7 Q5 y# o- `1 u" a        Thread_num=3,; Y8 v9 r1 {7 K( q' X7 @
            ###, U0 P: I8 f$ d" s/ j. o
            write_SQL={
    $ v" o* `( a+ z2 V3 U+ h            'host':'localhost',; D2 |6 r- k5 D
                'post':'3306',
    - n1 z1 Z9 R; j% A6 M/ j. H% K            'user':'root',( w) f# A" b  P! s6 O- w! Y. r4 S
                'password':'123456',
    $ d8 ^; K: R) j! {( u4 `2 |            'db':'example',5 y7 W* B: N3 V- I5 S# S
                'table':'example'$ Z; O* G& d! n; E, O$ P' J2 l/ i/ B
                }
    # c& V6 j+ R6 |) [' a).run()
    8 {2 C  b# i' t3 x/ q( s: {7 N* Y6 j, L# |2 ?" V7 h. d
    第十一种玩法:多进程爬虫7 I3 ]" {) _* j- v0 k/ K
    特点:
    3 V4 X% ]9 |+ A9 `* T# Y爬虫速度加快,9 r' C% Z" d8 Q, w1 \1 N- a
    更好的利用了进程。. }* |+ U2 R) N$ e$ X' E+ f% e
    + R5 ^: D1 w) T2 \& M: c
    缺点:暂无
    $ I* ~0 a* A; H+ [  p) ?/ h# {3 m! P- `* P- V5 ]7 m: N
    :return None
      Y: u4 o. n, r6 S. S; i# U5 h/ E/ e1 w& B& F  u0 ?- K. o' J
    from simple_crawl import request
    . t! q; }; E1 e8 M. Irequest.parse(
    - s* D' o" s- u7 V        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    : O) G4 D' A$ G+ J+ P* H( q        #login="taobao",
    # w7 f/ g) o5 x. k        type_url = "text",- W8 N3 ^( v. \- p* i
            Parsing = 'xpath',
    9 s5 _9 {  j. G9 R2 Y! H        label = {  `- M7 v. A/ ^# V  i( q7 e- ?0 S
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],- `" K) H' S. M( p* A6 a9 s
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    $ ~( t2 z' c/ P4 ~# Q6 Y( b            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]- r8 ^+ `6 y$ r7 P
                },5 g- n+ s% R  n$ w
            write='result.txt',
    9 U* A# R: F- {, c4 Q& h; W        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',3 C% y( f! m. Z* X
            page=[True,"now_url.txt"],/ `* n, g) G  N2 d
            #clean=True,7 P$ P5 r$ ^) K; u
            texting=True,
    2 t5 R) T4 P# A& p; Y, }0 }        # status="multiprocessing" 启用多进程爬虫
    0 K' N* u  j- d% u/ P        # cpu_count 为启动代码核心数,默认为系统核数一半
    4 a, Y/ d: V$ U, G        status="multiprocessing",. T( @, k2 c+ |7 {% [
            cpu_count=2,
    # @0 {3 N/ J% _        ###
    6 @+ k9 i4 }8 d- o        write_SQL={. P- g& ^! g2 V; \
                'host':'localhost',1 W; ^- b) l  x1 p
                'post':'3306',) P: d5 Y, M. z8 @3 A% i  h
                'user':'root',
    : T) Q1 H  H$ a/ ]! C! }8 r" a" `0 r            'password':'123456',& T* s% L& y% T% ?/ \4 f
                'db':'example',
    ) S- \3 H5 G- p) b1 i* o- e  q            'table':'example'4 s# g  N0 _. o0 k
                }. }# e  H9 s. K
    ).run()8 i2 o0 i5 N% O4 E" w* p, v" b5 B

    3 ^0 H5 X  r, k- S" V2 u第十二种玩法:异步多线程爬虫
    ! A; N; U+ d; v9 h特点:- j" U. F3 u7 d& |0 M0 p
    爬虫速度加快,
    % [7 [/ S; `8 V' A- ~; m. O! t异步使得爬虫无等待时间,2 b9 B  x$ E6 r
    同时使用多线程速度明显加快。
    $ g- A4 t3 a8 t" P$ u2 g5 R
    8 s2 M$ F2 k9 O/ e缺点:暂无# R" H$ m! o  S8 a) A
    8 t( m3 s* \+ u  X
    :return None1 x# b3 C9 i4 R
    " [& ~4 u% V# i; P# [5 Z0 w
    from simple_crawl import request
    3 K5 M; V% U" q$ Brequest.parse(" _$ _6 r+ N+ b1 w8 s3 n, m8 p
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],, K2 S+ ^" F5 S: q" H! O/ t
            #login="taobao",' E  d# |: ^9 x- }3 ]
            type_url = "text",) \2 k& D0 ?6 T* c6 {" H
            Parsing = 'xpath',: m" Z3 N! K1 w
            label = {
    4 F* Q$ W8 Z5 R            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    ! V5 f6 z7 _: x% l, a2 Y            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],( j/ Z: B0 w4 T4 u
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]5 U. M4 z% ~* k$ }8 d
                },7 C$ Y# z& O0 D( {0 l
            write='result.txt',  A. E, q+ [$ G) J/ R" P8 X1 K& z
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',' n4 v- Q! \5 K% J' {9 N' D$ P
            page=[True,"now_url.txt"],
    : e5 @3 b" d- m7 ]0 V# N6 i        #clean=True,
    " g, L4 m( J) a2 v9 j  J( Q        texting=True,) z) o" \5 z2 y! N( a% ]1 |8 e) l
            # sem 参数为异步引擎数目,默认为5. Z- }; |! z" Y; }
            # 其他参数同上1 p5 v# l8 h* m3 O3 }
            status="aiohttp",
    1 d. t1 O- g' ^: @* \        Thread_num=3,& K$ Z: ]6 E' C% a/ e( d7 g: z
            sem=5,/ u) B) z2 ?% B3 ?( i1 x/ @
            ###
      ?' a" q; ^' r8 ?3 p9 k        write_SQL={
    4 t1 e. H4 t' S4 l& d  [/ ~' d) E            'host':'localhost',
      [2 L1 h; |3 z+ N. N% d            'post':'3306',
    % Q/ |5 m) {3 X% `            'user':'root',* x5 l* I- _# y! _
                'password':'123456',
    ; Y4 n; U6 ]  }7 E: f+ i& X            'db':'example',
    $ u' t) [6 u! ]6 h+ y8 G            'table':'example'2 O, `' T* H" m* N$ Z' _' i
                }7 T6 S- z' `8 f2 c, {* b% U8 c
    ).run()
    ! z! f( m0 r% y8 V6 z* z3 e* `# f+ f! ~+ O
    第十三种玩法:异步多进程爬虫- d: j( l0 F9 X# p( q
    特点:" F: W+ X, Q' D- y5 ~9 z
    爬虫速度加快,
    & n  J8 o4 R5 l4 R/ p. J异步使得爬虫无等待时间,
    + {! Q" r# D2 c5 \& w! c# m4 `同时使用多进程速度明显加快。
    - Z2 N& x# X3 t5 t
    / a% _6 C! A/ W! m+ V8 Y" H缺点:暂无
    / Y* F7 E/ t. S1 I2 [" z6 e% l7 `% b( F8 h
    :return None5 G+ X) f0 v; Y1 i/ `

    $ P, |: d8 M9 G! |: P5 vfrom simple_crawl import request1 N6 u! a- t7 A0 D2 U
    request.parse(
    ) a( \; H. j& a        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    ( ?4 \0 Y: ?) Q+ O  N  t        #login="taobao",# P+ G3 I3 e" H: O. @
            type_url = "text",7 ?2 F2 b3 m$ p: s! l* [* q0 K2 I
            Parsing = 'xpath',: B% k( }' N+ G7 v) ^* p% V, v. v  s5 C
            label = {
    ; Z; ^  C( a! A6 N: {7 W% L6 f! s# L4 o            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    ! i, ^) A& x* |7 g! j+ i; \" }5 i            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    4 C( N+ \6 n2 _( k% p- {" Y4 q            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]& T, G$ u3 I2 U6 E1 S
                },
    ; h1 W" C+ L# s; @! I4 O& G; R8 ]7 _        write='result.txt',7 N% w( Q+ q7 O% a6 F# h
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    8 C5 `+ `- p& Y( N0 `2 r. M        page=[True,"now_url.txt"],
    & B! ~5 t0 @( X+ `5 h        #clean=True,* m8 Z  S  I# \1 F- N$ L, J
            texting=True,
    ( y, g# O' h& e        # 参数如上+ y) S' W/ v# q$ |2 U
            status="between",
    9 r3 t" X) I& L  _& j7 s' b        cpu_count=1,  f: ~1 c/ I" X/ w3 D
            sem=5,7 D: K2 ^* v' l+ S! m1 p
            ###; H, m! h% o2 n' [; I* T" f+ y4 y5 v
            write_SQL={
    - {7 O9 y% z. p8 U, |! Z+ h            'host':'localhost',
    : z$ h# Z0 p- A9 x3 ^- l0 b            'post':'3306',# k( A/ N$ W1 L. L7 v6 M0 C
                'user':'root',, z4 v0 W, A1 b3 Y+ l! X+ t& m
                'password':'123456',
    + O% u" q' Q) j( L0 V9 R: ], ?            'db':'example',
    2 l5 n4 o0 J7 d4 c+ V2 w; f            'table':'example'
    : X% `4 S- P, c0 c: Z$ x            }. @' o. R3 ^7 e5 u$ o
    ).run()0 _; a) S4 I1 N, W1 P

    9 D7 P: V' M# O( e
    ; K7 t5 W! F, }- ?8 g功能介绍完毕🤞9 p* l( z0 ?8 P
    最后还是希望你们能给我点一波小小的关注。( |6 T6 O# |: t3 n/ K
    奉上自己诚挚的爱心💖
    0 h: |" F: [1 [/ s————————————————
    8 [" z3 e+ W: E7 R- @- q版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。- y7 m: t4 }8 c) y8 ]# }9 z4 X
    原文链接:https://blog.csdn.net/qq_45414559/article/details/106005684
    ( B7 H- Y0 {- p" M
    , V' B) I' X1 ]' O& o' L- z* j, F0 E( z$ d* c- N0 T% y+ L0 D6 b
    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 17:57 , Processed in 0.501910 second(s), 55 queries .

    回顶部