QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4718|回复: 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' z' y3 A3 {$ T! a% {
    simple_crawl0 z$ g$ W0 d! W( ~2 ?$ o* y7 k7 D3 a
    仅需一行代码即可达到爬虫效果
    2 S2 F- v) Y1 d6 }2 E5 H( O项目地址(欢迎star):https://github.com/Amiee-well/crawl
    & ~! B, H0 R* i" P6 W* e/ [使用方法
    5 d* M. A: {. K/ A$ Y  Tpip install simple_crawl
    - r7 e+ E/ |5 a) F/ e* R/ D! A( O8 U5 ~9 R0 [0 b$ S1 z
    ### 以下源代码为简单介绍,详细功能介绍再源代码之下
    . k. s+ Y1 Q* ~4 \6 n4 a* xfrom simple_crawl import request
    3 w9 f% t% V) w4 B  Y8 z$ `request.parse(. d# {6 K* `  ?
            # status 参数为运行状态,支持单线程多线程多进程协程以及联合
    5 A) F( a: ?1 L        status="aiohttp",- t" I) e1 k/ N7 P
            # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式
    5 l. Z8 M4 _4 h4 N        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],' [! p' `9 ]8 R- v9 X& z0 V7 O
            # login 参数为获取登陆信息,如淘宝等网址需要登陆信息
    $ E3 m# m# L: w4 T% e- X' g; Q, Z    #login="taobao",
    6 d! v0 u* I3 W; U/ \    # type_url 参数为返回源代码格式,支持text和json,默认返回text
    3 t+ U4 k6 c5 u0 Y& c! j) L    type_url = "text",4 `7 ]/ E1 f9 L4 X
        # Parsing 参数为解析方法,支持re、xpath和beautifulsoup" O% k  L) Y0 C- E; h5 O* D
        Parsing = 'xpath',
    7 T0 O: b$ a  Y2 [    # label 参数为爬虫解析过程,字典格式,详情见下方
    0 ]& j; g* g) D- h6 ?    label = {: |+ f$ w, o3 p: L9 F5 O6 `
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    / J: L; ^3 [. H% A+ d            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    * K( f1 K$ p5 \5 {            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    8 p' Q* k% X  @& ~! ]" I" d; S     },
    + s) V7 g& u! b     # write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱
    % q. Z' B% j- o     write='result.txt',3 H: b+ x3 f; T& [+ O/ D8 h
         # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫
    + ^8 d' k, w* Q/ z# X' Z     next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',4 D: i: r4 u+ k: o  V, I) o
         # page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫# Y9 Z! W( r" g6 G" Y( {7 ?' Y
         page=[True,"now_url.txt"],
    . d8 U/ `2 G1 P0 D7 o4 w+ E7 B     # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息' w" S/ a( U& R( a) ]" ?2 l7 Y
         #clean=True,$ p3 @. Y7 w3 K  y  r6 {# [
         # texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序9 J. w- D$ D) v" Y" S5 n+ J8 B
         texting=True,
    . Q/ ^2 e% _9 E) M* F3 }     # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态
    4 i) k. _  F% Z6 X; m) r     Thread_num=3,
    0 _8 o: [+ w& m     # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态6 B/ b) G$ j. o" q5 ]
         cpu_count=1,; ?1 ]/ _- \3 G
         # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态* e1 n- `7 Z9 E! T1 V% l3 I! ~
         sem=5,
    5 V* p- p' E0 H  S; j% ]% j$ k     # write_SQL 为是否写入数据库,默认否
    3 w7 U, l) C6 D7 S4 o     # host 参数默认localhost
    : t, C$ r5 f( y# ?7 ]& ~     # post 参数默认33060 q7 X6 }. [8 b2 W. B4 x8 Q) h+ _. q
         # user 参数默认root' c+ A/ r  w8 _7 n
         # password 参数必填,必须正确" D9 e3 E7 L" c7 M
         # db 参数为即将存入的数据库名,若不存在自动创建3 F/ \2 ?& k+ W( S. |6 h
         # table 参数为即将存入的数据表名,若不存在自动创建: }# t8 d2 B, o; r; Z8 g' j6 s
         write_SQL={
    6 U! C2 P* K6 C0 F) R# v         'host':'localhost',
    % G" D4 t1 Q, v! q3 Q         'post':'3306',+ ^+ Y9 _3 n! U: y2 a( [# Z
             'user':'root',6 e- G; s6 N8 i
             'password':'123456',4 i( M3 V( Y# y
             'db':'example',  g" E) A/ ]; z7 x( i% K/ c* p1 F- X
             'table':'example'
    4 `1 E# U0 k( A. a6 f9 u: C      }
    * G* N1 }) V* F0 Q! |0 H7 V8 P).run(), h: @: {' R4 R# a( Y  b2 `
    ! w5 b6 l/ t3 }0 S  ~; l; ~
    介绍一下crawl参数设置:, S0 h% [* I! P; L

    3 G! f# _$ f7 D2 z% |- ]% E. i7 K'''7 C2 o1 v3 m3 f7 p
    单行代码爬虫程序执行6 u" ^; A% B8 l% i7 G
    :param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档
    . r5 [, d. x  X:param url:即将请求的url地址,仅支持get请求# m0 y3 D" S: k
    :param type_url:请求url后返回格式,支持text和json格式返回
    : f5 F2 G: j" C5 `6 G" b:param Thread_num:即将启动多线程个数,默认为1单线程
    ' S$ l5 k1 d) G5 I:param sem:协程信号量,控制协程数,防止爬的过快,默认为5" y! z+ i/ @* ]4 P0 ~& y
    :param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半" V" a0 r5 \+ l
    :param login:模拟网站登陆,保存登陆信息
    1 P; W* _, }  G: f/ g7 g:param Parsing:爬虫方式,支持re、xpath以及bs4方法+ x) T( z* t& y7 }( M
    :param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,3 p, Y; ~7 M7 ~5 s$ I4 e$ F
                           多次报错结束程序,默认否
    ( ]. [6 m- K- [- S  F/ I:param label:选择器内容,字典格式保存,
    - B! Q0 x) h5 m3 R3 _                     字典值为列表格式,第一个参数为选择器,第二个参数为转换类型
    7 @+ _: |$ j5 \# s9 N) t/ v                     第一个参数必填,第二个参数默认str类型7 x4 y5 s4 P8 |
    :param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否
    4 N/ T2 O+ z5 b" a9 Q0 U5 x:param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫
    ) R0 ]4 q4 y7 K. }:param page:是否选择断续笔记接手下次爬虫处理,默认否% j( t1 w4 u% m8 X1 D7 W* ^' ~
    :param clean:是否进行简单类型数据清洗,默认否$ u3 r/ [# _8 l( ~7 w7 U
    :param write_sql:是否写入数据库,默认否$ D; t3 A- N+ n, j) q* T
                             'host'默认为'localhost','post'默认'3306','user'默认'root',
    6 l# s& `7 y9 X                         'password':'密码','db':'数据库','table':'数据表',. @3 T" D) H9 |$ r; K) d
                             检测库是否存在,若不存在则创建,若存在则直接插入,1 t4 T! t) j  t! m8 L; M7 q( o9 C
                             检测表是否存在,若不存在则创建,若存在则直接插入
    ( n, z$ b# d; u  G+ I, d" {:return True3 ?! k5 q! |8 Y1 l/ H" r. h
    '''5 S& v1 P4 I$ w' X4 A# k& w
    介绍玩法2 F  X2 E: @, \/ S  j, D4 o
    接下来介绍的均为调用第三方库的情况下运行:* @4 x! F& K% l, X

    1 y6 Z: ~# y( `8 k5 Ffrom simple_crawl import request* Y* l9 k# l1 p. R
    第一种玩法:输出源代码4 N) l: y, J1 I3 `# h2 P
    调用requests库进行源代码请求。
    6 {  K2 ^1 i) G% M% S; E" I0 K+ k, h- i, j5 I' U6 M& `/ {5 @
    特点:
    ' Y: D" W& B( y; `% g请求失败则调用ip池处理重新请求访问,2 S6 B: n; j9 K+ ?5 A
    出现五次失败默认网址输入错误。
    & [  Q' t$ F7 p* c7 `9 @5 ]支持text以及json字符串返回。默认text。
    9 D0 R! K0 C6 A5 F9 Y( l
    0 S% [" ~& _# R4 a; q缺点:- K- X5 ?3 X+ |2 X( L
    暂时只能进行get请求,不支持post访问
    8 A& }: R/ r- p: w7 B+ u2 R. z+ N, w) o/ @7 M" [% i
    :return text or json
    & e. Z6 Q8 N( @
    + F) b, U* T, frequest.parse(
    ! z2 o# C  d, v% A$ ]        url = "https://www.douban.com/group/explore",1 V% z+ m  z! w2 {" G5 d$ a
            type_url = "text"
    4 {7 t1 H! @! n6 r: x).run()! w. u5 B5 J2 O
    # return text
    ( Y4 _1 o0 W" E! [
    ! I; q" F7 U6 r! ^3 }# ?/ Y第二种玩法:模拟网站登陆并保存信息/ j0 M- ^! _' \: u5 Z- V7 N
    调用DecryptLogin库请求登陆访问。; F# Y; J! M1 _. F2 f

    : f" c, R% G$ C3 b: a+ K9 \ps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源
    - W0 C, D7 V  @在此放出文档地址6 i! S) u1 n( W2 }
    DecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/1 c! v+ ~6 R9 h
    / @( x+ v6 l/ O7 c. G
    特点:# q) f6 Y7 k% u
    将DecryptLogin库中二维码继承到此库(非二次开发)& H( y( w! `3 m1 ?
    支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆)
      k, V4 e! T0 y4 J1 i8 J2 r保存session.pkl信息到本地方便下次登陆运行7 z0 ~2 t$ @( G* ]; E/ p/ F+ U

    5 y6 ^1 A' r3 e2 z  a0 r9 V' q0 r" P) T缺点:
    ; ?6 X. d  {7 g" Y, Y6 fsession.pkl登陆信息过时无法自动删除。! a. X) `/ H& ]4 C
    导致下次登陆疑似cookie无法正常登陆。6 P# B& }/ C" r
    ; ~+ X5 y7 F- s  W$ B% |3 K; b, G
    :return session. D8 b; K6 Z% G# m) P6 O4 k# Y$ n. E
    . B$ s* W2 M9 u8 L% e
    request.parse($ H1 F7 _: B0 B! h2 K  u- _% v
            # 臭不要脸的推广一下我的店铺0 f' n2 o8 A% {5 f
            url="https://shop574805287.taobao.com/",- u9 V) X' P& @% ~3 b
            login="taobao"
    9 R0 w: K9 X# Y' `).run()3 j& C) M7 [. [+ E; l
    # return text" q( r1 u. g! `6 d. \
    8 ]+ [! ^  v: Y
    第三种玩法:爬取网站信息- E6 ?; k) u8 c1 z. t  d! H+ Z
    爬虫库自然少不了爬虫的过程
    ! r; S3 \" x+ `5 j; N
    8 w& P) V( W+ i* b- M特点:$ o7 h3 G* v4 ~: m5 ?
    支持re库,xpath解析以及bs4选择器。
    # J3 O- D5 }" |/ z( E% \爬取方法为字典格式。单方面输出。
    , d& q; w+ J0 n: D2 X* s- {字典键为保存的字段名称。/ j$ ^! n) M* ]0 S
    字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。/ z5 m3 F! R1 x" j) n1 r! O: B5 C

    2 O) ^$ h  c0 N缺点:暂无(等待小伙伴们发现)$ ]0 ^% X9 {& a8 `
    * p, R  ^* e, P2 [; S! s
    :return reptile_results- B# L; l* A' l4 D0 X  x

    ) \1 z6 C4 _; H; srequest.parse(  u. K+ Y! a5 ?" ]0 y
            url='https://www.douban.com/group/explore',
    ' r0 }% `  p. Q5 J        # 字符串格式,选择器方法。
    5 u+ p0 H( q! u4 C    Parsing = 'xpath',
    * o( d/ v# _& ~: X% k5 ~    # 字典格式,参数如上。5 Z8 c6 a' X" |; H* w& o
        label = {
    4 K7 ?6 P9 w4 v3 T8 G2 o4 D        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],9 I  t. y3 k( t
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    ! V/ V7 A1 I" E- E% m/ k( ^        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    , I: ^: j' v, v0 |        }
    . ^4 r) ]/ F4 s4 _5 E. \).run()+ N) A4 z# R7 u; l2 e! C0 g4 N: D
    # return reptile_results(list)
    ( }8 w. H- t& q, h# s9 a. T5 J' g7 b0 D( o" a) m
    第四种玩法:自由保存信息
    3 F: m# a' m1 F1 X1 L7 x) O/ ]目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。
    + _2 x% E- @7 @3 w8 u( V  E+ E$ T8 G# O) w* q. u& p
    特点:- L! x% u( N" m
    写入文件均为数据格式传入文件。9 r9 i" a1 `; d2 D
    且输入格式规范方便阅读and省事。7 T9 L6 d* ~  Y

    . u0 m1 K- U: _6 p' N缺点:
    , l5 |* u: k; Q保存格式仅四种,
    & L8 J2 s2 P0 z' b' q3 N" Q不方便用户之后读写操作。
    7 y! ^5 ~& J" N" I4 {) w7 f# i6 L! X% y  L
    :return file
    : c, t7 q" F* Y7 ]6 v  s, N% p$ R/ ^" g
    request.parse(4 y; }) c. L/ t- Z
            url='https://www.douban.com/group/explore',
    4 o* D9 p: a* w0 s# b& E6 `( p7 T    Parsing = 'xpath',+ c7 V' |$ P- K+ n$ G
        label = {
    ' {; j% Q/ w) Q7 c9 I  M        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    $ Q% g) @( `: ]        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],  x: B4 L' |+ [2 K, V: W# @
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]4 B9 Y1 ~; h: H
            },: E' R0 i  Y5 O& Q
        # 字符串格式,具体保存位置填写$ s  R+ ~7 s9 p2 D7 A7 v& W0 g
        write='result.pkl'
    ( s' ]$ v' L4 `2 X2 M( Z).run()
    - f$ S6 x2 ]; x. [# return file
    # p+ y  V; N  l0 k, w/ [8 N' h/ M& v6 f4 E9 L5 H) s6 `/ x. @& A4 a
    第五种玩法:读取下一页 url 地址继续爬虫
    . [' a; r! X$ O0 |这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~' o- n+ c! Y! N+ x0 P

    ) H  j$ K, \. `' A, \特点:
    8 [4 N0 O, M$ [9 v继承之前的Parsing参数选择器选择方法。
    ( l( N* l$ a* U在这里可读取到解析后的下一页 url 网址。" M( N% u$ W' `1 v( I2 o! V
    方可继续进行爬虫处理。方便用户使用。# K, X4 q+ f& r) H* j0 N7 C

    ; z+ W! o" y- m, a$ C缺点:& G0 V5 E+ G0 R) V$ r
    若爬虫时下一页 url 地址改变,便结束爬虫。% f% R' U# d8 t+ E! U: Y% R+ e
    只能爬取所给 url 地址中的信息。
    ! M8 Y( F: v9 Q无法进行某一界面的多个网页爬取返回。
    2 [# d% ~$ K" g; y- m( W# E造成访问页面单一流失。
    1 c6 K! D1 l0 w' w2 E' X* {& [; c3 D8 Y/ q. k+ Y6 m
    :return None
    6 f8 }6 S7 n: S' D, {( h0 h  |+ {( N# _$ w
    request.parse(3 S9 K0 ^% \) C3 K# ?! b2 C/ z3 ~
            url='https://www.douban.com/group/explore',
    8 s1 L6 a& t  ^    Parsing = 'xpath',- h$ n) P7 ]' R
        label = {6 C% `& S, z4 ?6 b
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    $ y1 t& {3 L6 h        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    2 Z2 }7 z% U! ]6 X8 q) z        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]' `6 z/ |$ n8 e3 G/ d
            },7 l$ y3 Y1 U6 U9 z5 J
        write='result.pkl',
    3 {! p4 u% ^& W; ^    # 字符串格式,根据Parsing方法继续请求下一页a中href! j- @; U$ a: p, U- s" z. i
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    , V" O. o, Q; [9 k; h3 I).run()7 k; G) D, m0 a5 V/ ^3 f8 U
    # return None # f% n( ?- F0 f" ~

    # {" i  p$ m* A/ a* u第六种玩法:爬虫网页保存: f; }  G/ \; J7 t% P9 y
    听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!2 l5 Z( C4 v' \  t( ^2 Z
    6 N0 V6 V- S- w! u4 r  h
    特点:
    3 N9 k3 S' V0 @8 a+ I6 X* e持续输出断续笔记。
    - N1 Z* H( H% }2 B将此次爬虫的 url 地址保存到一个文本文档内部。$ x! w. E( E" n7 u
    下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。
    & Y# X; g# }& {. q* f3 p/ V$ }: E4 Y* l* C" {2 J! ]* D
    缺点:; ?- t$ T5 r% I4 g
    读取内容不单一。
    6 w- b; @" Z$ _8 b8 K. D导致下次爬虫无法正确读取上次爬虫留下的痕迹。
    8 i& V6 ^% I* ~1 g4 C: i4 x( t. p% A6 k% ]& Y
    :return url_file$ z1 s, N+ F3 u- e( }9 E
    7 M1 |$ a- I% c
    request.parse(4 \! O1 V5 Y+ Q3 {8 P# [9 a
        url='https://www.douban.com/group/explore',% ~  ^# ~1 b4 K4 B$ B
        type_url='text',/ ^/ b2 I! h" q6 ]+ x+ E! I, w
        #login='taobao',. r9 K- s5 b6 O2 ~
        Parsing = 'xpath',; H) o; {  M, B) }0 h3 {
        label = {
    ) y& O* ^: G5 W        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],+ A7 @: d, l% x/ q) V# N2 s
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],) |8 K+ i% [7 B1 T/ @, k+ k/ M; ^
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]% Z% \8 U8 A  B& F5 M$ C
            },
    + B" W9 b. @2 Q7 P4 C0 d2 r7 H    write='result.pkl',
    4 z+ S6 ]% [5 F  D+ w0 z# ^    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    - @( a- y  q1 H2 S2 c/ f( M    # 第一个参数为是否需要断续笔记。
    ( x4 ]6 Q4 @1 r# ?    # 第二个参数为断续笔记保存位置。
    : ]  i( L! [, N6 P, F* `/ D    page=[True,'url_page.txt']
    5 N4 V0 O9 e* A; Z/ _6 D).run()" X6 {+ C# |& R' R) ^; Q
    # return url_file% F) `" |) U; l1 L
    ( K7 {; e0 K$ J6 E
    第七种玩法:简单数据清洗
    6 J4 l' |5 A# i6 _0 V" q) @4 P数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。
    2 h8 S- X5 n7 C
    ) f2 p7 |; \+ `特点:1 q2 [: ]: F% Y: ]
    本人曾写过一个底层数据清洗。
    , x0 a' u9 u; l3 ?5 K$ ]8 s能将列表格式数据进行归分清洗。) S+ T- d9 s5 M1 m
    主要内容请参考另一篇文章, \- G7 P2 G& a& a; a$ V* ?: u
    如下连接:数据清洗# l& a2 ^5 I( L* q9 i9 {7 [% F

    4 M/ _5 G- p/ }; f缺点:
    $ h+ O  I! ]( e数据清洗格式简单。
    $ M* j2 ]+ [6 j8 i0 L; T% K* J数据清洗内容单一。
    7 l: s9 N" S' z无法完全做到绝对清洗。, K. U) y4 T. ]9 }
    有待改善。
    : {- t  O! H. Y- W* S4 V/ n
    3 b& ~8 n" g" k0 y' O9 J6 V* V:return keyword_list, value_list% A9 H2 j2 ~6 }
      ^  a  i4 r0 B3 ^- G3 _; G! a/ D
    request.parse(/ G& t0 i( u( m) s
        url='https://www.douban.com/group/explore',
    , x8 o, n, o+ u2 ]( I3 d7 t  E7 O    Parsing = 'xpath',* Q1 i/ F8 B7 i# k3 g
        label = {2 @3 o( L+ h3 z. s1 H
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    2 t) B- q2 i# v3 v6 O3 b        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],1 p# R' Z3 M# b: ?/ A$ X7 f$ X
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    $ o( O6 \/ ?: G5 Y+ V$ d        },
    0 r) F& L& q! ?+ z# _. A1 E& ]6 {    write='result.pkl',- r- t9 Y# h3 m
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',+ n/ d+ ^% y0 h# K1 X, X/ \
        page=[True,'url_page.txt'],7 Q5 V$ q7 L" K* N
        # bool类型,默认不清洗' R, ^: _8 m3 b6 O
        clean=True
    0 s6 y9 K$ }# k0 [- B$ W).run()
    * q& E4 S6 R9 {9 p# _/ A% d, Q
    7 |9 }' @1 O4 d+ ^& X; x2 q# b# W  v- S. m第八种玩法:爬虫存入数据库- a" U( L% _2 o* t
    存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。
    2 B" J- P7 r+ x; D$ t0 K7 f5 z1 G
    0 ]# C. S; _  D) x特点:
    2 n2 Q( E" |. M3 Z+ E信息存入MySQL数据库。
    * V8 s4 v- C. i, [, @  v4 T0 D可连接docker远程数据库。, _+ U0 L0 j, k/ {( E5 u' D+ ?
    数据库的库名可以不存在。
    ; `/ D7 `3 d( M  v* D5 ~' ?数据库的表名可以不存在。  m* j7 t9 X4 K  o" s; c
    根据之前传入字典键与值参数判断表类型。& v% m* U$ R( S$ }: x& q+ L
    自由建立数据表传入信息。
    8 Q+ l- p* }1 j1 P6 l8 f4 N4 F3 `; o1 x1 X) L3 ]: W6 Z% S7 A5 o$ G
    缺点:
    / L0 M8 @, X# O# O0 C9 m仅支持MySQL数据库。
    8 C/ x/ I  L$ B" j; |- ^3 o( z* w/ U+ E$ X6 W+ t8 Q7 ^
    :return SQL4 j9 w+ Z0 ~% s" ^

    ! G' a; F& q# t, Z5 j* E& l7 hrequest.parse(
    , j5 |1 K, A! O3 t; H. b, a( n    url='https://www.douban.com/group/explore'," T0 T! k8 i, |: W# u
        Parsing = 'xpath'," L" u; U1 e; p+ n, M
        label = {
    1 d9 j0 p, E% x' @, q% j  R* ^( f% [4 A        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    9 v! a3 `" ~: l        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],& k4 v% p% X( M( p
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    ! o$ B% D; x* |+ ~' ]/ M0 x        },
    * C' v) w$ x* Q2 Q    write='result.pkl',
      `4 s3 T: s. B. s    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',% ^& w4 Z# q4 ]: L: |
        page=[True,'url_page.txt'],- ]6 A3 X/ X; b% U9 w! N
        clean=True,, G4 M8 b2 I: H  B" Q* H, E9 F
        # 字典格式,
    : x4 @) U9 C8 t  c! V8 o3 b# U    # host可有可无,默认localhost0 Q% ]; a) {& p
        # post可有可无,默认3306
    8 f; o0 A5 \( i5 C6 U    # user可有可无,默认root5 Z7 O* s; d+ w9 L) G1 R: l  p" h
        # password必要参数,数据库连接密码  v0 S/ |' q# I% E; y
        # db必要参数,数据库即将存入的库名/ n, h8 r' l& ~2 J' t% w5 T. E4 W+ R
        # table必要参数,数据库即将存入的表名
    ! X' ?2 e( W6 m4 v! \! w    write_SQL={' k9 \. Y* w% F
            'host':'localhost',; d0 {% n5 q  R3 n1 J
            'post':'3306',
    7 Q! @, V# Q& @8 _/ w' G3 {$ Q        'user':'root',
    0 i$ {4 T0 [* c& {3 p9 e* n        'password':'123456',% w4 w5 y5 c+ b# u& ~! ~9 h% G
            'db':'example',; M/ k) I- i$ j
            'table':'example'- \" {5 |0 ], j! |' j# u( }/ @
            }
      F, Z5 C( J& A, f    ).run()+ u9 i/ v; p6 D  p

    ' r( I  S, f( [- l% w$ a, x1 ]第九种玩法:重新启动爬虫
    # r4 x! J! ^  r6 ?爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。. q7 W" d- s$ H' g4 U/ G1 p

    2 @8 c! B+ c( a( U' G特点:
    * Q/ A! u. N/ F检测报错重新启动爬虫$ Y/ s2 y' [) W" ^$ ?; f
    无需手动处理错误信息
    1 K/ D% R5 V( H$ O& {4 @( G( X- {% E( @8 \! d
    缺点:1 L2 q, s; ~9 w4 I" k2 B; o
    无法收集子线程错误。- h  A6 D* k7 g- y' e. d; P! E6 V, R
    : p! M5 D' d0 V. ^9 z: f* o, t
    :return None% T* a) d8 O: q/ J9 R# Z3 D
    1 F; }1 I5 a- M4 u4 A/ Z0 z/ b
    request.parse(3 o$ b* s0 o. @6 W  x+ H' E8 P
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    * {% m% S# R- t! G1 d; F( ?        #login="taobao",! |* I- p7 Q4 ?6 H& V
            type_url = "text",
    " |# y8 n) e, h. A/ q        Parsing = 'xpath',( W, Z$ u. [  x  y
            label = {
    , Z: p$ r4 s' f2 G            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],' M) S4 m! X$ I. `
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],4 F/ Q/ w, A" n( n9 ]4 `
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]9 l3 N4 C1 d' r$ [# M
                },! B4 l2 e' Y( w5 m* N# S
            write='result.txt',
    8 h0 v" t3 B4 O* @        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    , H* j5 |9 l: ?7 y8 z9 x! t* _        page=[True,"now_url.txt"],
    $ l, z1 x0 j+ W9 |" t) U. S0 w        # texting 参数为是否启用连续爬虫
    7 A# a, u0 P9 Z' i2 G        # 爬虫程序异常报错后重新启动爬虫6 X. d$ S$ ~$ K
            texting=True,: }3 w: Y$ M4 {# F$ H
            ###
    . l: Y$ a  g9 }        write_SQL={2 M& w! r! W& Q+ `: Z7 h
                'host':'localhost',
    3 u9 d2 D# b3 {' p5 @            'post':'3306',
    6 d4 B8 [+ Y- W+ v) l1 }8 {            'user':'root',
    * f$ P) n- K7 Y. F% x            'password':'123456',# M& H4 e  B* @& a# D+ J* @8 V& R
                'db':'example',* x1 A3 L4 O3 D* U0 W( B4 r
                'table':'example'
    - F* m1 A/ ]3 E3 ]4 t2 I: |            }
    * u4 p9 [8 O4 n) }8 J" K& `1 S" B).run()$ v6 y. X* `2 R( r3 l% K

    . i8 X& v$ u/ ~* Y" ?第十种玩法:多线程爬虫! h0 x9 G( e# I1 o
    特点:1 i8 y+ j9 S" Q6 ~% b
    爬虫速度加快,  _) C2 y8 S+ U$ Q. y- V1 {* \
    更好的利用了线程。
    ( b' C1 _  S5 p0 U* ~; L/ v3 F  \* j9 L1 _( T9 B% V, v
    缺点:暂无5 d$ ?0 O7 f: |- z
    2 k1 p8 J$ p; q% ]- D! m
    :return None
    7 g& k7 E# u4 N$ [4 E. @0 L& o! I( b% J5 S. ]$ w$ D0 o1 W
    request.parse(3 ^* v$ L0 ]+ g: i
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    # c+ l9 _1 t1 H$ u7 {" k        #login="taobao",; s0 H0 j0 Z& X, I
            type_url = "text",
    4 a2 p: ^- D6 H% j1 p& M, B        Parsing = 'xpath',
    3 ^1 l& k+ _# z. O        label = {. B& q  L9 \& i5 R8 t- ~! m* q5 e
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],( ?* T+ e" Z1 @
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    % z1 Y* k; K( _, A8 h* I) |            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    1 c' D/ v1 l( \            },9 R# }* }. Q5 m
            write='result.txt',
    ) f- B  I& y  s! A        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    9 D. \5 O5 a* |% y% @) p$ @, B: l0 {        page=[True,"now_url.txt"],, A4 a  O# R& |, ^1 c# Q; @
            #clean=True,
    " f; t7 m' {: T; q+ P        texting=True,) M6 O* y1 u+ a# a" d! e) v
            # status="threads" 启用多线程爬虫
    : W) g, z7 W  e3 c        # Thread_num 为线程数目,默认为1 单线程0 u) P# u4 I' `3 s' z7 n/ ]2 {
            status="threads",; A, P" e) ^: s
            Thread_num=3,
    ; z+ _% {6 h% u" g* E- T& _( t        ###  p7 T- ~" m. m8 S
            write_SQL={3 O! b7 r! b! ]* F* H  E5 }, D
                'host':'localhost',
    7 l3 r6 y. G$ }8 K0 ], @* x            'post':'3306',
    " P! S; ]. v, I4 F            'user':'root',
    4 ]  u+ l: K) a4 H& C( M5 U% b            'password':'123456',; |* J% Z$ r; p! D2 e3 |. q2 w
                'db':'example',- D9 C- ]! |( O# p7 l/ c. Q
                'table':'example'# P2 x/ s3 X) v. c6 C9 x6 |
                }
    ' y. p; J  i* M0 W# e).run()
    6 c6 O# L2 v: o5 T* g+ C, Y* H2 l0 E) q2 n. ^! b* z$ i2 e0 X* p
    第十一种玩法:多进程爬虫
    ' p; j3 ~9 t" y$ l, {7 {5 @特点:
    8 ~7 e. O+ B$ c/ [1 Y0 Q6 b爬虫速度加快,
    5 `% ~; ?" x. x+ {" A  d! g1 L更好的利用了进程。0 R3 ~% i$ C* \. |) S. H
    . A: u0 X+ h$ r" @
    缺点:暂无8 ]& d3 X$ n8 O0 C2 X7 T
    2 e$ p, \. @& O6 t1 h. L
    :return None
    % x0 s1 ?/ i, h2 j0 D# v5 u
    2 Q3 L9 ~4 W# E/ f4 q# N% `from simple_crawl import request
    $ Q7 k" `3 h5 g1 V' d3 xrequest.parse(, y' q7 ~/ ]3 X# }$ q  g
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    " p0 f. g- P9 D+ a6 f- m        #login="taobao",. g0 V, x5 ^' O* N7 M, @
            type_url = "text",2 M2 @- `1 ~# r! v" G) z
            Parsing = 'xpath',
    2 j! \; z5 j: M6 P4 e        label = {
    ' m! i1 L7 J7 V* E' S: i: d            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    , y  q: S, X# ~! b3 ^' H            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    " E# B" n: |* C+ \: ?; c            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    4 H) B) s& o/ A& A7 P            },
    : R7 R1 c- k3 `8 ]( M- |        write='result.txt',
    5 i- t: x- K$ J1 M3 m( J+ A) A1 z        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    9 |% k3 I+ q4 O& d" l        page=[True,"now_url.txt"],
    1 F, J# O+ T5 l* q        #clean=True,! W1 y' h( u/ R: t
            texting=True,
    2 r6 _: _; u" ^, u& U1 Q        # status="multiprocessing" 启用多进程爬虫! p7 F  q- ?& O, e# M4 `! U; _
            # cpu_count 为启动代码核心数,默认为系统核数一半0 w& T7 r% S! H% _% \. P9 v
            status="multiprocessing",
    % X& k' N6 d1 r" k! H        cpu_count=2,! Q) M& l- Q# G' _! H0 i
            ###) t7 `  [' j* L# X1 b) k& I
            write_SQL={
    8 a: r  C8 W" v            'host':'localhost',0 r. _; P( i' f% I' ~( T: ?& ], h9 {+ k
                'post':'3306',! g: `' ^  j/ v& o8 f
                'user':'root',3 T* b9 d( G0 Y) \1 _5 k1 E
                'password':'123456',3 a( {5 H1 e* x0 X2 P6 s' P' k. ^
                'db':'example',7 i0 R0 A, G1 c) @+ u1 _# C* }
                'table':'example'$ L5 y) @' t# ]7 @0 S3 b# t
                }2 M' R& {$ u4 S9 d5 z& H
    ).run()  T+ M- x9 z$ a8 q5 P: J1 e
    / K8 K; ~" E) ]
    第十二种玩法:异步多线程爬虫7 S' O3 Y" J3 e5 @
    特点:
    9 y+ Z; o% e& E( C2 N9 Q+ ]爬虫速度加快,' w7 [+ c8 Y9 l- S4 `
    异步使得爬虫无等待时间,
    ) G2 R; [5 e0 s  g' V同时使用多线程速度明显加快。8 S, W! V- _0 L9 M, m
    # b8 g! A$ N1 R% {
    缺点:暂无
    & ^2 i8 l" w" P" c" n9 C; |8 w  ~- P/ @! D) k3 O  ?
    :return None7 Z9 W3 C2 ]. ~! u. ~

    ! G: L1 F4 F# v' T7 {. R# w: R; ofrom simple_crawl import request1 W8 r8 `3 W$ b1 b! x
    request.parse(2 o; l$ ]' O! Q! q
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],- c7 W& c- e4 U. H
            #login="taobao",) ^7 r- x0 \7 x4 B+ ^8 y
            type_url = "text",
    ) Z$ H2 x2 ^: @) u( _9 N+ ~        Parsing = 'xpath',/ {# Y% N  @* l  l9 c( b$ X. j
            label = {+ k- F9 A/ }0 h- s1 }) E# G
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],# O: h, \* q0 u9 y" `
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],/ c* \% ]0 z: X. c9 o& b
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    $ ~; Y$ C& R- u) t2 H; p& Q            },
    % b- i" x6 \. d0 m5 D7 Q/ {. C        write='result.txt',
    ; }" V7 z, t+ G& p) K        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    8 W: M0 |+ D6 c3 I! |% p( W        page=[True,"now_url.txt"],. k5 }4 N' b  o  B) g: l
            #clean=True,* a' B0 v9 e3 [. q7 u
            texting=True,0 F1 T5 A* p. B
            # sem 参数为异步引擎数目,默认为57 s  K1 V9 v" D4 J/ U7 X( C
            # 其他参数同上' `0 N# [* q( P4 b( m5 I
            status="aiohttp",
    * M& E$ B  k5 n; [( J4 B9 I5 F        Thread_num=3,! u7 ^7 r: j0 w" d6 N+ e" X0 _
            sem=5,7 J/ h/ Y: \7 }, L
            #### [, r% C: O5 S# Q* p9 b
            write_SQL={) o+ ^$ Z# g" F4 W: s
                'host':'localhost',
    / X8 s' E& H% C# S7 G7 d- Q            'post':'3306',
    $ o: A% X. S! ~5 Q$ E: h' u            'user':'root',9 T" u7 p0 z; z! e8 T
                'password':'123456',6 P( L" |5 H! z
                'db':'example',
    ; |9 m5 S* t- c4 V2 R            'table':'example'
    5 g( H$ ^$ D& a8 i6 r            }
    % d7 Q5 Y, g$ t% E- R).run()
    - P" z9 j0 ^* M6 R
    . ^5 f$ S. R4 b% B) f. d9 R第十三种玩法:异步多进程爬虫* c3 m, {5 X. x5 a
    特点:
    ' \" ]  v* F/ A+ r* m爬虫速度加快,
    ; k% G) w# P: @' L1 ?& U8 h异步使得爬虫无等待时间,' v8 j; B8 ^, u! @, v0 `" }
    同时使用多进程速度明显加快。
    8 {) F+ p% s. x# P5 r5 E3 k) F+ M5 w6 S' ]7 s2 O! |
    缺点:暂无' d" k. X9 |  a& E( _* ?: M9 v
    5 A9 T1 {. V+ y9 O+ _) i4 b! [7 s1 O
    :return None. W  q9 }) }' \" u( o
    % `. o& \# B8 S# ]- U# ]" V
    from simple_crawl import request0 q3 P: L2 t! `) R& z8 R
    request.parse(
    1 O- q# o' @5 L1 R4 ?& f        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    $ j8 g9 r9 F) d: l- r        #login="taobao",
    $ U2 K: Z% \4 c/ t9 ]        type_url = "text",- [4 b/ k$ Z( U" P$ O; D
            Parsing = 'xpath',: a& w3 q1 m/ N, Q7 ?3 U; R+ X3 L
            label = {
    - a: R3 G8 a) ]            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    & W; }; @% O  v  n; D            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],; i) t6 V6 T% M+ }/ ~. k5 }
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    : f* x& v7 G& ~            },  l8 I6 H2 i  a# W, y
            write='result.txt',
    ; U  s5 J0 s4 i# J8 f. a' H        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',! F- e  x7 Q/ U( X
            page=[True,"now_url.txt"],' T5 q, ?; [( g/ I, h; P" u
            #clean=True,8 }. L" x; `: H' [
            texting=True,
    - W) s4 _: Y" `& i% c4 Q        # 参数如上$ A1 m' c8 D5 F- `
            status="between",
    * a& X' J2 G: `3 ~' [; N& r) T4 ^        cpu_count=1,
    9 F& W  t! d% X        sem=5,
    1 ^( Z7 F1 S7 p( z3 ]        ###
    4 w* s4 V: y# _! L! U        write_SQL={
    1 y  |+ l% l; V3 Y" X, }: h            'host':'localhost',
    3 p  D; M4 {) p* t7 ?0 _. n            'post':'3306',$ h3 S2 C  \7 Q" h0 w
                'user':'root',7 |6 u) ]  T/ @* r
                'password':'123456',( G  x! z. O7 {; ^  B( J) g6 i$ E
                'db':'example',& c" ]+ G: M, B3 {* m
                'table':'example'# H' ^* }' Q5 r! }& ?
                }3 I: w3 ?6 x; k# I" U1 a
    ).run()
    , Y8 \3 B9 O! Z9 P- u/ ], c4 B! j! o' g% x9 v9 v, ^: Z5 y

    * k+ ]( ^2 {9 B0 f, m; a$ U: _功能介绍完毕🤞
    + F* o8 D1 D6 w) {" A+ N最后还是希望你们能给我点一波小小的关注。+ ^) F' @; y  k, ]% f/ b
    奉上自己诚挚的爱心💖* v: B: ~: p3 g0 ^8 F3 d
    ————————————————
    0 e; t8 V" g  e4 l  u, }版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。' D- P) ^' e, {/ M) p3 U4 J0 L- [8 @! D7 v
    原文链接:https://blog.csdn.net/qq_45414559/article/details/1060056846 K- b; ]$ Z3 q3 R0 O1 C
    , `8 k# F2 M% {  z  X

    6 W+ F# Y8 ^$ R0 z) Y9 V3 _+ U$ D# ~
    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, 2025-8-18 19:38 , Processed in 0.546755 second(s), 55 queries .

    回顶部