QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4968|回复: 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
    # f! ]3 ^7 N! R2 Msimple_crawl
    3 }* A0 r2 V+ h+ _仅需一行代码即可达到爬虫效果
    & s0 Z7 n6 K! c* O项目地址(欢迎star):https://github.com/Amiee-well/crawl
    8 F& l7 z1 c8 _6 k/ x6 z; X2 ?使用方法4 f* g! f  p' O1 P
    pip install simple_crawl
    : z" z- l- w6 f% z8 a  l8 I, ^6 r) R
    ### 以下源代码为简单介绍,详细功能介绍再源代码之下
    ; i2 b& G& J- S- X5 lfrom simple_crawl import request
    ! [. n) [) R2 y! K  y9 t; {request.parse(
    5 h# y" }' R6 k. d" r        # status 参数为运行状态,支持单线程多线程多进程协程以及联合
    $ p4 ^# j! {, Y! T: q! T        status="aiohttp",2 Q: k5 J& K  O7 {8 O0 O/ s4 o
            # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式
    , O2 x( H; T; H        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],5 u7 A1 ?! D9 G$ _- {; i
            # login 参数为获取登陆信息,如淘宝等网址需要登陆信息
    1 Z1 y3 A( O2 e& h    #login="taobao",5 d2 `  U6 ^/ f0 h/ Z7 h  L) [
        # type_url 参数为返回源代码格式,支持text和json,默认返回text
      N% p" |9 B! m. f    type_url = "text",
    6 ]- C9 A) W* v8 i    # Parsing 参数为解析方法,支持re、xpath和beautifulsoup/ V8 L' ?0 F; \& M
        Parsing = 'xpath',
    ' K5 @) u- X7 }; f    # label 参数为爬虫解析过程,字典格式,详情见下方  t, ]$ J1 i. W- Y) x
        label = {0 h1 ^! G3 E. \& L
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    . u0 F* h. W- f0 o            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    / G+ B! d# f, ]- K% Y            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]; s. T% F" h5 y. T5 D0 |! H4 y8 Q
         },. Y( \) b) u) ^! r3 ?2 ~2 _$ b. H
         # write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱! {8 `; X1 B1 Q1 a/ |
         write='result.txt',6 i" _! Q# E* x+ ?
         # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫/ I! m  j3 ~( T4 d
         next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',) O2 E6 N8 E, z( X' R- D8 }
         # page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫
    # o, D7 B% p5 R) Y, G3 z     page=[True,"now_url.txt"],
    7 _9 Y0 |9 ], @9 Y% k     # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息
    8 r0 \, M) o5 `     #clean=True,
    6 \7 \2 s; s' s1 q$ l     # texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序9 _4 h7 k( D/ Q! @* g
         texting=True,4 z! w8 _7 L; b) k8 K* i) ~$ x
         # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态* H  V2 ]: V1 D# Z" v- s
         Thread_num=3,/ e8 ]6 p; U7 ~" u
         # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态
    * |+ v# o+ Q3 ?! _2 I# }     cpu_count=1,
    4 w% O6 X3 p/ w1 w( m     # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态" `! l9 H9 N( ^2 I2 p
         sem=5,
    + h" t- h& U9 ]4 O9 Q     # write_SQL 为是否写入数据库,默认否
    + }) i0 n8 X% b( J6 T8 \     # host 参数默认localhost
    - ~3 e$ J7 G$ B2 l9 ^     # post 参数默认3306+ _9 r% N, c! Z: ~1 `
         # user 参数默认root
    ! o1 R& q( s4 T8 k1 C! _     # password 参数必填,必须正确
    2 I% B3 K% X1 g/ H5 B6 F2 r     # db 参数为即将存入的数据库名,若不存在自动创建
    % S  T9 M: d( d; g2 `! ?     # table 参数为即将存入的数据表名,若不存在自动创建
    2 ]4 k0 n7 g* H) T; T2 e     write_SQL={( }/ o2 R7 N' `, Q8 z3 t4 ~+ L# x* V
             'host':'localhost',6 d  @/ U) P8 ?2 \/ e
             'post':'3306',* j' E4 ^# M2 B+ \2 K5 d# e) {
             'user':'root',6 `: D" C6 U# B8 U6 r5 o, T
             'password':'123456',) [7 t0 m4 v. }
             'db':'example',
    . n$ L% K7 ^3 z* ]/ i% N# u5 Z3 T         'table':'example'9 a( z+ m# L! k3 g. R2 H. e
          }: X; y  e: c; q
    ).run()9 D3 [* }5 m, Y) U' m' G
    6 p! S& t# N. v  x
    介绍一下crawl参数设置:1 {  _% u% ?" F& r8 Z% K; N

    5 p5 @9 r& D' ?'''" ]* |6 G) o1 q5 i1 w- @
    单行代码爬虫程序执行
    : @8 r% ?9 ^; E$ e6 k! k:param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档& w# R+ h! K$ L$ ^0 z/ g0 w6 ?
    :param url:即将请求的url地址,仅支持get请求3 x, t( W* J" k4 F% N
    :param type_url:请求url后返回格式,支持text和json格式返回$ p& l7 A+ E1 @! J8 Q2 a7 o. D
    :param Thread_num:即将启动多线程个数,默认为1单线程1 _5 Q' I1 v/ b
    :param sem:协程信号量,控制协程数,防止爬的过快,默认为5( D+ q# G; m! P' ^8 d; x: p
    :param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半
    4 v9 ~0 F; ]1 ^$ K:param login:模拟网站登陆,保存登陆信息
    ) R! P: M- Y  c:param Parsing:爬虫方式,支持re、xpath以及bs4方法
    0 X: z' u& h% B7 y8 h( ~:param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,3 ]0 v. w  |0 N6 |* b- ~2 a
                           多次报错结束程序,默认否
    0 ~9 X7 A& d2 J3 w:param label:选择器内容,字典格式保存,. ]; x: ~  G5 z" }! n; V
                         字典值为列表格式,第一个参数为选择器,第二个参数为转换类型2 R8 [- `2 Q8 j6 T
                         第一个参数必填,第二个参数默认str类型. e( H; X: l4 _) s+ Z& C
    :param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否" c/ w+ D: A: {) G. Z
    :param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫# _" O; ~" ]( {) B/ T2 z
    :param page:是否选择断续笔记接手下次爬虫处理,默认否
    4 N' p' G  a$ z:param clean:是否进行简单类型数据清洗,默认否. q7 `- m$ `* K  z
    :param write_sql:是否写入数据库,默认否2 t' z) u) A& u( w
                             'host'默认为'localhost','post'默认'3306','user'默认'root',
    " h6 G4 G3 J4 P4 }5 |                         'password':'密码','db':'数据库','table':'数据表',
    ! e& N; _, G" T* y) y. T                         检测库是否存在,若不存在则创建,若存在则直接插入,4 D' t- c0 N1 n
                             检测表是否存在,若不存在则创建,若存在则直接插入
    1 k) Z; k9 G. @% X/ J$ P" I7 J:return True, _! O% B( l- x6 v* M* Y' h2 @
    '''
    6 O8 R& l6 i) @& R. p  Q' M介绍玩法5 s8 P( b1 H: H4 D$ b) ]
    接下来介绍的均为调用第三方库的情况下运行:
    7 t- d2 g" O1 E1 H
    0 e$ I, `7 o% \+ ^0 {. L. Ufrom simple_crawl import request
    1 B( d1 M% S5 N6 A第一种玩法:输出源代码
    2 ~/ m$ K6 c$ H6 y3 L; X调用requests库进行源代码请求。! |) n5 L  G4 z( W2 m
    + M! x) @* `  {. N' O' T
    特点:0 {* O9 d2 c- ]2 l
    请求失败则调用ip池处理重新请求访问,8 r9 u/ d( b1 C" W6 j3 K
    出现五次失败默认网址输入错误。$ u$ J7 z5 k0 R1 ?2 `9 t, V
    支持text以及json字符串返回。默认text。
    5 g0 `! R3 k$ I- c% [+ h  _7 ~; s5 H0 M2 A# H
    缺点:
    2 u# s& `/ c% e  f9 y7 p4 o! s/ f& a暂时只能进行get请求,不支持post访问4 B  @  A6 t% U0 t; L

    $ l" M4 }( e2 L- e:return text or json# f8 K; x7 ]6 _( x7 O
    % y- }" ^$ ]: D6 x
    request.parse(. M7 n1 {5 I/ J# y
            url = "https://www.douban.com/group/explore",6 Q3 ?+ t3 s; l, N) G" m
            type_url = "text") @/ f1 {! M/ {& X& t
    ).run()3 q( R! d( m  G4 X( t
    # return text/ t7 N1 H  R  H, h

    & ?' t- o+ s( m1 i% J) F/ j" M! |第二种玩法:模拟网站登陆并保存信息$ P) m( O/ j- O/ F6 X
    调用DecryptLogin库请求登陆访问。
    & `9 f7 f3 b! y+ r8 t& s
    0 F% V; H, Y: s. W* }, h& i0 z. wps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源# |+ z5 }/ L; D. J
    在此放出文档地址7 k3 c$ x. L( T
    DecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/4 x. e/ `+ e4 O6 B. b
    0 d3 e+ x3 P9 M
    特点:
    8 J; @1 E7 w* s5 \. A- z* v将DecryptLogin库中二维码继承到此库(非二次开发)
    3 Q. }5 t3 }% p  q支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆)
    , D* z- \- p! @9 K保存session.pkl信息到本地方便下次登陆运行
    * B! r+ P5 K3 S+ o9 R3 @1 P" W* Q) ?& Z  I
    缺点:$ h& D  m3 S9 ~' B
    session.pkl登陆信息过时无法自动删除。
    4 k& L7 j* K" ~/ D9 O. W导致下次登陆疑似cookie无法正常登陆。. M" _6 }, ]4 z, x+ Z6 C, w

    $ q/ C$ e! ~, \# Q( @* R:return session
    + [$ ?0 `2 f+ w- ]. ?; b5 W* @$ ]0 ^) W
    request.parse(& y9 p0 V# ~1 j  u( ]
            # 臭不要脸的推广一下我的店铺
    % m% G3 |) N( @, n        url="https://shop574805287.taobao.com/",
    ) G4 }, Q  ?. j  L( k* h: d        login="taobao"7 @3 p& m' e: I6 c
    ).run()& S1 n  S$ ^9 S" s' B6 T' A
    # return text# I0 O6 K6 @$ x: i1 Y

    # y0 f1 E6 \4 g第三种玩法:爬取网站信息
    % M4 |$ S0 u3 m- r) G# j4 n6 u  `爬虫库自然少不了爬虫的过程* @- K% `  ?- n3 a! R2 H
    3 Y7 H! E6 X4 d. w
    特点:9 \4 M* r0 }& g  e6 t
    支持re库,xpath解析以及bs4选择器。. f/ x% T! X- j% l
    爬取方法为字典格式。单方面输出。; Q. k( T; x, ~
    字典键为保存的字段名称。
    5 h" d7 s5 a1 ]4 @% i, I字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。. A  r  q+ g; S& l9 r
    5 [0 B4 C3 @2 {3 h
    缺点:暂无(等待小伙伴们发现)! @: N# Z8 {- m2 I* o7 j

    # j* k6 G- r% E; ~* J6 y' ^- N:return reptile_results
    $ X2 p! C9 _! e# ?) B) l! J& u9 @' ~, S. g0 S
    request.parse(
    ; _& {" r- a3 s* p+ L% @        url='https://www.douban.com/group/explore',1 d: P0 M) h9 Z7 d' ~5 G
            # 字符串格式,选择器方法。
    $ z: H$ H% D* C* z3 ?4 Y    Parsing = 'xpath',
    / x) t. y2 o# }9 j$ R" E8 m5 x    # 字典格式,参数如上。
    . h, S6 n3 d/ K5 H9 ^% d5 f3 t    label = {
    ! A" U" P2 Y$ J: s. R        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],, f& R3 }3 c/ S. p7 H9 j; _* a
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    8 ]9 U2 B3 {* n# o0 o' m2 i  ~        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]8 o$ i7 v0 L$ K5 K$ ^0 T
            }2 k4 y3 ?% k, m& C3 ^5 [7 ]  y
    ).run()  Q3 m: E7 g7 W: ]% x/ R
    # return reptile_results(list)
    8 g& h9 {6 W  J+ w
      o. d* ^/ L. R4 O0 p第四种玩法:自由保存信息
    0 |6 M5 x+ s# u$ v$ {0 G1 C2 M目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。* z! e) g& v$ F2 f
    - R* ?# U/ u) p: _# G
    特点:/ _& C" X2 [1 g3 e3 [$ L
    写入文件均为数据格式传入文件。& x: z4 p) r: p) A
    且输入格式规范方便阅读and省事。
    " f  d, c7 b6 j9 v9 i  `7 D) G' H" ~' z0 L
    缺点:
    6 E4 o: ?; [% U# ~, D1 p, l1 Z保存格式仅四种,: m! N5 }$ x, e5 ]4 d9 t
    不方便用户之后读写操作。7 j- i2 c2 e0 G" e# v3 D
    + j- Q* G7 x# C3 q5 Q
    :return file* [" H- H$ X* R) `3 r+ s/ y
    9 }) N, p2 M  J& Q3 S
    request.parse(0 W! B# R, X( @! `& b1 }
            url='https://www.douban.com/group/explore',  L% N. b" J3 d2 L/ D
        Parsing = 'xpath',
      h) O5 i$ g8 @: ~6 v    label = {
    # [2 S8 Z+ R$ c! P  {        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],' i1 K) O0 D- Z" c* A2 Q. V; v. s
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    % l/ z9 ^: q  i; S9 O! Y! `- k# ?        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    4 ?9 i+ `- T6 P% c  U/ D        },5 ?: y* \& _$ r0 m7 p$ J8 h6 r
        # 字符串格式,具体保存位置填写
    " ]2 F9 U, Y6 h' V. u2 @% `% r    write='result.pkl'
    . u* K; c$ S5 ]! e$ s).run()$ Y1 g; l6 \4 a5 U6 [* m# ^+ ]2 J0 Q
    # return file
    % S. s/ H: Q% t3 l' y  O% O7 y) K
    第五种玩法:读取下一页 url 地址继续爬虫
    5 ~& {# \& }( D; ~这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~4 i( A" R! n: G

    . ^5 T4 l7 q! E* g8 I特点:6 t5 `: q( }" d3 q
    继承之前的Parsing参数选择器选择方法。4 u2 q) }' B! H6 a) b& p2 }3 K
    在这里可读取到解析后的下一页 url 网址。
    0 r, u; Z7 i' f$ J2 e方可继续进行爬虫处理。方便用户使用。# k9 B; r; d% \2 ^3 y; ?0 {% T
    , Z- a. }9 w5 C# Q& U4 B
    缺点:' n, g/ F2 N; [! s: E6 g
    若爬虫时下一页 url 地址改变,便结束爬虫。
    4 h" u8 l% t' z% p% Z  B只能爬取所给 url 地址中的信息。. e6 h( Y2 Z1 _
    无法进行某一界面的多个网页爬取返回。7 U8 J8 Z; Y8 b
    造成访问页面单一流失。/ T1 B0 O5 h- m, I

    9 V+ G* C; F4 M2 j. w$ y:return None
    4 O3 K9 U1 B& V# S2 i' P# Q9 A, [  l, x0 G+ G% p
    request.parse(! c3 E* U$ f4 T. p" f+ V% m- W
            url='https://www.douban.com/group/explore',# u% G1 s0 q. o. b% E
        Parsing = 'xpath',/ e, E! ]- j4 T7 F/ j( q, n& s) Y" y
        label = {
    - j8 D* X/ {1 K' ?6 U/ j; c/ f& K        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    + w; T- L+ U3 e" Y- s        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],% b& G3 M" R) _3 j9 ?, ]
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    5 @. `$ r) C" G8 M* ?* w: f        },
    8 Z* O0 o/ h* K2 }$ A    write='result.pkl',
    : V) Z8 r8 _$ F8 U# I& t    # 字符串格式,根据Parsing方法继续请求下一页a中href
    - I3 Y/ F8 r) |    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',! S+ B2 u% x1 ?; w, j5 m+ O
    ).run()
    % [+ d5 [; _" M  j# }# n/ A, `# return None 1 ^- M9 p# i5 g) K" Z  e

    3 s+ s3 {, J6 K7 U1 ]& z8 n/ f, \第六种玩法:爬虫网页保存
    5 H3 B/ V# z, L+ H听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!& l$ s2 p0 c. K

    & M. H8 S8 Y3 u: p* b& N& v2 g! a特点:; [  l+ v# t4 j7 j2 O$ Z' ~- Q
    持续输出断续笔记。7 r& ^# U/ X( o3 ]
    将此次爬虫的 url 地址保存到一个文本文档内部。# U1 M4 g. [9 Y. {$ c
    下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。
    6 G( v* b4 J& ~5 }- h/ j$ _, `: ~1 r) u5 p( B8 K" w) s7 h
    缺点:
    , b2 d( M( @( E读取内容不单一。
    3 d5 m& C7 S. R/ P  ~导致下次爬虫无法正确读取上次爬虫留下的痕迹。! w/ J9 \9 A$ x
    7 Q9 P- h- K- [
    :return url_file4 V# s$ Y/ |7 v$ Y* f, |6 P; w
    . X: B0 Y: B3 q% h; O  ~
    request.parse(
    - ]. M) g2 S* R& k  ?    url='https://www.douban.com/group/explore',% ^0 l) \/ G2 C& j
        type_url='text',
    $ e% I' @, @, |3 |6 p, ^    #login='taobao',8 `) j3 ]# s, q! Y3 Z
        Parsing = 'xpath',
      V" t, s8 T* x& i- y* N- Z    label = {
    ) {  h7 ~. S* C: D$ ?% C, R        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],0 r/ J1 N/ M' {3 B! ?, u1 t
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],4 P4 v2 [& D# \6 q2 Q
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]- K/ a" n" B; T. F# x
            },
    , g( i! V! [' v1 l" G    write='result.pkl',/ r% G& m5 K6 g' g  d# z
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',& p7 u: m/ d+ l) S& Q% I
        # 第一个参数为是否需要断续笔记。
    7 X5 k8 b7 M8 E    # 第二个参数为断续笔记保存位置。  w, P' V3 v  w1 e9 _) I" B& ]
        page=[True,'url_page.txt']- O& ?$ @2 e. J$ S
    ).run()
    % \  b+ i2 R' u# \% V4 m# return url_file
    * z! K( t9 ^6 p" M0 a, f( \2 F5 X; b% F9 H$ A
    第七种玩法:简单数据清洗( O! Z/ E2 d0 {4 z" H: J2 v
    数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。# r9 F' ^+ x7 b8 [$ Z- y

    1 u8 ?  v4 C8 ^; Y特点:
    0 n9 [5 ?+ Z8 x; h本人曾写过一个底层数据清洗。# {, t6 C4 L. @  Z+ V- N
    能将列表格式数据进行归分清洗。( ?* L$ [- Z5 ]$ R" D
    主要内容请参考另一篇文章! y7 k, z! W$ i* v1 O
    如下连接:数据清洗
    - b$ y! u- j$ B6 s6 Z) D  ^/ @% @( X" h" h! r4 l0 e( S9 a
    缺点:
    . z7 p6 d5 l' d  N6 \' L数据清洗格式简单。
    ' m: x  s: _. [! H0 A数据清洗内容单一。; @8 w( P$ @* |, b
    无法完全做到绝对清洗。
    . S9 M* }$ h/ ~1 c+ E有待改善。6 e$ }$ M& d4 `5 t
    ! l. r! u: A6 j
    :return keyword_list, value_list
    ( W& y- ?" T! C% ]2 J7 y
    " Q$ X/ G3 N( S* S1 I4 urequest.parse(
    ' d2 l, c4 m, }: G9 Z8 n" a    url='https://www.douban.com/group/explore',$ W) ?/ ~) Z. _# @  _0 O
        Parsing = 'xpath',
    ! b+ n9 `: Z# @    label = {  M# h& C" i) M8 r
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],5 }, j% i) z+ b6 F( o
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],9 t4 C) j* q3 T; h, U3 ~
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]  ^; t- j0 F1 R1 H. J" n
            },
    - X# R+ {+ m  X" t% Q    write='result.pkl',$ k% y: x6 k2 s, D: \. ?
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',/ X/ H, r: k9 r+ D2 h& P' I
        page=[True,'url_page.txt'],- L5 O- s5 \, }7 P% `/ U" e& s( v
        # bool类型,默认不清洗
    8 q$ z' f! m9 P    clean=True; ?9 `7 q. Z* f5 l4 ^
    ).run()  N0 F& j0 M7 K1 }0 |& F1 e9 h
    ) C0 d! w7 E1 o
    第八种玩法:爬虫存入数据库
    9 q- g. d4 f9 E0 H& K) f存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。6 {/ i+ K9 [2 W6 J* k
    4 b( q$ f8 P4 v5 N8 r! X
    特点:
    1 ]0 L  n* W5 y  h, l: p信息存入MySQL数据库。7 u( X3 _& t5 M( @6 O
    可连接docker远程数据库。
    5 m: z1 i& N/ a3 D9 I+ Q数据库的库名可以不存在。; n: W% ?! ^; ]' z5 \0 N9 ^% s
    数据库的表名可以不存在。
    ) s3 W) r  t# @/ U根据之前传入字典键与值参数判断表类型。
    + q- R  \- ]/ i9 |. h% \自由建立数据表传入信息。
    7 _3 _: w+ v" F2 ?( x8 e- E, V( U5 P/ S. L0 G6 N* L( k- O0 I
    缺点:) l. B" a9 _4 Q7 H4 q
    仅支持MySQL数据库。' q: x0 @7 P: O; o1 [0 B- B, l

    5 E+ D* N* Q  y9 M:return SQL! g$ U3 M2 Z* H
    % L9 ^& g& v% R+ L9 l
    request.parse(5 t$ V+ Q  ]. o( N! l: d
        url='https://www.douban.com/group/explore',6 R3 B* o6 `. f  L6 J; i
        Parsing = 'xpath',* f+ K- t6 h  s. J% S( E5 }9 J) I
        label = {7 X& M% v5 z' y' z; f0 O9 p" ]
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    8 c& F4 W$ i4 `        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],: h+ L9 O* d- s/ ~2 p/ P8 J
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]# X3 Q! w8 q" g2 y6 }
            },  m8 c' N( A8 E  D% O- ]
        write='result.pkl',
    % M5 O2 H, I# o# u# O0 m" a3 I    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    " C# q0 h# O! I, A    page=[True,'url_page.txt'],
    # J/ d6 w" u' U: ?9 u8 X! ^    clean=True,
    0 k+ c4 k0 X1 k8 U! u9 a& m! w9 O    # 字典格式,
    / p, [& p3 I& \: V& s    # host可有可无,默认localhost/ l; `$ G/ P4 x5 {. s# s- G1 Y  t
        # post可有可无,默认3306
    ) C) P2 s9 B$ G1 f) s  t8 {    # user可有可无,默认root
    4 b; ?8 E8 g3 B/ \    # password必要参数,数据库连接密码
    & K6 n+ H) d# t9 n( q" x* t    # db必要参数,数据库即将存入的库名
    + m+ P6 c! y8 l% u6 e    # table必要参数,数据库即将存入的表名/ q# i& s6 `1 z2 o, b1 q" O
        write_SQL={
    3 c$ {: m# a1 l+ Y# V. y- }        'host':'localhost',# r9 _/ S0 h% U# s/ h: Q- b9 w
            'post':'3306',3 X6 }5 w6 g- q. Z) o! }
            'user':'root',; F3 g5 p( E. F4 T* g# V
            'password':'123456',
    ; x  H) G( W& p" b        'db':'example',8 L+ ~3 Q9 E+ P, J/ ?: O
            'table':'example': Y! T/ f8 ~! V& F+ M
            }
    $ x: L# F( Z  [: O( s4 O/ k    ).run()
    . s3 w+ R3 |  i, m& f7 {3 }% p$ ~: Z- Z! C0 J* C' ~% e. c- \
    第九种玩法:重新启动爬虫$ c! P3 D8 {  f5 p0 l6 o; D
    爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。
    ; u9 {% n3 X8 c/ |1 @* f5 J- l/ N1 i+ f' q$ d3 `7 G
    特点:4 B5 j) u- d( z9 y- P2 B: s
    检测报错重新启动爬虫
    % V; ?5 N7 D9 C# z无需手动处理错误信息! p; Q( \4 c; ]+ k6 N- {

    6 X/ F! _" e8 ~/ C! x缺点:
    & e3 Y0 f" Q2 ]- ~! S. M无法收集子线程错误。
    0 G7 L) d- ~$ i, ]
    ; ]- |$ g3 X* D8 v6 C:return None) S1 S5 {+ D  Z/ F3 j

    2 K6 ]- T& h8 Drequest.parse(, S8 a/ ~9 s  X
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],- h1 H4 W8 G/ L# b- |. R# F1 g
            #login="taobao",
    1 Z' c! r5 K) w        type_url = "text",
    0 @4 x1 m, e3 t4 U  [        Parsing = 'xpath',
    ( V3 K2 u0 G2 v* Y+ R8 E( w" L5 |        label = {
    ! S: \8 [+ d) _1 R8 \            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    1 @  ~" I" l( q3 ?            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],- @$ V' |8 Y& T1 e! w! _: L
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    : l3 ^3 l/ {" t$ @; {0 Y/ u            },
    3 g* ]$ Z7 d% n& |        write='result.txt',6 ?4 Q& {) B: S# x0 Z3 S, c
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    # ]4 {' x6 W; z6 N+ d        page=[True,"now_url.txt"],
    ( o% n7 q/ L( M( G" Y, \- p/ {        # texting 参数为是否启用连续爬虫
    9 e. u& N2 @% s& v3 H# X        # 爬虫程序异常报错后重新启动爬虫3 d6 T& s# o# d0 j: H( a
            texting=True,- F, f+ E. M6 [% v: D# Q' p
            ###' @  g  ]- ]5 v
            write_SQL={  K8 Q, }% \6 [" g2 I8 `8 N9 R' f
                'host':'localhost',9 O( b3 w4 b/ v+ S3 E
                'post':'3306',
    ! ~! C3 T6 g$ c            'user':'root',
    . p: i( p4 c$ l$ Q            'password':'123456',
    % c# C* ?- \4 {$ P  m            'db':'example',% O4 V! o  G) T$ H3 r
                'table':'example'4 m2 G3 s6 y, M- k7 i# K* f" s
                }
    ( B+ u. @( B$ w3 \( f: e7 `).run()
    5 f, z8 m8 f7 b+ h" ]& `( @, y/ ]" g- E( n- @
    第十种玩法:多线程爬虫
    : Y5 g; e- L6 l8 ]" R# ]' [特点:
    8 f  T# T' ~* S* ^爬虫速度加快,' C; ?! z; \' ^2 X  a* G+ J
    更好的利用了线程。9 k( `$ p+ P% `! J

    & [6 b$ q" E9 V) |缺点:暂无, |% w2 n2 g6 m: I. `9 b+ I. Y

    # J. S' m& w  W+ m% X2 Z; {- o:return None
    ! Q# N0 E- N1 N  o3 h1 |4 B0 v% {% ?5 `/ q' V
    request.parse(
    , q7 ]+ I  }& _9 w" s, G        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],5 q3 H- w8 s! E
            #login="taobao",
    5 D- H  K8 c/ Q0 h2 p" H' H( ~        type_url = "text",# d& O$ r, u2 F% W, b; A9 x! Q+ p* h
            Parsing = 'xpath',6 F, `9 R+ O) X' W; V3 j5 V
            label = {
    7 Y6 E# ]. E) C4 I6 r7 Y; k# D            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    ( K3 k5 {$ o1 z2 J            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],& k: [' ]$ a  x
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    ( V. l, t3 i9 v; Q1 H4 W( o+ H            },
    ; H) D+ I, _: {) y4 c        write='result.txt',# f4 }* X  o+ `8 [: F3 U
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    5 U9 c; j. }) m4 b1 W" u0 f  u        page=[True,"now_url.txt"],# I" ^# L: ~4 O6 U
            #clean=True,
    4 `3 N' Q- @/ H3 H( Y0 H" k        texting=True,) c9 L5 c4 Y- e; m6 m& ?! x& F
            # status="threads" 启用多线程爬虫
    " t* F$ L! M" I# n+ x        # Thread_num 为线程数目,默认为1 单线程# L3 `  R' \: U2 Q% d
            status="threads",
    " }  B6 W$ P( v1 ~5 B! o! h+ o        Thread_num=3,& S1 r8 M1 I3 i0 g
            ###: a. U. W9 |, a# b
            write_SQL={
    " r; t4 Y: k6 {' o            'host':'localhost',1 e2 [: ?" U% {, r/ v
                'post':'3306',
    & ^" p. v4 c$ m4 M: o5 X  B            'user':'root',
    - E' v1 S6 r$ h            'password':'123456',
    + o6 B5 b8 n5 h            'db':'example',
    " N# }- Z- E- C  e, V# ]8 h: _+ C            'table':'example'
      d; t6 e8 h7 `& G) s( R            }1 M( ^$ L8 X; P! O; ~
    ).run()
    7 L" j$ f- I" ]9 _3 U5 I5 _% \/ y5 V
    9 Y( Z7 s+ Y6 \- o$ O+ u5 O第十一种玩法:多进程爬虫1 C2 R9 r) [, h# `' v" I9 @
    特点:  Y$ c" U. L, w0 S+ I  Z$ O+ a- ^" v
    爬虫速度加快,
    5 N: g! @/ F6 I8 e* o更好的利用了进程。5 x  E  E. q+ d, Z) {) N4 M
    # V8 t8 s: n- z( H, P
    缺点:暂无
    $ G/ T/ |: _0 ]. S0 |" Y& J! S" c
    :return None, Y3 s( N* w- `6 ]# f6 [" r
    - u% C0 u* v. \: O3 z
    from simple_crawl import request2 x- T& J* c! c- w. w9 \
    request.parse(
    0 F; f. ?' F2 {1 o        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    3 J) f+ u' f6 @0 |& J: T+ y; c4 C        #login="taobao",
    7 `& \3 a  B  s- P3 s        type_url = "text",# N8 q$ B/ i* `7 N2 d
            Parsing = 'xpath',7 ]4 H! b" W  a) ^2 L8 G( E
            label = {" `# n) i- c" E+ T2 l7 Z  {6 y
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],9 J5 w6 ]' h4 _' f
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    7 w6 L) q. y/ d7 y  O            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]& c: I( m, y8 g/ G$ [/ N; j5 A$ ?. N
                },
    / O8 J- e" D( c' Q2 q0 H* K% z        write='result.txt',! V9 \2 \' C% N7 S
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    # E& I% n' N. Y4 H, U        page=[True,"now_url.txt"],
    + r5 \& g! x  K4 A6 k# N4 }) a0 r        #clean=True,
    7 r& Y! v2 z' k; b. `        texting=True,
    4 s: i% `* s+ |+ S        # status="multiprocessing" 启用多进程爬虫6 _* _6 w( s: k# |( Z! }
            # cpu_count 为启动代码核心数,默认为系统核数一半
    " M. U- m6 K- q        status="multiprocessing",
    6 s" F: w- x  @1 e0 B  F4 O1 y        cpu_count=2,7 @& C+ S1 Y4 `/ M! s5 C5 p- j# F+ M
            ###
    8 c. R' n. W, P        write_SQL={
    ( X0 N; }- T- N9 w* ]8 _4 L, u" Z  O& |            'host':'localhost',
    + \6 l; G7 Q6 o2 j            'post':'3306',
    8 S/ ]1 t& x; _8 w: `            'user':'root',7 h  R" F: L9 b: C3 V
                'password':'123456',
    - H6 J- `/ @% l7 o            'db':'example',
    $ w0 [; ]: e" E' C" E' P            'table':'example'/ D6 e/ L3 @0 ~+ t
                }
    % y; G4 o2 r/ B5 W3 g).run()4 k$ y# f( x  {) N
    1 \0 D4 g/ @  ~  ^$ w$ \! o
    第十二种玩法:异步多线程爬虫
      ]1 H! D5 Z; |特点:
    & T3 d0 X/ E6 }$ s# S爬虫速度加快,
    7 s. _+ H& `' C- z7 S5 t& V0 b异步使得爬虫无等待时间,( z$ V6 R# S# w1 m/ x2 S
    同时使用多线程速度明显加快。
    * C/ L* i! Y* x4 c
      R2 U9 D" ~" [  ?4 J- ^+ o缺点:暂无
    0 B' r* q! q  A3 N) Z! I5 N5 D8 ]
    :return None
    - U/ V$ |+ H  ^) c1 k* i! B& J8 z0 h# X
    from simple_crawl import request1 O$ U% H8 `- k
    request.parse(# Q. Q2 W3 U/ @9 ?2 U
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],5 ^& @& R' Y. D9 O! W
            #login="taobao"," h  x* U9 t  X0 {" x
            type_url = "text",
    ' m0 F* F( x* }4 X1 w1 S# @5 k        Parsing = 'xpath',
    - q/ [3 B" l  w- n$ Y        label = {
    9 c: f( \: [! s. _: ]& o+ s" s            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    $ |9 ~! h4 g/ Z' C: Q1 w4 T            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],+ X* F) U3 J* E. P5 R- B2 N: s% {
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    ; ]  f- @. U3 m' h) F# V' J. w            },5 X1 y3 w+ r2 h5 k$ S1 Q
            write='result.txt',
    1 b6 {( Y* s. ^! `  X        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    2 P/ ~$ U- V# d. Y) X% V3 v2 Q        page=[True,"now_url.txt"],2 j/ y: b: ^) v) U
            #clean=True,0 e6 z9 p' Z5 U! l
            texting=True,
    1 C. W; e  \( z7 r$ a# H, X" q& U        # sem 参数为异步引擎数目,默认为5) d8 B3 }$ g& ^2 c& t1 B4 o# N
            # 其他参数同上
    1 X/ a: \& a/ n  Q: r        status="aiohttp",1 t) O0 f9 ^1 |6 V1 J: ]' I
            Thread_num=3,
    ( V/ @! |' W0 O0 C" u        sem=5,
    - S6 `' b; H0 |( a' g        ###; j* T$ S. a) ^  _- _1 [: H
            write_SQL={
    + R0 h" c# c$ p1 ^, p            'host':'localhost',7 `# L, Y: h; X7 ^$ u% Y
                'post':'3306',8 u0 m% x; B2 @  a: J, L
                'user':'root',
    ( Q  E$ ]! f: }            'password':'123456'," r$ q! D: g" ?
                'db':'example',( D2 v8 p  [2 y. K3 x' S9 ]1 u
                'table':'example'
      f+ w  Q& G- w- T8 h( l6 J            }, Y/ c7 s: b4 \* a
    ).run()% @$ M/ P8 R9 j+ P
    ! i, y' V- y  r7 c9 i  ~
    第十三种玩法:异步多进程爬虫0 Y+ k( R) V& X/ o
    特点:" W1 W6 \4 o$ l& H) }6 q
    爬虫速度加快,
    . T$ T9 N/ ~8 l* o- `6 ~- T异步使得爬虫无等待时间,$ ]0 |' Q4 S' Z
    同时使用多进程速度明显加快。
    , I  r/ p  R3 d) a6 Y2 N" Q. X4 F( l6 i: }0 a( q5 z
    缺点:暂无- }2 Z$ p1 c! U, c

    . P. g8 S- y8 Z# q+ ~:return None, L" T6 X6 y# U* Q

    ) F/ X0 D! p2 |0 Q" A/ I% S6 Ffrom simple_crawl import request
    & Q0 |" R# h$ [' i- Crequest.parse(+ W8 D2 A3 E7 p- Z. N7 B. {
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],1 T- O- p! B& T/ p: `, ^9 z+ J) Z' [5 D
            #login="taobao",
    9 \4 C8 H- c+ P' |, S7 X        type_url = "text",
    ' R1 f2 d+ q0 o, f* I- g8 A4 }- K        Parsing = 'xpath',! s( x+ N* u# q6 `: V0 m( w+ O
            label = {
    1 c+ d5 j1 s# s: Z            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],9 O$ c; z0 ]! Q  s
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    * Y- f; ~$ v# T- p& z  x            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]) j8 r) E# |6 X  z
                },. X) S$ B' t; [* K/ H3 x
            write='result.txt',5 r" h* H5 i! I5 w* \' Y* N- i
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',, Q' A$ i5 [4 ?' a# U
            page=[True,"now_url.txt"],
    ) x# |5 `5 E% c, V- t        #clean=True,
    5 N4 \+ `- g' c4 D        texting=True," S! p, \  N; p  C: ]( L( k
            # 参数如上" t& q( v0 k8 h# P
            status="between",
    + K/ s+ o) s1 c: j        cpu_count=1,
    1 u0 Y7 n3 G+ z2 h+ b' M  k        sem=5,# o4 y4 z  g4 C
            ###" ?% V! C# m$ U6 a& V
            write_SQL={
    2 n# y  ]) F( e            'host':'localhost',1 S0 R  b/ B: w1 _+ k2 k
                'post':'3306'," a* S9 o1 b2 c- a
                'user':'root',
    / r6 I& K0 S- D1 }& C            'password':'123456',* {: `! r% b, }. r8 z4 Q6 _4 z2 _
                'db':'example',
      Y: T8 k7 @$ Q2 h7 c            'table':'example'
    : ~$ W; C( C7 H; Z8 y) R            }
      {2 a0 G/ U4 Z0 E4 z' B; ]).run()
    9 k" _. m% n2 r* D, N' \8 L+ t/ _8 {8 y( b+ V; F: A
    % r: G$ d2 q" |2 `
    功能介绍完毕🤞- E$ r& r2 R, [; f: B/ u
    最后还是希望你们能给我点一波小小的关注。6 U3 u% c" }2 o3 b) [
    奉上自己诚挚的爱心💖
    ' t1 y) F4 B: f————————————————
    % V) T7 `7 |6 |( Q* r+ ^版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    " w$ l- a, i, f3 n' x原文链接:https://blog.csdn.net/qq_45414559/article/details/106005684
    ( g& F7 O2 I  ]
    6 x: s& X" \' Q) k3 G
    0 O5 [- ^( e  N( c6 g( k$ n
    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-11-17 03:04 , Processed in 0.736551 second(s), 55 queries .

    回顶部