QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5463|回复: 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. M" R8 m1 M( U- K0 K  {7 D$ \) y
    simple_crawl
    ; @* Y# C$ v: J4 }仅需一行代码即可达到爬虫效果+ p) M. w5 u% p' Z
    项目地址(欢迎star):https://github.com/Amiee-well/crawl
    * N& w. y8 X: w* W+ U' b使用方法5 P, M, j# I* K- K6 H
    pip install simple_crawl
      w( u* T5 D2 Y. A( S
    4 q9 A( }, p, Z% P### 以下源代码为简单介绍,详细功能介绍再源代码之下
    + c4 c2 g( X- Q# x& j, n% Afrom simple_crawl import request
    " Q( m, l. q' K3 z$ V: xrequest.parse(" h" V, |8 n# G. i
            # status 参数为运行状态,支持单线程多线程多进程协程以及联合
    4 L: u7 B9 a" p' b( Z$ B        status="aiohttp",7 |- I4 b% W# B# Y& G, v
            # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式
    ' w/ S8 {' K: D& \# k% ^        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    ( y$ z3 t. W6 x. [# f. D# j+ l        # login 参数为获取登陆信息,如淘宝等网址需要登陆信息
    ' C2 v" d# K: o, Y: R: A2 O    #login="taobao",7 l7 g* y, E7 @" i! g/ V' M
        # type_url 参数为返回源代码格式,支持text和json,默认返回text
    ( X3 D6 ]3 P2 ~$ [    type_url = "text",
    6 l" Z+ g' e8 ]$ w9 P/ o    # Parsing 参数为解析方法,支持re、xpath和beautifulsoup
    8 W9 j* M! J! P& u    Parsing = 'xpath',5 Q9 e+ ~/ Y! |4 r$ w+ o
        # label 参数为爬虫解析过程,字典格式,详情见下方! y$ b( I0 }$ q8 B, V; y. p
        label = {6 U' e( e& K  x% q+ p+ h
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    ' T5 C" \& @6 ^1 Z6 B% |" v            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],7 L. q: m* Z/ I! X
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    2 _+ d; O1 \/ N4 |  g6 D     },- L$ a! g! `9 Q. O4 e$ p; d
         # write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱* O) `; z, V6 S5 h/ B% F: f; `
         write='result.txt',4 G* l. G( X+ }# M! @4 v
         # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫4 S  Z0 r& t! ]( i6 m6 B& s! s
         next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    * u9 v) [' B5 {# }% C1 E     # page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫
    : L7 A" P3 s; h3 H# s2 Z3 N2 Z     page=[True,"now_url.txt"],
    ! J5 m5 w" c/ j# v& ]- k     # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息
    $ W$ g7 o) b, \# V7 C     #clean=True,
    # S& ]- }& f# g/ y) S     # texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序
    4 S) O( e. q# n' ?     texting=True,  _" N# t' S, U0 }1 ^3 P
         # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态9 k, c7 ^( B1 A
         Thread_num=3,0 M7 K/ S( v. N$ x: q  d4 v
         # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态
    + H7 z6 r. u. M4 D0 t3 Y( b: C     cpu_count=1,* w' g" \" N/ p$ E; T  L. }
         # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态
    # C( n0 }1 Z, y. w& X; ?5 n     sem=5,
    4 x2 v4 c# s( _+ y. C" d     # write_SQL 为是否写入数据库,默认否
      _+ |: b5 N3 @0 v: d! u     # host 参数默认localhost8 [/ ?# ]& q, v$ f
         # post 参数默认3306. I/ x0 Q$ M4 ]9 A4 q
         # user 参数默认root
    2 G; ~; ^$ {+ ?( p5 c* r: }     # password 参数必填,必须正确
    : D% C* J+ `& v6 H' |1 ^     # db 参数为即将存入的数据库名,若不存在自动创建: G8 H$ R% _: V
         # table 参数为即将存入的数据表名,若不存在自动创建
    ) n5 I) g4 x: q6 q- M1 F5 J     write_SQL={8 i% e! Q' x2 s. M& ^
             'host':'localhost'," M# _* i# g9 R
             'post':'3306',! Z  [) a* M  w( L' H
             'user':'root',: j6 c) m0 e" \) r7 V
             'password':'123456',
    / A% {& _+ c" ?3 V9 r3 J, o; f* }         'db':'example',
    , S' l; d7 [+ n6 _# H: s         'table':'example'
    3 F! P8 q) R' @$ M" x" @      }- r3 k# f- K# i" x) e
    ).run()5 r. l2 F3 v0 ?9 w8 O
    , E$ X9 p+ W! O/ l
    介绍一下crawl参数设置:* H# [& K$ i: v+ q, v9 L
    ( Y! _! i) ?' S
    '''
    1 z  t. ]# c2 ^6 [7 ?' D! t, K' W' \单行代码爬虫程序执行& D, G- `- b2 g$ z6 v1 B, E9 L
    :param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档
    - j. T( n% F* l+ z- _:param url:即将请求的url地址,仅支持get请求, A$ [' h! ?$ v5 y. g" G
    :param type_url:请求url后返回格式,支持text和json格式返回2 i, z4 S2 d" T' w9 l) B
    :param Thread_num:即将启动多线程个数,默认为1单线程
      M. b; v  H4 B- i" G:param sem:协程信号量,控制协程数,防止爬的过快,默认为51 a+ b* K$ `1 W: c; A3 o9 n' e+ c' x
    :param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半7 w6 h9 G/ c* ~6 e- {5 f' A! x! Q+ g; s4 U
    :param login:模拟网站登陆,保存登陆信息
    7 q: A) A6 l. G9 g8 Q- w:param Parsing:爬虫方式,支持re、xpath以及bs4方法; b- w, Y7 b& X6 K. M! Y
    :param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,
    ! g/ D3 T; ^: v  m2 T6 e7 E( e+ s                       多次报错结束程序,默认否; M& K: z; ?8 D- q# x0 Z8 l
    :param label:选择器内容,字典格式保存,
    . V4 W( k3 g5 @- o5 T$ }3 a0 R2 y                     字典值为列表格式,第一个参数为选择器,第二个参数为转换类型
    / w1 O- B3 W! J: x4 ]                     第一个参数必填,第二个参数默认str类型
    6 W' z# ]$ ~) ^- @( a6 _:param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否
    - ~( ?2 j* s% H( F:param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫% M' E9 D# d# [
    :param page:是否选择断续笔记接手下次爬虫处理,默认否
    " H0 m  F8 p% i( f5 }6 F:param clean:是否进行简单类型数据清洗,默认否8 S5 P( K$ r. {& _
    :param write_sql:是否写入数据库,默认否
    ( t& a+ t$ B) _1 `1 B# b                         'host'默认为'localhost','post'默认'3306','user'默认'root',6 C! _, K7 k' @( |
                             'password':'密码','db':'数据库','table':'数据表',
    2 K5 k, d' z' _. i                         检测库是否存在,若不存在则创建,若存在则直接插入,
    2 ]/ j" ]! o& F                         检测表是否存在,若不存在则创建,若存在则直接插入
    2 E" p% b: ^+ u/ ~* h4 G/ n! j:return True  W- P2 ?2 G8 |- m
    '''( D  \% b+ c1 [9 k3 |; o2 C; c. l
    介绍玩法
    8 T" E% z6 L' l# M9 O! y) b' T1 b接下来介绍的均为调用第三方库的情况下运行:2 u+ H0 P  ^9 `% d

    ( ?' b2 X/ m& W* P4 {; m% p6 i4 Qfrom simple_crawl import request& M' _3 V0 E8 W3 C- l! V
    第一种玩法:输出源代码
    - b* R2 a: }4 ]. N0 J调用requests库进行源代码请求。% A! V2 ?( v+ V0 _' c
    , z/ W7 q' H2 V  C
    特点:0 m" C+ x( ?3 l9 q4 V+ q* H
    请求失败则调用ip池处理重新请求访问,
    ( r7 w: w, B; ]$ c" R! m出现五次失败默认网址输入错误。; Y7 N5 s) s$ ^& v% m
    支持text以及json字符串返回。默认text。; K+ D) x) W  ]* K: _
    9 N$ J8 y) K5 `; b) p/ z
    缺点:
    / y- U+ V2 t7 @, y) L6 c" i暂时只能进行get请求,不支持post访问* \- {# J  Y- {
    - e( L% J3 ~8 {% C# @- h
    :return text or json
    7 {& ?" C8 l6 u- `
    . j( N; M' q/ J; W/ S* z6 mrequest.parse(
    ! Q) N( s, P! S        url = "https://www.douban.com/group/explore",
      @9 y* H1 M$ C- W) a        type_url = "text"
    $ z: t+ ?, k9 P).run()2 ^' ^& `( P6 [  `- G  ]6 ~( G
    # return text) P3 o1 J5 O7 S! m
    & u7 [3 F: X4 X' p) \- {
    第二种玩法:模拟网站登陆并保存信息4 Z, a4 z( m1 Z3 M* X
    调用DecryptLogin库请求登陆访问。- @$ p7 Z8 `' q
    7 V$ I" p! w( `- e7 p# r; e
    ps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源
    2 j& P, }( I; a6 t4 w# w% C在此放出文档地址4 A1 c: O- q  Z3 S( @6 C2 S
    DecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/
    7 f4 s% E7 k! B" V* T& B2 l& Q8 n4 ~) |7 V) O- _; u& J1 R( W
    特点:
    2 v2 E/ i0 f* ^5 ?, |1 U2 R将DecryptLogin库中二维码继承到此库(非二次开发)
    * C5 Z4 F7 j1 c9 T* A+ D支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆)
    4 s: d! v0 X+ q保存session.pkl信息到本地方便下次登陆运行% O" c( C2 K0 t* b, j# k- s: b4 s  `

    " A2 v! [/ M* D1 r% h, |缺点:
    8 I& U( Z6 w( N# [session.pkl登陆信息过时无法自动删除。% z) D# i/ J& p
    导致下次登陆疑似cookie无法正常登陆。
    ' a8 R; r4 k9 M& I# F1 p* s# B: i. E/ z0 z
    :return session3 t, b* i5 M9 |' S! J- \

    # f& t* ^3 G+ e9 lrequest.parse(/ \: e- F9 d' m9 |9 }9 ]8 @
            # 臭不要脸的推广一下我的店铺  r9 \6 c4 o1 m1 p+ l- l! V' t
            url="https://shop574805287.taobao.com/",
    . q4 V% u5 s) K3 Q        login="taobao"2 M, O6 Z9 Z* w( U  l0 g3 M# U  ~
    ).run()) a2 q3 s9 l( r6 K, n" p
    # return text
    0 o0 A% ]0 B* ]/ f8 k6 v
    " h# _8 P1 L. w3 P& O$ G( f8 T第三种玩法:爬取网站信息
    ) r( s  `, n* D爬虫库自然少不了爬虫的过程
    ' M' Y0 Y  y" M, l+ N$ u+ d+ b, [/ R1 s1 H7 x# c3 ~
    特点:
    $ r! x! k7 Y1 W# a4 `2 [9 j支持re库,xpath解析以及bs4选择器。8 _6 P* L  N7 S* n6 |
    爬取方法为字典格式。单方面输出。/ s! d/ i; b3 e4 Z6 c2 `
    字典键为保存的字段名称。
    , T1 Y  I9 o* V3 r6 e1 [字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。; N, B2 C# a' A2 q' u7 d. ^

    ( N% N$ p; Y, J: B& [0 B5 R) N缺点:暂无(等待小伙伴们发现)
    ( L  j2 ~3 ~- o9 J; q7 J3 d. c5 t, D5 k2 n+ A9 T
    :return reptile_results5 [/ [& Q( H& K6 ~- r" P. o
    / W. U- W0 s$ \3 P6 `
    request.parse(
    8 R( m/ T' [" @' ^$ Y' w$ @        url='https://www.douban.com/group/explore',
    ; C) X( c1 Q! x) r        # 字符串格式,选择器方法。% n& y) |8 G. k4 H+ G: k7 f
        Parsing = 'xpath',
    - D* b' u* p# w    # 字典格式,参数如上。
    8 S8 x' @7 J% A. ~+ V) I$ ~    label = {
    % V; Q1 Y& _9 ]        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    6 {8 j$ @& {: W5 M) U        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    6 J# D" j) w8 \1 f) U; n- |        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    8 k  N+ h! \: X+ q! r        }; z1 P& |. N: P2 }3 F: s+ ]& T( F9 K
    ).run()0 x8 `5 Q' W, B* q- C8 Z: J
    # return reptile_results(list)
    / o8 |6 @& a, d1 K) i* F9 j: D
    * d$ s6 v" T$ j6 ^6 X% p第四种玩法:自由保存信息
    0 W: X- _' b* h/ l1 F目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。
    ; g5 v8 @/ ]& e' |7 Z4 F9 f* y6 E/ e% P9 y. ?
    特点:, n- J1 Z1 ]4 m6 b+ B
    写入文件均为数据格式传入文件。& T% z- B( D8 d" [: N5 f
    且输入格式规范方便阅读and省事。  x- L* k) x' r/ x  y
    & h$ w6 n! T  W
    缺点:& v0 T) c/ y/ v  B
    保存格式仅四种,8 p6 q) G3 ~- r2 v( p
    不方便用户之后读写操作。
    4 K  K( B& n$ l& d
    / w0 g* Z  h! |* Z8 J:return file. [; D  C3 _: \( p' x! Z7 O

    2 e8 E$ i; [" j( r: M& \0 qrequest.parse(; A' ~' \2 S( s1 i" @
            url='https://www.douban.com/group/explore',
      o  R9 T0 o! _: o' J, r    Parsing = 'xpath',
    0 d1 {. N0 P* \6 q# I, F, H    label = {
    ' ~6 H" t2 W+ A        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    ( `8 g! G6 q7 ~- \        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],6 I0 b8 n- d2 M& C' x# n9 \
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    ) H9 E) j8 g  Z( q9 R        },
    / p' `1 s3 D/ m) `    # 字符串格式,具体保存位置填写
    ( Y; b, y4 O; C* a! H2 z# x    write='result.pkl'
    $ }- R% }7 L  M$ T$ u3 P3 |).run()8 l" x; y, t) t3 d1 O9 o8 x5 }
    # return file7 J+ h" U  n( X$ ?
    . n4 C& c0 O" |- {5 L1 v( W' [( u
    第五种玩法:读取下一页 url 地址继续爬虫
    4 z5 @1 r8 s6 w这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~! ?3 y# O- }: R. l" x$ n1 Q

      k  z+ t& E4 g& @) `  R特点:- i/ @9 ?9 K6 p" B# p5 m
    继承之前的Parsing参数选择器选择方法。8 U5 A/ Z4 s3 p: A" D
    在这里可读取到解析后的下一页 url 网址。
    & w1 v  Q% t& L/ f# }" _# |) _0 ^" ?方可继续进行爬虫处理。方便用户使用。
    2 ]; a9 d2 F. _6 m7 P! s5 Y: h5 p; U7 n
    缺点:# S, l7 M; R0 M- s4 ~
    若爬虫时下一页 url 地址改变,便结束爬虫。7 @" x4 F, \) w4 H. W2 y8 f% \4 b
    只能爬取所给 url 地址中的信息。
    # ?' W' O9 @- ?. X* \无法进行某一界面的多个网页爬取返回。
    ! w( g; ~6 f* ?造成访问页面单一流失。
    9 k* o2 z8 U- c: [. y
    ( j  L& |6 Z4 ~4 _! i, r4 n, S:return None
    % i+ N( |+ x# W  L( w( n( G2 G. {7 W+ ~) H
    request.parse(
    + u6 O+ i" h) C9 G) N9 p        url='https://www.douban.com/group/explore',( X0 z- p# c/ h% ^
        Parsing = 'xpath',% V3 ?3 H8 Y4 C+ b  Y& k
        label = {. S& H* `( F. {0 w/ B0 j
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],7 e0 h+ Q& N6 e; v5 N
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    / n/ R. {, M' j- z- W! n. Z6 J* G        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]5 b0 h+ g& w3 H' ]8 f
            },5 \7 P& l: u- @/ T) I* e1 H
        write='result.pkl',
    # h" q4 i& ?* j  G2 k& L8 E( _    # 字符串格式,根据Parsing方法继续请求下一页a中href; p; ~$ j- A, R$ X) k9 k1 d
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    $ F  x0 s; q; e5 u6 Q- U4 |* E( u).run()
    . w; Q9 ^: D  E, d, V0 c# return None
    7 A& c- c: k7 A0 o2 ^+ N7 O9 R; z# Y$ p! I) t, e/ N
    第六种玩法:爬虫网页保存
    & s# P) x+ `" ]( I! ^听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!/ N% Y, ?* Q& r6 a5 b4 U* J1 {

    3 g0 S% p- g; S1 c( H! O4 P& a特点:
    ; P; S5 j: o" `* ]- Y" [+ x/ Q0 G持续输出断续笔记。; }5 G4 J- n! B: T. |, _6 T9 M
    将此次爬虫的 url 地址保存到一个文本文档内部。: g2 s: F9 u6 \  t( r0 H: k, N
    下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。- |" a/ A& k8 q6 \9 r4 ?

    & `; ?2 x& G: g: I* [3 ~缺点:
    ( w6 [: `* L3 K9 h. @- F读取内容不单一。
    " Z8 [) i3 H; I; k" L* Q导致下次爬虫无法正确读取上次爬虫留下的痕迹。
    8 L$ @0 B& k3 B& r0 R5 i3 L+ y' {+ v; ^) V- w5 E: }2 }  O* s
    :return url_file
    % g- B8 e( A2 r! F7 }  c* {! X
    2 [. `3 O) Y& F! mrequest.parse(
    * v  @$ X- ?$ {9 D" M    url='https://www.douban.com/group/explore',$ L8 x: b* D$ `' ^& R9 Z
        type_url='text',2 u" [9 u/ Q, _( }& [+ `! _
        #login='taobao',
      t5 h. o' \' N& I9 a    Parsing = 'xpath',  Z1 Z  H6 N% j$ V
        label = {5 r0 T0 R+ u4 t+ a/ _  G
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],3 o% \7 b" v/ b  }1 V, \
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    6 ^  e, {0 y5 ]/ Q& j        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    ) i- J5 z/ z  g        },3 v! J0 l* }6 q# g% [% M
        write='result.pkl',
    ( r. X0 e# Z# h9 @, B5 ]    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',! w, b. ?3 m% |- o! V& T
        # 第一个参数为是否需要断续笔记。7 k6 {; @8 H3 l6 I
        # 第二个参数为断续笔记保存位置。/ q- U8 j1 b3 u4 h' U' h9 k
        page=[True,'url_page.txt']
    ; ?9 C+ m! v, _6 s0 [" S4 |).run()" u& l! A1 I/ _  s' r) a
    # return url_file( k8 x- S. j* C8 B' ?# A7 _
    ' y' B" r* Q5 `
    第七种玩法:简单数据清洗
    " e# ?4 h" {% P* s* z数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。
    + Q0 }! h2 X( u& S& g  x! l& ~- P1 a* Q+ k# h+ a1 v" h
    特点:
    " X5 o# K+ K" C" m' p3 O: d本人曾写过一个底层数据清洗。
    % v4 h4 K: k/ h& T能将列表格式数据进行归分清洗。) X, G6 h; S- l  G
    主要内容请参考另一篇文章, a* ?0 G2 c8 C0 W5 ^
    如下连接:数据清洗6 b/ J" C% `" I/ e2 O

    ( p. v  Z" \4 x+ Q; g缺点:8 T( D5 D6 c) P; u
    数据清洗格式简单。
    8 M% G* N8 g" R/ T! p) }  o, Q# I% v数据清洗内容单一。7 [; ]" ^% X! V: H% T6 d
    无法完全做到绝对清洗。6 c3 ]1 {$ W1 Q( R0 D
    有待改善。
    - K' z% }; c. n3 Q
    ' X$ j6 z- m& F3 b' G3 }1 }2 q! U:return keyword_list, value_list0 T" ?6 O/ W+ N( k7 |

    " G9 l2 O# n1 b/ O0 i$ E7 A. Orequest.parse(1 @% ^* m' o9 O, Z$ |- p
        url='https://www.douban.com/group/explore',
    8 b' S1 ^9 X. z$ V; `# u; T    Parsing = 'xpath',. G2 i4 G7 R# O6 l$ N/ ?3 R5 b
        label = {1 G( `# k# B$ _$ m
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],/ v  t  t, Y  d
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],4 p/ i6 h0 U1 k0 f, Q
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    6 Q: j& R! A, K8 i        },
    + }' J4 }* ^, e$ ?* ?& l    write='result.pkl',5 V. m' O4 C  n6 P' c: F  T
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',, K# b0 b3 n' l6 O+ s0 P
        page=[True,'url_page.txt'],
    * p' o$ c; G' Z    # bool类型,默认不清洗
    * ]$ O' ?* \8 ^$ h, f" e5 c    clean=True) ~2 E$ m& ?0 W% U
    ).run()
    * {' l9 P: O8 t9 h
    : a1 E* O) M% @6 K, |第八种玩法:爬虫存入数据库
    : G) `' U5 p, x  L! ?; {存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。( t* @9 }! b5 }1 p0 B4 p3 W! N
    1 x6 |' H6 d! R# }$ y; m9 A
    特点:8 Z; ]! S+ B* B' \7 r1 x5 Y
    信息存入MySQL数据库。
    ; {; [: d- Y2 O% g$ a* @: N可连接docker远程数据库。7 h0 r) ?( F: p; P5 _% F
    数据库的库名可以不存在。; W6 H9 T1 ?3 |* f6 }: T* }
    数据库的表名可以不存在。
    . W% p% |8 [- i根据之前传入字典键与值参数判断表类型。4 a$ u2 `0 }& A: C$ l4 q, r; Z
    自由建立数据表传入信息。
    / I: r$ D; u7 L3 |, G9 T" ^/ ?' J0 Z) m
    缺点:: f. ?" f1 f# Q: y! R2 u" c
    仅支持MySQL数据库。- M  c6 N/ l+ O/ d0 d9 L- l$ V
    0 a+ h+ q2 u, u! c1 Y8 x
    :return SQL0 J( O. ~8 @! p$ `- i" X: U

    " u% A2 n. z9 c& |; crequest.parse(
    6 ~5 o$ w% M% T2 Q    url='https://www.douban.com/group/explore',7 p  b, r1 M  g5 z# v
        Parsing = 'xpath',
    / c  p1 G4 l# m  D- C) z" O2 p    label = {
    * m7 j; Z+ p/ w' {        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    , j$ R1 u) ~' ~/ l1 e        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],; y5 r) N1 f3 I0 w' V
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    - _  B, L" U% G        },' O6 I8 n# E% @: C( B: M5 M% s) J
        write='result.pkl',* ^# u- k  q- k- r/ h- F* A& A
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    $ }( o2 Z% J" ?# F, N    page=[True,'url_page.txt'],( P" E  E. Q- F) F; s; b3 n; J3 D
        clean=True,
    2 c6 g: }' ]/ c1 `; {9 S! h    # 字典格式,4 P# a" {7 p+ l1 T" j( c3 n( T
        # host可有可无,默认localhost
    6 a- {, C- J$ Z    # post可有可无,默认3306* e" q  M; Y' D* {  `1 q. S
        # user可有可无,默认root" N0 Z0 k7 T) j; H: q  p
        # password必要参数,数据库连接密码7 t. E' n- S, v8 Z2 a. L3 w
        # db必要参数,数据库即将存入的库名7 ?# b) ^+ @) y& I% E% ^
        # table必要参数,数据库即将存入的表名
    , r% a: G2 A/ c" D7 }+ b    write_SQL={
    , l% ^% J2 y6 }+ F        'host':'localhost',, z! @2 p( H1 d; Y4 r0 R
            'post':'3306',/ t7 R) T7 ~. u1 C( `8 c
            'user':'root',+ m- I( B" ]7 B% a0 z; u# C
            'password':'123456',4 _; _4 H7 Y% }9 i
            'db':'example',' I# y" a, z. `/ C/ d8 e! [3 Q1 f
            'table':'example'
    & ~$ V* Y& Z4 j        }- Y8 T* s% p6 A4 M1 h4 V
        ).run()" t, u& Q& t7 i4 }) a( _+ n3 `( [' E
    : @, i- ~$ R) p- ?. _+ ]1 N1 z
    第九种玩法:重新启动爬虫: Z% u# J# k# A9 K
    爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。5 P* C/ K! t0 b8 }* m; `' r

    & ?. `, D  |0 w/ Y特点:
    8 @' T) C, F8 g' U$ B检测报错重新启动爬虫, C. w0 N! ?- p
    无需手动处理错误信息! K0 }" M- `0 T0 ?
    # g: B) e6 S/ b2 ?/ s
    缺点:2 S$ c% A5 s( u1 g3 D5 Y
    无法收集子线程错误。) U+ k& ?, |) }  E, Q
    % l) p5 `' b1 r  A1 y. V
    :return None2 {5 ?7 k* C  C( ]9 r% m
    - @( F/ d; y4 j% O6 C
    request.parse(
    , ^7 O. O3 x7 u( S. c+ r: e$ A& x        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    6 g- G6 V4 r0 n: C4 b2 i        #login="taobao",
    / R) ^, Z7 U. M( @" P" `        type_url = "text",7 Y  U" D- m0 m  k! t" l
            Parsing = 'xpath',3 _7 B' K4 e% b) Z
            label = {
    4 _4 {: x' b0 Z            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],, @; U8 s! h% R1 }- S) O
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],, j- {+ [" t' V  P
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    - D. z6 x" ?- @. F4 Y; }6 {' T7 S* R            },
    ( u: O% a! [3 [3 D9 ]        write='result.txt',* Y# B/ ~' a! Q; G; @
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',6 n; A9 w. Y+ S4 D. o% _; f
            page=[True,"now_url.txt"],( M& t! \( }$ v2 u# T
            # texting 参数为是否启用连续爬虫4 {2 T5 ?* K3 n- f- m  M
            # 爬虫程序异常报错后重新启动爬虫
    5 D) Q( Z$ M! p" _& Q; H" Z. Y        texting=True,! f2 ]) n8 k* v; i: k: k. ?
            ###1 i" U0 e# m/ w4 Z2 ?
            write_SQL={
    " t6 O5 |) e9 F0 @$ m; D3 j6 d: d9 Z            'host':'localhost',
    8 m+ b! y0 f/ i* b/ G& @+ C            'post':'3306',, @$ u, A6 u3 v1 m; q( n
                'user':'root',* F8 v- N) M( n: N/ q+ h
                'password':'123456',
    * l# j- a# s, l. @+ ?' |( t            'db':'example',  f* U, j3 ]( {! o5 v) w
                'table':'example'3 j, p2 X- h& p6 W5 q8 \6 B
                }
    9 X& Q2 ]0 F6 o# c' `).run()
    1 Y, ]* t# k$ [6 J1 b1 I1 }3 }4 t% Y7 U4 l; T
    第十种玩法:多线程爬虫
    3 L5 E$ W* U3 X* q2 U' H特点:& k9 d: G/ [6 w5 a! g) s
    爬虫速度加快,
    ; T  r; I3 c1 E* n更好的利用了线程。
    * |; Y$ p( E+ ?. p# a
    / o. \2 Y+ @9 I  _/ B缺点:暂无; \) l) L& M7 i! e" f  d' B6 P
    1 g- H- G9 W  r0 u. Q# z% H
    :return None7 C& t! L$ y4 _8 x# m0 G! p4 A( ]5 N0 U- i

    6 E/ ?2 M/ O" n( K* orequest.parse(# b8 a6 ^0 }2 P/ A7 A' e9 o3 q2 P
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],) _) p  V+ V( }: X
            #login="taobao",  ]. g( _' q  Z0 [; k
            type_url = "text",7 ^% `$ v9 `3 h
            Parsing = 'xpath',3 V& R6 N/ W; C* K2 e
            label = {, q6 m4 S; l0 u% A4 o' d' f
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],8 A# e  |3 }$ x! Y- _; p6 I
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],, [1 g0 ]0 f) N" _$ [5 e
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    7 O2 m" [( l8 T8 @8 l# e            },
    1 y8 c  J4 O! G; M3 o! u        write='result.txt',
    3 a" A" Q- a2 W8 _        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',% O5 h0 G. a5 D# n: n  ?) b0 O
            page=[True,"now_url.txt"],1 B, \1 e- Q7 j- S# z/ h
            #clean=True,
    ( I! z& C, _1 H        texting=True,: H6 {& i( L4 |8 P( O+ n4 I" D
            # status="threads" 启用多线程爬虫2 H2 O& d; P& \1 Z5 q3 B8 x: F
            # Thread_num 为线程数目,默认为1 单线程, e$ |- z( b$ i
            status="threads",
    - ]3 c4 Z' j# Z        Thread_num=3,3 u  R; E5 v6 v6 _' I
            ###
    8 ^) B0 Y3 M# Q7 `; C. g        write_SQL={
    , g1 o2 `8 P* j4 t% ~; y9 x            'host':'localhost',
    , P2 P! @) o* r/ B            'post':'3306',
    5 v$ W- o. r& h* u            'user':'root',$ f! s: `! |5 Z3 @( F7 f; s: n* U
                'password':'123456',. ^# M4 N! L3 K4 r! l) a  Y
                'db':'example',- F! X; ^# _% V
                'table':'example'3 @. f1 g5 w$ i$ k
                }
    ( z/ V5 [+ s( J: B7 q! ]).run()( }" r7 B- Z0 M
    ' x& r; s5 I) l& O0 V
    第十一种玩法:多进程爬虫" A* J5 Y1 P  ?$ s2 [0 u6 b& P2 P
    特点:
    7 b" g; Q/ x' c8 g( e) {* c爬虫速度加快,
    , A$ w3 t# Y; [3 \2 ^5 e2 X7 s更好的利用了进程。& a% j6 E$ E6 y) I; M
    / }3 i, f. r5 i2 b
    缺点:暂无. V1 O0 J8 z* u2 y, L0 ?
    # q: c" J6 G: S5 ?1 b
    :return None
    4 g! k' q" r' B2 s+ ~- c  l9 E& v8 E+ \* g
    from simple_crawl import request
    ; f+ {- {! N4 V6 @' ]request.parse(
    ! l1 [7 I: H1 t4 Q4 T$ k) F        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    + {1 Y/ U( z' @7 K! ]  {" z        #login="taobao",
    7 y$ X( g: q1 p! W1 v9 _        type_url = "text",  a4 Y" \" }" \) `
            Parsing = 'xpath',
    6 H9 d; L4 p7 i& |        label = {
    8 s/ O; _! ^, A& W* {            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],' _3 h( T& H: A+ P
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    $ e$ o, C+ L5 U* c% q! F: g; }            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]# L9 H2 b( i* v! H$ b
                }," N6 h9 U1 @, J% R
            write='result.txt',6 n1 J1 S9 i* M: Q* N
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',% W  `* a( V, O/ v% F: d( d, o/ {! j
            page=[True,"now_url.txt"],4 Q1 S, [% V2 \, J8 P* N1 c
            #clean=True,
    ) I( N7 {- p4 [6 R& Q4 E/ V        texting=True,/ M6 b# K" @0 _+ @8 f
            # status="multiprocessing" 启用多进程爬虫
    / I5 ?+ E3 Q" \1 K4 P% [        # cpu_count 为启动代码核心数,默认为系统核数一半9 g: u% v1 U( W; V
            status="multiprocessing",
    & j, W) S2 U6 h        cpu_count=2,
    7 r  ^! \$ L& z! Y* \: H        ###
    & b) ?# ~& h" C* @! C: [9 `, K( `        write_SQL={, n* d5 s+ K5 T
                'host':'localhost',
    & |" p4 H1 T6 G7 I            'post':'3306',
    # i2 C) p0 S6 b4 _, w            'user':'root',0 x+ e* B5 C& i7 y* x' _1 b& G. Z
                'password':'123456',2 f7 N, b8 I9 p! f
                'db':'example',
    % J4 U0 }, O; z) \9 a1 h  P            'table':'example'. X+ R5 q$ ~* F# u- r: ~
                }; T4 b9 U4 y) ^* c
    ).run()9 N4 j- f! j4 z! n: X6 v2 J

    5 z7 x4 y9 D- i' V9 S5 L第十二种玩法:异步多线程爬虫
    & _( o9 i5 G( U) p; K' s特点:2 o* p3 R# |6 b
    爬虫速度加快,
    - `0 P6 D# f% @' G% x, s+ G/ g异步使得爬虫无等待时间,( r5 o$ N5 u- W" S9 z. o1 s
    同时使用多线程速度明显加快。
    " j" F) y9 L8 O+ x! L0 J
    / Z% [  h- v+ X2 E3 H缺点:暂无
    8 k3 f1 Z" U2 l' B& Q( T
    0 T, y' U4 }! r# o6 m1 B! j:return None. e! A4 C# X+ c9 k% r  X$ j
    + y! O  O/ V3 l. P4 A8 Q
    from simple_crawl import request
    ; u4 C9 X. `# trequest.parse(% u- {3 o3 }0 E1 o
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],2 |3 A; n- y9 u+ v: r" @8 u
            #login="taobao",, ~$ S; \( J; G2 W  U+ G
            type_url = "text",- V: e1 z! ~) m) f$ W, C5 ]
            Parsing = 'xpath',( J- q5 S" b* }& p
            label = {
    " I! ~8 P$ e; Z. }            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],0 r3 |& L1 F1 u
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],, g: g7 R2 ~" Y3 v( V
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    , ~( o' f1 ~" X- ?/ q$ \1 Y9 l9 p1 m            },
    9 O" B7 Q4 s% j8 {  r+ j        write='result.txt',
    9 ]2 u+ B& x7 d5 b        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',9 Y2 U3 x7 ?7 k1 T4 z# t+ o5 `* o
            page=[True,"now_url.txt"],
    % V! @0 f1 [8 r3 s1 O7 V        #clean=True,4 I, V; R- a) T7 I7 n; }
            texting=True,7 P5 j, H5 P! G; }! [% Q
            # sem 参数为异步引擎数目,默认为5; a8 m( n5 E9 @! N/ Z, m* P) g$ x
            # 其他参数同上
    : E6 N3 t: l# ]- A8 F0 O5 r9 g' i        status="aiohttp",
    ! X( y3 ?: K6 q% r9 N2 j9 z        Thread_num=3,3 w8 i3 x$ o5 b- ~
            sem=5,6 O2 C( r) m7 I% e% |
            ###2 Q: d3 P' ~3 w- ~! V. b  k
            write_SQL={3 c$ s, T: h# c; I1 L" @
                'host':'localhost'," B( Z3 E+ U% M( M4 f8 T% t9 @4 K
                'post':'3306',; r& J! k1 Z5 Y: \* I2 g# ~$ |) i
                'user':'root',. d& {! ]: S5 T6 e
                'password':'123456',
    0 K' z' E2 r  R! `( n, f            'db':'example',) d' x+ C7 D* K0 [- K% M
                'table':'example'
    5 Z( X9 E4 y: @7 F            }0 g: E( E; l! O+ X, }5 g0 f
    ).run()
    * H6 Q6 v# m- l: ~& T
    6 s; q# n' ~+ r. ?* M+ J第十三种玩法:异步多进程爬虫: @7 P( \6 C* _/ }3 k
    特点:4 A2 G. z' A! k& p" `
    爬虫速度加快,
    % ^3 T. M* N# h+ b1 c; @, G异步使得爬虫无等待时间,. ?: r- y5 J7 w, c8 s3 I
    同时使用多进程速度明显加快。5 g5 y: _9 ?" o! T! a) G

    ( L( p' L; b/ o# o' t缺点:暂无
    + \% O) F& R0 W/ Q
    ) _2 i4 L9 `8 V9 w' d; `5 a/ A* T+ d" \:return None
    ; E! g8 J6 M6 i# x* R# @" y' d0 I7 L7 C  Z7 c) c; ?
    from simple_crawl import request
    0 q. W, \4 p0 ~3 u: d" `request.parse(5 t: y. C8 f: O! O  u  w6 q% G* n% L
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],! @+ I5 O% {7 A/ X& g0 V% D( f
            #login="taobao",
    ! J4 R) M; s5 y/ |9 {        type_url = "text",& r$ }* m# K$ v% d
            Parsing = 'xpath',9 r; f6 d7 v4 c6 a2 C
            label = {
    # G; ]8 Z! `: z/ R            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],5 y% _0 r' V/ X
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],) z. E6 v' ?6 ]% w* T1 D
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]& W3 k0 y" r8 Z1 \. i; s
                },
    - d/ h5 q4 X/ N! h$ O' m# Z3 g4 l  F        write='result.txt',/ m2 G5 y# \9 x; a& Z
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',* m+ H' ~1 t% g+ `) W$ v- @
            page=[True,"now_url.txt"],
    7 Y: |# P9 u. B8 F( a% i        #clean=True,
    8 @  D* G7 W5 F& K2 Z        texting=True,
    1 m' Y% K( ~0 V6 D; n" z: G# G1 l        # 参数如上( Q: }) x$ n0 X2 [$ P
            status="between",
      q% r/ W2 E" @3 I6 g, j3 O7 ^        cpu_count=1,
    ' i1 G- B! R6 `, f1 e        sem=5,
    * H$ A, W( n: f        ###" r" F5 Z5 G! b) x0 H
            write_SQL={
    / {8 o% P$ n! X9 J5 G5 _            'host':'localhost',0 X7 I$ h' m% D3 d/ y
                'post':'3306',
    . j+ x/ A" L: j            'user':'root',% E3 F, B! \, \7 b, D$ ~. }
                'password':'123456',
    ( t: [, X$ b# e5 ?" V            'db':'example',
    ! H* @) ^7 U4 M( G( ^$ N            'table':'example'- L2 x! O, z$ P! r2 q! P+ O, |; K
                }
    5 R$ B/ ]: O; k% Z. n7 t% ?% z# _).run(), e- }% u" x9 x: W" @7 s' n+ U
    ( F2 ?2 m- |; _& p) o' O* `6 E& M

    + F* c3 ]# K: d1 L- y; M9 M* m% r功能介绍完毕🤞
    * n8 K9 r& Z! x! V最后还是希望你们能给我点一波小小的关注。
    . f- W2 l" \4 P8 E奉上自己诚挚的爱心💖# p( L" L5 E1 @( Y. U9 U
    ————————————————2 U( A( w5 h+ h' J, J
    版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。8 l$ q: l/ K& x5 F: O+ s
    原文链接:https://blog.csdn.net/qq_45414559/article/details/106005684
    3 i$ G# P' v* Z5 e2 [6 f) g$ E1 Z1 b

    $ f" n5 y: j' q# q8 S' c7 [
    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-7-28 04:30 , Processed in 0.516184 second(s), 56 queries .

    回顶部