QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5622|回复: 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
    7 R% z" B3 q; v* y% w$ Bsimple_crawl
    ! v1 ^$ w  J0 f6 S: u5 z# @8 T. F仅需一行代码即可达到爬虫效果3 w3 a/ I' Q4 z$ [1 B4 ]
    项目地址(欢迎star):https://github.com/Amiee-well/crawl5 C3 h% P! z, @' o8 i
    使用方法& E& ?( B1 H: k( R+ I& H4 V
    pip install simple_crawl1 U8 G  _2 E8 b! W0 |+ _1 U

    ' R4 W" m: h* y5 r6 g### 以下源代码为简单介绍,详细功能介绍再源代码之下7 e: C( Q, p5 k' U8 d* v* F" u
    from simple_crawl import request
    3 ?0 h) a* W& c9 P: y) ^3 n0 S$ drequest.parse(4 e/ r3 }" Y" r% {- {
            # status 参数为运行状态,支持单线程多线程多进程协程以及联合; M! W# d# ^7 b/ B9 d- _$ c
            status="aiohttp",
    ; h" C& l" B  W0 s1 j5 j; Y        # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式
    ' N, \% h% V9 c+ n/ w% ^        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],( L6 J' }' a1 w  s# L  `
            # login 参数为获取登陆信息,如淘宝等网址需要登陆信息
    ; i& W/ J8 @2 e& z    #login="taobao"," j7 ]* Q$ Q) s% n  z1 u8 Y4 T. b
        # type_url 参数为返回源代码格式,支持text和json,默认返回text+ g/ C$ s, k, n6 |2 c4 f, `8 I
        type_url = "text",, _, D% b1 }( n% U8 Q5 ?- Q/ m( l
        # Parsing 参数为解析方法,支持re、xpath和beautifulsoup
    4 V" ^( ]% }, ~0 @5 ~0 C2 c    Parsing = 'xpath',
    : v# j7 o! o& W! M& _2 s. e% k" Q& [9 `    # label 参数为爬虫解析过程,字典格式,详情见下方8 v  p+ s$ w; m2 y6 e: n
        label = {
    ) c/ `2 T9 w* t9 t% j" T  O            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],7 I9 v' `1 v; E& }  d5 ]
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],* N( T8 W+ L) X7 J* k" @9 E% P4 e
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]- G3 M6 f7 X. @0 B$ |
         },/ I8 z/ s1 T, y& n, B
         # write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱9 d) R5 G9 E+ T7 c4 {  @. F
         write='result.txt',
    6 {7 y  k/ B1 `     # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫
    9 L' M5 e" q, u$ @' s0 T7 Q  V. M     next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    / M/ ~* ~9 y8 Q  ]( r. i: C     # page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫
    5 H$ f7 H+ k: Y( B( q     page=[True,"now_url.txt"],
    ; Y3 \" U. c% b  w     # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息
    * V5 v5 c4 @1 \  C  i     #clean=True,
    - W  t1 v6 n6 s: A8 b2 b     # texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序/ e2 X( K5 F: h
         texting=True,6 p1 p# v- z) q
         # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态
    0 I3 H& h1 B' Y4 u     Thread_num=3,; x' S0 d  c% F# A' X3 S" `* i
         # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态
      a8 u; D& b# R$ V' _7 [- ^( @; _     cpu_count=1,, @& j5 Z2 }7 \6 \" O
         # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态2 W! X/ Q2 q% Z% f7 D
         sem=5,
    : {9 ?$ _8 m6 ~/ a: y& \  r) T     # write_SQL 为是否写入数据库,默认否
    4 s7 K4 G$ o$ {3 g/ n" [- }     # host 参数默认localhost! k, k/ ]0 G' o
         # post 参数默认33067 m, C# e' g, L5 P
         # user 参数默认root
    9 a5 S$ B( l+ W1 _) u9 V1 r! g     # password 参数必填,必须正确( ~/ M" Y3 k0 ^' U7 M
         # db 参数为即将存入的数据库名,若不存在自动创建
    0 D( Z; s0 n5 j" _, B0 U     # table 参数为即将存入的数据表名,若不存在自动创建1 \( }  n5 d. `% e
         write_SQL={% S$ D9 A9 _; H7 H4 c+ Q2 ^5 q
             'host':'localhost',  B; r- V. w4 V: f  ^/ V3 h
             'post':'3306',1 m# v; L. d4 Y( W! L8 Q
             'user':'root',# s- M" K" x* M& |7 {5 U
             'password':'123456',
    5 R8 t; G! O- ^5 U$ U# P         'db':'example',
    ! |* M3 H) v4 n6 k         'table':'example'
    $ G: K) ?4 E/ t      }) Y$ i/ o6 ~- [. u8 e4 ?
    ).run()
    ! L' H6 U! j8 w6 J9 e0 {- w
    5 x: r3 d$ L" e7 n, ^介绍一下crawl参数设置:/ r3 m( C5 P6 ~8 _9 C; }5 r3 i
    4 p! a$ s4 I4 j+ G
    '''3 d/ X$ D. E) a9 N5 k9 Y: \
    单行代码爬虫程序执行; B& b7 M, C5 y& h
    :param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档& T7 P8 m/ f9 J7 r* |6 `+ g
    :param url:即将请求的url地址,仅支持get请求
    ' B5 V/ F6 O" g( A+ g:param type_url:请求url后返回格式,支持text和json格式返回( B- r( f8 |: L
    :param Thread_num:即将启动多线程个数,默认为1单线程4 @* w% V# x9 b  s5 r
    :param sem:协程信号量,控制协程数,防止爬的过快,默认为5) P) p+ ?" g: }" A
    :param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半0 c6 K3 t. K" |% P2 @- n
    :param login:模拟网站登陆,保存登陆信息
    % i- v: p! k8 o:param Parsing:爬虫方式,支持re、xpath以及bs4方法: i/ n. w0 S& j) F
    :param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,
    + I8 s, T  U+ y) y2 x- f) o% Y                       多次报错结束程序,默认否
    3 I8 F3 d. E; n0 a:param label:选择器内容,字典格式保存,0 `& p, ^$ E  U; ?
                         字典值为列表格式,第一个参数为选择器,第二个参数为转换类型
    # O) O4 b  u2 V                     第一个参数必填,第二个参数默认str类型4 I5 l3 w2 }6 W2 N
    :param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否
    $ l* ^5 A  h2 I% `( c, l( u3 _# T0 [:param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫
    % y: W) N  _3 N+ i5 ~: L6 _:param page:是否选择断续笔记接手下次爬虫处理,默认否' O/ u0 x! L" O% ^
    :param clean:是否进行简单类型数据清洗,默认否
    3 n8 }5 b' }2 F' P' Y' }7 M:param write_sql:是否写入数据库,默认否: h4 @5 m* ?+ c* ]% r" w3 t
                             'host'默认为'localhost','post'默认'3306','user'默认'root',! e$ ?+ F2 Z8 L5 y0 e7 K
                             'password':'密码','db':'数据库','table':'数据表',9 ?! C/ E9 W8 v( O
                             检测库是否存在,若不存在则创建,若存在则直接插入,4 U% g  D; Y' |2 y: B# t  b
                             检测表是否存在,若不存在则创建,若存在则直接插入
    + B+ K$ z7 V4 s; ^1 n  U:return True* f6 J$ y& g$ L& e3 g- t( R. g4 o
    '''
    $ y, p+ f6 J* {5 T# D2 z介绍玩法
    & G7 j  P% {" D2 K9 k接下来介绍的均为调用第三方库的情况下运行:
    ; f: q( t* ^- z$ X& j
    , f8 n. A! S$ J2 ~from simple_crawl import request6 R$ ^5 d( L  l% ^: H2 g; Q
    第一种玩法:输出源代码" J7 `5 |" |2 x* i; ~6 y, r$ ]
    调用requests库进行源代码请求。" h8 z9 F0 p$ V7 d
    - E5 p9 A+ f4 D4 M& t
    特点:$ t% Z' x  X5 I: ]
    请求失败则调用ip池处理重新请求访问,
    ( d' K/ `9 D& |& N. E出现五次失败默认网址输入错误。9 q1 a# T- ^# i0 `" s
    支持text以及json字符串返回。默认text。
    ' Y; I0 |2 X2 C5 d" d# _+ z' F4 _8 W5 m
    缺点:2 c% y5 }3 v: g( o4 b! s
    暂时只能进行get请求,不支持post访问
    % `4 d9 l& P5 E$ E+ B. v+ ^9 ?7 s9 u# [! o, q& w5 v
    :return text or json
    , t: S( d- A( ]) I7 `, ^9 Q) n: p, h
    request.parse(6 S  ?* ~, q) _: O! [* V
            url = "https://www.douban.com/group/explore",
    1 p0 u1 j2 M3 F( t$ c, C* m* I5 j        type_url = "text": b$ |' s7 C7 j' W) G: }( z
    ).run()( t5 {" I8 G2 C0 B2 Y" F
    # return text
    1 o6 g5 _) Z$ H+ m6 ^5 J9 c9 S' ?3 B/ u+ c9 e  y
    第二种玩法:模拟网站登陆并保存信息
    . z/ k0 T4 ?2 B9 f调用DecryptLogin库请求登陆访问。/ h2 o2 j  M# t

    + f4 l# f$ p5 @8 f" I* I) o, |ps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源) Y( j& t2 q" I1 m6 h, K" `
    在此放出文档地址
    % P8 N3 V1 n2 \. e5 C" gDecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/0 }$ O. E$ Z& F5 |8 K% m1 {, \

    2 G* p+ \8 e* m3 v) R特点:( x+ J+ P, S+ C: g- p  g
    将DecryptLogin库中二维码继承到此库(非二次开发)
    $ u$ k: Y7 k- u( L支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆)
    , G5 w8 t. p; L( ]- a5 M保存session.pkl信息到本地方便下次登陆运行
    - Y  I! K# Z1 P: }. x* D" Y) }# `
    ! ?! {! Q( w; _  Q缺点:" L2 l0 B( L! {! v
    session.pkl登陆信息过时无法自动删除。
    8 |& v( E  b4 p2 w3 y3 R( A导致下次登陆疑似cookie无法正常登陆。2 ?+ c6 S; A5 c& N4 B" g
    ; D8 g" m# }. ~; Q- ~
    :return session9 d9 M* O! U) u: |* w# J: l

    . `2 b. `6 u6 M8 V! t5 L) }request.parse(! k: b3 R! t$ I% o3 Z6 _$ c8 z
            # 臭不要脸的推广一下我的店铺! e( l1 q, `; @6 w
            url="https://shop574805287.taobao.com/",
    ; F5 H) B( q5 I9 _  [3 c        login="taobao"
    - l+ V/ D4 n! d" d% D% R4 M).run()
    : L, z, a4 w8 j9 H: x! m& V# V# return text  z: c6 r9 l% e% e

    % y6 Z. M! z8 e% `6 W* S第三种玩法:爬取网站信息
    + w1 n: Z$ w( p1 t) `: I# b爬虫库自然少不了爬虫的过程7 Z; z( g7 A: ^
    % |5 L' T1 k2 C3 p8 h. a6 K
    特点:2 j  h: a  w* B6 q0 d, n
    支持re库,xpath解析以及bs4选择器。. Y/ S2 b9 a. r! @& K" k. d+ m
    爬取方法为字典格式。单方面输出。
    / K; T3 K$ G' n5 r) M6 o字典键为保存的字段名称。' k3 T0 [. n( |
    字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。
    8 l/ c9 @; f; P5 ~/ r% T0 M: N$ _/ Q
    缺点:暂无(等待小伙伴们发现)" n; _8 n, _5 I# t' P% H4 v

    " \/ Z) [' a7 [. ^9 I:return reptile_results5 o$ _: X( @+ u  n
    9 D8 A' w% Q  T: k# m3 q2 L  l/ g$ j8 ?
    request.parse(
    " f; S8 o( Y4 n# w2 T  R        url='https://www.douban.com/group/explore',7 E6 h, o* ^' D3 V  w- v, H: r4 J* @
            # 字符串格式,选择器方法。' J; w5 F8 E0 w8 h8 `% m- m
        Parsing = 'xpath',9 E# u* f+ X. A$ \  Z
        # 字典格式,参数如上。) k, y6 ?% x4 J7 ]7 r9 a
        label = {
    8 q: @7 j/ j5 u( W8 M) j( x        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],4 {, C' Q* L" l* y" N- Q
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    3 E* i3 M; T! M( z7 y        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]; p, X5 `- P; l$ L  i/ l6 P% S/ t
            }. r1 K. y& {  ^3 P" m
    ).run()3 O# m6 j9 y) b3 q7 B# C3 s
    # return reptile_results(list)- a0 ]+ y  X+ }% o/ ^, D6 j+ k
      Z8 H$ W& }, X. I2 Y
    第四种玩法:自由保存信息
    * n) b2 n" N% ^6 H0 P目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。
    # F, F' r0 P# u0 T. Z7 L+ {$ n0 z  G& l. _; D) H, l
    特点:
    9 b- U7 `  |6 Q2 @  ]  q9 z: i/ ]写入文件均为数据格式传入文件。
    3 t: O$ ?: X# V, x9 v6 d且输入格式规范方便阅读and省事。& A8 E3 _6 I% K& x5 Q

    + a2 y0 `8 l, n. k5 K缺点:3 L4 @* q$ \8 `. U- T
    保存格式仅四种,
    ) V+ [( x4 \& O4 L9 l9 q# X# H不方便用户之后读写操作。
    9 f8 t8 `# M: c1 P, U  t1 ^( d
    # J5 @9 a1 W/ M. `3 T( y/ r:return file
    + X* R( G# x' c6 U+ o, n0 g8 z4 O, D0 J2 q
    request.parse(
    1 h8 L" Q# V7 F0 S* s3 m        url='https://www.douban.com/group/explore',
    & X* y, g. y' f! J    Parsing = 'xpath',* M( O' i1 ?/ V1 m* q6 e( o  ]
        label = {0 d/ v" }2 v; [% Q
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],( l# f" V+ C/ U8 Z) l
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],2 k* Z9 D; @, U+ B: N
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    2 {3 v* ^4 [6 W7 F. G        },+ Y. z8 f8 g: t; y& ]$ O
        # 字符串格式,具体保存位置填写
    : P! h) O( u" {    write='result.pkl'
    & R6 O4 `; ~9 y7 u# d).run()8 ]% N4 K: D8 [
    # return file
    6 b1 x% x8 a: l6 g9 I5 t( u; W% Q6 b# H/ d- u# E5 [/ b6 w, I
    第五种玩法:读取下一页 url 地址继续爬虫
    ) F5 w- g8 i6 K这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~
    - g# ?0 j2 Q' Q# u3 ?1 J' W7 R0 k# N* S; d
    特点:
    5 f  D* W5 I# H0 ^' y继承之前的Parsing参数选择器选择方法。0 |0 Y1 H5 A' `+ E% z1 p
    在这里可读取到解析后的下一页 url 网址。
    5 Z+ x6 n, x" ?% {% ?' B4 M4 O方可继续进行爬虫处理。方便用户使用。% `1 D- U9 _0 ~: _1 e2 _* D

    * A- e2 ^* q2 d7 W/ S+ C缺点:  J! X6 G/ F( D0 C* G
    若爬虫时下一页 url 地址改变,便结束爬虫。
    $ l6 n. i) l4 W3 j9 ?- C, b只能爬取所给 url 地址中的信息。
    7 G3 n& E$ R: I% J' d( `8 X1 e无法进行某一界面的多个网页爬取返回。+ I" W% w* H! g3 ^; c0 |
    造成访问页面单一流失。* E" A1 h, f/ ?/ u
    + |1 R  D7 ]. Y$ |7 t) A
    :return None8 Z) Y( t+ A5 K) F2 l* A
    4 |3 K4 P6 X# k9 m' Z
    request.parse(
    7 u3 D' k) `, G/ t$ o" D7 I3 F# q        url='https://www.douban.com/group/explore',# |: |' h% j) V5 _7 [1 G
        Parsing = 'xpath',
    3 m4 R- I5 T9 q' S; P    label = {3 c3 q* N* O1 l7 O& m, a+ S
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    % y0 m, o. h' T# ^% h4 Y# F4 j5 p9 H3 W        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    ) H- g! Y! D4 R: p/ U        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    2 I! ]1 K- v+ c. Z! C        },- p8 b) ]$ S3 M+ J9 u' V, W
        write='result.pkl',
    : y" }% A6 a! W2 J7 ~: j: `5 r    # 字符串格式,根据Parsing方法继续请求下一页a中href5 y+ C4 }9 {/ V# ^2 g
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    1 ]3 N7 N7 D4 U+ [* q: T) F).run()5 r7 h' T8 h" Z$ g, K
    # return None
    , J+ j# f5 n7 q
    1 V% }( Z) `/ _0 x) ^$ {; g, o第六种玩法:爬虫网页保存4 S& W8 |- y0 u# ^
    听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!
    3 O' q' x% X* p4 S3 _
    ! }  x% |( W1 ~$ c& P, G* l特点:
    8 a) a! I8 |) O" U' q持续输出断续笔记。! \9 X  L5 p& `( w
    将此次爬虫的 url 地址保存到一个文本文档内部。
    7 C* s- S8 v! z# K下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。2 I$ J- m% l+ f- h8 z' }

    - j% E- w+ T! ]9 R# t: E7 h! T5 R缺点:: n/ Z; I' d- S
    读取内容不单一。% k3 `$ y3 E8 f
    导致下次爬虫无法正确读取上次爬虫留下的痕迹。
    - Z6 K' F- u9 W$ \* L- d: l8 U0 ~. ^4 X$ x) X
    :return url_file
    1 H. @0 N: t6 z: G) A5 F6 @) H7 D" ^. B+ s- c, c
    request.parse(" F. g& B7 V8 V1 Q$ n, B9 C
        url='https://www.douban.com/group/explore',, V1 C1 _$ A( k% z: L+ ~
        type_url='text',/ t6 h6 K$ E2 J+ Z6 y: v4 F
        #login='taobao',) {1 P1 a, h& n8 l# R! t1 v
        Parsing = 'xpath',
    7 U$ d" p, k+ q8 N    label = {
    5 {+ r: ]/ C+ Q7 w: f0 F        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],6 }5 w4 Z' _6 ^0 Q, B
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    ! @3 G7 L7 V! t  ]1 I' R, u        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]7 x5 ?$ Y- |3 M$ D- b" _: Y
            },
    0 f' T9 r9 e2 M2 s: I    write='result.pkl',8 m* C" w+ Q( u* l4 B+ b- w
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',' P1 I% Y# v$ t$ y
        # 第一个参数为是否需要断续笔记。. x: H: Z5 c6 N# p" _) k
        # 第二个参数为断续笔记保存位置。
    0 f, L* _' ^8 `7 B    page=[True,'url_page.txt']
    " I! A+ Q& k7 n9 \( L: d8 m6 }& ~).run()
    0 i0 Z# Z* B8 b" X; Z% A, A8 z; K2 }' e1 E# return url_file
    4 E1 ~( z, k; m. G" G1 z; \& Z& |6 z* e, k' R& m. p
    第七种玩法:简单数据清洗
    " d- v* v( Q3 y  V0 E. ?7 n" [7 F数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。
    ; s8 n& ]9 p" Y
    . I0 N- j7 w+ U0 \) V( |% h' W特点:7 ~5 p+ c, x1 w9 r8 k! O  j/ x7 [: N
    本人曾写过一个底层数据清洗。! I" g8 P  ^9 t
    能将列表格式数据进行归分清洗。1 [# W) h( B- I3 C
    主要内容请参考另一篇文章# @% q8 o% W7 I& l4 b3 }  c
    如下连接:数据清洗
    ; g; Q" g: R& Y4 b( g+ x& t$ d) d# v8 e
    缺点:
    . W% A6 |0 O5 H4 U9 Z/ c" g6 n数据清洗格式简单。
    , }7 P" d& S* j, p3 J' e数据清洗内容单一。
    9 c" p& G- ^: [% q无法完全做到绝对清洗。2 m7 H' B3 D/ _9 l
    有待改善。
    3 C, ~1 n' j; z/ I4 @
      y' T& @+ [( h. [5 u8 X3 d:return keyword_list, value_list
    & ^7 \' \8 ]) {( G
    " u2 S4 }& T, l. R- L3 C9 \request.parse(
    # d3 b1 R6 a. n: k    url='https://www.douban.com/group/explore',$ M3 ~( B4 e9 K. R1 H) C  ?* N
        Parsing = 'xpath',9 z& y, @) ]7 M& k$ I4 G
        label = {
    3 J4 D9 O# [2 |- I        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    6 I5 d; W+ B( n3 h        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],0 q' i5 ~' b1 z3 Y) m( a- p5 L
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    - E: i9 s0 R3 |3 U  t" {0 x$ `" ]; Y        },2 ^  f+ k4 l; [( V* O
        write='result.pkl',+ X8 R+ B5 |! c8 F6 `
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    * }! m+ p( H& j% f. b- C1 w    page=[True,'url_page.txt'],
    1 s" Q, ]$ J- U& a" C; s& D    # bool类型,默认不清洗; Y, j; T" N4 j& Q) p
        clean=True$ \4 c/ Z. o, U# v2 l& l# i
    ).run()
    , h; d" M7 a2 o% j
    1 S4 q$ d! y1 F. k' e% Z第八种玩法:爬虫存入数据库
    2 M3 y& {9 E' n& J存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。# j: S5 B# D" T9 h7 m
    ' L( G9 z8 ~1 c  c
    特点:  L  B! U- O0 H7 y+ a
    信息存入MySQL数据库。
    $ H. ]9 c; A3 v可连接docker远程数据库。/ D# V# `/ g; C
    数据库的库名可以不存在。
    8 ~$ [5 o8 U9 ?8 @' p1 S6 \数据库的表名可以不存在。& O6 v! H) ?( K& a1 b, Y+ p! P  H- y
    根据之前传入字典键与值参数判断表类型。
    9 C# J1 n  O7 |! e自由建立数据表传入信息。
    1 e% [3 G' z/ G! E7 |: g- X, {7 g$ L, [% o" E+ I; ~- T$ k/ V
    缺点:
    2 |3 x5 p) {- B0 |1 r仅支持MySQL数据库。
    ; _6 d7 t' T$ c$ n. x1 w
    $ w  J: u( K7 |' T: V:return SQL) o- h. ~: \, ?+ r

    6 S7 L$ s( K+ trequest.parse($ l% X2 C5 }8 }* u4 g5 L
        url='https://www.douban.com/group/explore',' h6 F+ `$ W) r
        Parsing = 'xpath',4 q2 W. T9 k$ S* J
        label = {
    . K/ Z( r% ]* @% Z" ^: O' }        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],+ z  V0 o4 E+ t0 R% k
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],3 _* o+ b% @) r
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]) o3 W4 Y0 f' Z& D% b+ D; Q; D' @# V
            },
    % n" M# I  {5 H) M% J    write='result.pkl',
    * F$ o1 W7 V$ Y- U    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    $ H7 ^9 J5 M- o" J    page=[True,'url_page.txt'],
    & \7 t: H. @3 d4 y$ |: a    clean=True,
    ! }1 B3 ^. v! j+ ^+ ?* w) S    # 字典格式,
    ; f" y. ?- i+ |' u" M) `$ `% |    # host可有可无,默认localhost: f4 [, Y( `" U: w0 ?" k+ K
        # post可有可无,默认3306
    3 T0 N, i5 Y$ I4 X    # user可有可无,默认root
    ' G/ x# y, _, H2 y    # password必要参数,数据库连接密码, F/ n+ b5 n; b2 U( m
        # db必要参数,数据库即将存入的库名
    2 R( L5 J2 }/ u6 u    # table必要参数,数据库即将存入的表名
    9 X  Q0 R2 E: A+ ~    write_SQL={
    2 O$ y8 ?6 Q- L$ v0 C! J% }3 X        'host':'localhost',
    # l1 v" r( p9 M        'post':'3306',
    & ]$ j7 D3 b  b; @/ X% R7 L& Q        'user':'root',
    0 ?2 o' C3 r; b        'password':'123456',; g" c9 b/ j" K& f! u; Z
            'db':'example',  d& F: A0 s2 g6 |: R
            'table':'example'
    & J4 J" p3 ~1 _% z        }
    1 w* d+ R$ N$ Y. e$ {4 s    ).run()& ^9 z( E  A$ i$ g

    6 Y: V' v+ V* _3 _5 ~8 P1 f4 B4 o第九种玩法:重新启动爬虫3 q5 w' u/ J2 n) u1 J- }, R
    爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。
    0 e! a& M0 A, t$ |' W: U$ ~( \
    * J0 P. S3 x9 I4 X特点:7 W7 j7 V/ m5 c8 ?& [2 s$ I: e
    检测报错重新启动爬虫
    ) c& b0 P$ C- N/ T无需手动处理错误信息* g$ M3 m0 |6 x9 U; w; `

    4 F# Q5 U+ [4 Y- l- }缺点:
    & m( i+ y1 d. `) Q' f. ]# q& s& t无法收集子线程错误。
    4 u: ^( s3 n6 [
    + z% Y: E$ f8 R) |4 {: y:return None0 o: v6 ^( }! M+ V
    6 A* y/ p* X) N
    request.parse(4 w2 v6 H+ C' C. L/ v7 z* N( d: W
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],6 s  ^0 r  v" X/ _; E! E
            #login="taobao",
    0 g  u/ n3 K0 g        type_url = "text",
    # h/ o( T! ~, U* a3 [* k2 ^        Parsing = 'xpath',
    - R: D% a1 r2 Z  q4 V+ C6 V        label = {
    ( G' d" C' j/ [  E- }            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    + _4 N  Q( n5 {, t            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],: P6 I- g- \8 y2 v3 E/ T$ \9 K
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]3 j& a- ~  z4 G2 H7 q
                },
    5 G, w9 [1 b, z8 D        write='result.txt',- e+ N, M5 p; M( u
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    2 H9 `1 P( a# n% D1 v& \: y4 d        page=[True,"now_url.txt"],7 G" e% a2 k! M+ _# f+ p0 o; F
            # texting 参数为是否启用连续爬虫  \" p  h6 X" d- ~/ i
            # 爬虫程序异常报错后重新启动爬虫
    0 ^: x# _. m) k! b        texting=True,: _6 t7 b8 E2 _% V7 W
            ###
    % ]5 W, L- U) K4 L$ ^- L6 s' n        write_SQL={1 z# X# `: B. l- y6 X; Y
                'host':'localhost',
    ) r1 ^5 t7 r7 t. m6 b  k7 {            'post':'3306',+ C1 [# x: D2 t& f9 H) |
                'user':'root',% E4 \' k6 ]( D0 F  e  n- I) U2 ?
                'password':'123456',
      L5 l6 t, b4 o& S# l* c            'db':'example',
    . p' ?' \' o6 \: y/ e            'table':'example'2 f+ B" m4 `, B' v9 g' A
                }
      u. g1 n/ O; l; y  j" R).run(): F& {  S3 h. A2 M
    , S( ~9 V9 c5 W9 c2 S: J5 c; o
    第十种玩法:多线程爬虫
    % ~, f( W( e2 Z% X! ]  d0 c特点:. b6 Q2 J3 c: w8 D1 f
    爬虫速度加快,
    - [. |# }# x/ R9 r/ w! u更好的利用了线程。
    8 g# }$ l! n  |  }1 G8 o: R7 O( ^4 f
    % d$ Q( I8 U0 P# {缺点:暂无: ~! s0 }/ B+ L+ W# o  n2 T% x4 C
    6 a( M, R8 G8 j
    :return None  u% c8 @! v  x1 j4 q) f* I
    3 C1 G( K( e, Y$ i
    request.parse(
    0 B* P8 i9 t0 w! d. q2 _$ o0 W        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],: [1 u2 @( w+ ]
            #login="taobao",
    2 c& v; N# _! m        type_url = "text",3 p4 v, H2 T8 b6 t2 O% n) C
            Parsing = 'xpath',! G9 t! F3 n6 ^5 [8 E% L
            label = {( y6 K5 q$ a  }$ h+ n) A
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    " b" {7 \# t6 b& q+ c( \            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    8 [3 T# c% c$ v+ O9 C6 q            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    : |+ C7 P: |: B1 s9 L+ T            },
    ( {- Z' A3 G2 K7 j! r        write='result.txt',8 V' f7 w6 A  d2 h$ f6 \  {
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    5 C) K/ ]  h( H9 ]        page=[True,"now_url.txt"],  l0 ]9 j2 J  y9 u
            #clean=True,- K0 w+ q1 o: k. ?4 w' u7 H
            texting=True,/ D' D3 M# l. x3 ^$ l7 E
            # status="threads" 启用多线程爬虫2 G# e$ S9 Y4 U& W( a4 x
            # Thread_num 为线程数目,默认为1 单线程
    + k1 O& Z, p( T/ [$ W        status="threads"," ?" P$ y" M% e' O& c
            Thread_num=3,
    / ]- r% G2 d  I6 E& X        ###
    9 G/ f: x4 I+ c$ R' W. N9 y        write_SQL={9 U/ W# l; f  e* U9 Y1 @! b
                'host':'localhost',
    4 Z0 r. v! z$ f3 j            'post':'3306',! L; Y1 p+ N6 H$ @0 e  @
                'user':'root',
    $ y  |3 p) Y! R" @0 {. _            'password':'123456',
    4 I1 m! b( {/ e* L; B9 H$ V            'db':'example',( O& d% y  z5 q6 J2 _
                'table':'example'( D) @+ m. ?9 W. c# p
                }
    * v5 e& ~4 Y& h$ w- u).run()+ o) a) h: `% X9 \# L

    + ]* K: M6 |# u5 h! E% s' i+ @第十一种玩法:多进程爬虫) `3 i: {* Z& _% B5 ?
    特点:9 V: }* B9 z# h2 I4 V8 q6 n
    爬虫速度加快,
    5 E, o, c/ M+ N" D更好的利用了进程。" D, S, [5 B! G( Y  h/ p

    $ M' W8 n; u2 E缺点:暂无
    4 E% L2 R8 p, {1 `* W/ A7 I1 Y, X. K. A0 V: N
    :return None
    . f1 t2 p. n7 Y( X1 b7 F$ q3 s
    % Y# S+ G+ k! d# y8 Lfrom simple_crawl import request, e) p! V* ^5 r0 Y: n
    request.parse(
    4 d; c; g" J  ~# k" g0 w$ w        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],. K# c0 W! v1 n, ?' ~. g
            #login="taobao",
    8 m5 E! M' a& S3 h        type_url = "text",
    3 n  `, b3 J6 y        Parsing = 'xpath',$ h6 c, Y3 d3 y# X' k* X
            label = {
    $ U; j* I8 u0 _  o: D7 f6 b$ V            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],+ E7 K2 M; |8 l0 H) R* g' D
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],. s" }) k/ q* p- W: i
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]3 E. f$ t) {/ g' g
                },
    9 f) N/ L2 r3 l0 r; O0 x        write='result.txt',
    ( f! s2 C: j) T4 l        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',  |$ W! t4 p$ [: F, i. o* I  `. b
            page=[True,"now_url.txt"],( K* Q$ p# W0 _5 d  V! b
            #clean=True,0 Z2 E+ R& \6 l" \. e
            texting=True,' i; f4 h% o' ^, ?% J5 o
            # status="multiprocessing" 启用多进程爬虫
    1 D8 n6 z/ |5 K+ ?+ ?- @3 z5 L        # cpu_count 为启动代码核心数,默认为系统核数一半
    ! e& P; R7 O% ?/ X, @# s6 m        status="multiprocessing",
    5 L1 ~& F2 o1 ]# ~* {  m( f' C$ }/ y        cpu_count=2,1 ~% j% @& h4 h; p9 O" ?9 g* P" H5 |
            ###
    # t2 P1 O" q  m8 q        write_SQL={
    ! q  |. y2 c3 q  c) R# |9 F3 Z            'host':'localhost',
    " @% T$ }' {6 O# H            'post':'3306',
    : n8 b0 V& Q. e% t# ^1 ?, ]            'user':'root',
      ]- D- b2 e( S: Q8 E            'password':'123456',
    / s  N2 f6 P% t. N0 B            'db':'example',
    $ I9 L' V) }" c4 {3 o  v            'table':'example'$ {3 ^- X1 E1 ~7 M8 v$ w
                }
    3 y& i3 q7 b% f) M).run()0 l2 Y+ ]0 D7 I! v
    ' m8 o4 r7 e( M" [: W
    第十二种玩法:异步多线程爬虫4 t9 v& P, s8 u6 @0 N+ `$ u9 K: e- J
    特点:$ e: n- i& `6 Y' V" E* y' s5 E: O, K) n5 z
    爬虫速度加快,/ E  Y3 b' s, t$ S
    异步使得爬虫无等待时间,' d' V" b7 T" ]* c/ S. c! O
    同时使用多线程速度明显加快。
    ) v$ D) z/ G# J, E& |1 _( y) |! @7 [4 G; B! x* @7 j
    缺点:暂无$ C8 ?$ A! _, w% j, p
    - K+ E; E' B/ Q$ Z. r$ I- p& x. e- I
    :return None
    1 A+ L/ P5 C0 g4 n* j2 x; U9 H  O; r- L7 J
    from simple_crawl import request
    * w: B8 p7 a" Orequest.parse(
    / G) {' k: ^3 I2 k  O( e        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],* `0 M1 j6 Y6 N* r" M2 t- f1 i
            #login="taobao",2 C4 X" {; f$ L/ i
            type_url = "text",
    ! y: M, e2 F. Z3 c+ ?7 Q        Parsing = 'xpath',
    6 U! A- ?' E% @- ~$ W        label = {
    ; G6 |! ]; F5 K) L# j" h7 |            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    * E7 k! ]0 e1 q' N            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    6 y0 }  l1 r$ i" L, b- Q0 m/ R            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]$ _% N, i% q" ]
                },( Q3 E! G/ W6 ]) S% V6 A$ Z
            write='result.txt',
    8 Q# @7 ]. q+ i! @  u9 o9 `        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',; |) |' J, q* ^8 A( J1 K% J/ F
            page=[True,"now_url.txt"],3 R' y0 e- m( q( ^& S
            #clean=True,% M+ O! v7 J* z7 g; E6 _0 G
            texting=True,: x6 y7 e# y% q/ N0 P0 p
            # sem 参数为异步引擎数目,默认为5
    * z) u5 [. j1 A0 `' m) h        # 其他参数同上% ^8 N5 _# k! p8 q
            status="aiohttp",- }1 Y/ R1 d, Y6 j* `1 P% E" ]
            Thread_num=3,3 u% a7 S9 I9 N$ e& m
            sem=5,
    , A- b! `8 D7 r  E. L; m) Y        ###
    ) t3 v. H- d' b9 P+ P# i        write_SQL={
    + i" ~7 r7 e3 e- z" N            'host':'localhost',
    " |% r+ p( E, s8 k8 C7 K            'post':'3306',: o" s0 [2 p+ F$ G/ O$ l/ q
                'user':'root',
    4 l( P2 z6 C4 |            'password':'123456',
      H$ F% U( `- Q7 d% q            'db':'example',2 L$ S. N7 H+ V# N9 \
                'table':'example'
    0 {8 ]6 e8 \$ P& j; ^            }
    0 `6 I; z7 g0 r8 o).run()/ L% j4 L4 @1 Z. V: V
    & T5 o! W; s  J& c. _3 s( T
    第十三种玩法:异步多进程爬虫8 f* l  P6 `6 g
    特点:
      ]1 A2 L, u1 T4 `* O爬虫速度加快,) |1 ?5 U) b5 f( C' ?5 t5 a7 t
    异步使得爬虫无等待时间,
    8 K2 ^  n2 g% X( Z1 n同时使用多进程速度明显加快。
    . [3 e5 K) G, j8 A; w$ Q3 x% I0 O( G# o4 t; c1 ~' S: p
    缺点:暂无* S/ m5 A8 s8 }" Z

    4 ?  s* A+ e& d" T:return None1 G0 ~) u5 B4 Q( @1 Y4 G1 H9 ]9 O) F
    / K8 P# k$ u* }% B9 o. m6 r. E
    from simple_crawl import request6 p$ |4 [& J% D3 j2 y8 H
    request.parse(
    ( E: v( W5 y6 L3 `* q# X        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],5 ^" }1 `) ~9 D( Q; H4 C
            #login="taobao",
    0 N+ b8 N$ k+ I, M        type_url = "text",. f1 U: R8 k2 Y3 O  ?( t
            Parsing = 'xpath',
    7 @1 i/ m$ K( g: C3 {4 @& @        label = {
    7 Y: p$ ^, M6 c& C            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    * v2 ^' {  }) \, s0 v0 E- r3 o3 g            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],- O$ w# B$ l# \& Q. e; S6 G
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    6 c9 f' t: x" A0 L& s            },
    3 A9 x) I: ?% K1 L, j6 e5 ?        write='result.txt',8 t& p: \1 w! K. r; {
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    3 t) D/ ~  i3 {$ a" w: d. d/ p# r1 ~        page=[True,"now_url.txt"],: S5 r9 C4 g9 i8 Y- a
            #clean=True,
    / j; |- m% ~+ Y- r) X        texting=True,! c- F5 S4 F; D/ V9 O
            # 参数如上
    / T" d0 G# G3 z' x5 S        status="between",
    / x( f; s2 K7 r! @5 y/ R0 i# Q        cpu_count=1,/ |& k' V" `: F2 L+ q) T0 b; |
            sem=5,
    , H: J6 J! Y7 b4 O4 ]        ###
    9 |5 _( C6 U: P& p: L' p5 @3 J        write_SQL={, I, W& @; i: V5 P# l
                'host':'localhost',
    . S  ^5 J5 V) o# n3 F5 i            'post':'3306',
    ' _; R# D- J+ O8 R; m) a: h3 A+ `6 m( U. k            'user':'root',+ r5 R& z% c1 M4 A4 ~2 `1 e
                'password':'123456',+ t8 o( X1 F9 g' \8 l0 ]" o
                'db':'example',4 ~6 E! P4 ]1 a, U3 s
                'table':'example'0 y/ I8 e4 H; i' b! F, [
                }, p  F7 T3 v: o& Q; R6 z$ W
    ).run(). E8 `- @' c& Q9 d
    6 q4 j8 q* N1 G
    6 Q; s& }; v3 ?8 f: L8 v
    功能介绍完毕🤞- o) k- H9 K! E2 {
    最后还是希望你们能给我点一波小小的关注。6 [( ^7 H6 |( ?' {4 @: J
    奉上自己诚挚的爱心💖) }* Z% X/ ~0 e: b/ y9 u2 k# K7 N
    ————————————————& N$ m- B: Z2 C
    版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    ' }/ R5 r" s1 Q  T原文链接:https://blog.csdn.net/qq_45414559/article/details/106005684
    ( Y1 j" n( U$ `4 A
    1 e; N( t* ^3 T6 m
    0 u; U9 J& z7 L! q6 C
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    738391227        

    0

    主题

    6

    听众

    32

    积分

    升级  28.42%

  • TA的每日心情
    怒
    2022-2-20 17:52
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    自我介绍
    哈哈哈哈
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    fastpost qq
    收缩
    • 电话咨询

    • 04714969085

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-11-9 19:21 , Processed in 0.627317 second(s), 56 queries .

    回顶部