QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5553|回复: 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
    - N: y0 Z+ E# jsimple_crawl' G4 }% T& m! F8 y
    仅需一行代码即可达到爬虫效果" T$ j0 t# z0 B  e! Z, z, l, o
    项目地址(欢迎star):https://github.com/Amiee-well/crawl' G) F* m- h) r. f
    使用方法
    ( N) w4 b) b  g; _pip install simple_crawl
    & q  U" x$ ~0 O7 x5 O$ N7 Q+ ?# ~) I6 F4 H
    ### 以下源代码为简单介绍,详细功能介绍再源代码之下! u8 \% F0 Q) Q- ?/ R
    from simple_crawl import request+ Q" U+ h2 L1 \) l
    request.parse(+ T2 n) ~( P! W( ]% }9 a$ }
            # status 参数为运行状态,支持单线程多线程多进程协程以及联合& `! m/ `* G! D1 i* E3 J, r
            status="aiohttp",$ f8 h4 `- Y( k8 s" m) x6 }
            # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式( x" P: S8 A* G6 g0 d$ a
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],3 u; E) h% T( `% z* d, Y! S0 r
            # login 参数为获取登陆信息,如淘宝等网址需要登陆信息/ }7 c: y8 {( V9 C
        #login="taobao"," u- B4 O! @2 N8 Z4 f9 m6 t+ x
        # type_url 参数为返回源代码格式,支持text和json,默认返回text3 y# P: l) V* X& C
        type_url = "text",. C, @  \) z6 X) Q/ E
        # Parsing 参数为解析方法,支持re、xpath和beautifulsoup
      l0 F7 `. A& {* I5 c    Parsing = 'xpath',$ i! h& b) Q/ {- m
        # label 参数为爬虫解析过程,字典格式,详情见下方
    + o! \% I! m7 c" O! L    label = {6 U" l5 l. H$ @' p1 t2 _& R$ G
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],) ]9 Z0 P# @) h3 W1 T+ X! ~
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    $ x9 ]& Z. r1 v  W            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    7 y' D4 V7 j7 h! E3 C5 k2 W     },7 ]6 d4 H2 P) y: Y9 D7 X
         # write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱
    0 }3 K* q" Y2 c( w; e; R1 z5 Q     write='result.txt',; l# A) t( x8 P( q
         # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫5 w% r# u; r( Q! n' I* o: k  Q
         next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    2 d4 y2 l. k* l. g% _. t" U* {     # page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫1 _; B2 @- }- z4 _* R" j" j. [8 \. ]: w
         page=[True,"now_url.txt"],
    ' `. l1 b; [/ Y/ j     # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息
    7 o6 H0 f0 e. I" u5 m. J& L* c     #clean=True,! a  \  t# I% {$ L! `3 b' F- r
         # texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序7 g) }8 P, y1 F' _
         texting=True,! Q* r# D# \" b  C! a
         # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态1 q# {' b, W3 F! B
         Thread_num=3,
    + P# }) R; K' J, g* B     # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态
    2 x, b$ h) J3 d$ U8 S     cpu_count=1,
    % i- ^) d, S1 e/ B$ a5 W# C     # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态
    * _6 i* Q% F/ L8 T     sem=5,$ j. \8 p: R! F, ^* ~1 c( \
         # write_SQL 为是否写入数据库,默认否
    2 l, H7 O) {1 J  p5 C     # host 参数默认localhost
    - Y3 M* L& ^& n7 P6 |0 H0 g     # post 参数默认3306
    ' X6 {7 `- \& l4 N; t     # user 参数默认root
    - O2 U3 s& |1 _, J     # password 参数必填,必须正确1 R/ a' q" z# W; t) M/ m
         # db 参数为即将存入的数据库名,若不存在自动创建
    ! ?, a( O4 Q0 U6 M2 G: F1 n     # table 参数为即将存入的数据表名,若不存在自动创建
    / `7 z/ t4 j8 o" ?. S     write_SQL={  Y- y( y7 m2 z
             'host':'localhost',
    5 {7 j* s8 T2 i4 _% @3 Z         'post':'3306',
    : \( {" V  u/ z& a: t         'user':'root',
    % ^- F. I& w5 h  }         'password':'123456',/ X/ O% v6 w. Z
             'db':'example',4 h" m. J$ U7 u$ ]
             'table':'example'9 G+ S! h* Y  |$ B, e7 Q: ~
          }
    5 }; w/ w6 b# t).run()' n- B5 Y! T( _# U4 S0 |, q
    ; c; i) \$ o# B' Q8 U
    介绍一下crawl参数设置:: W" [" M1 K5 b4 G4 h1 D8 J
    6 W# a  l* j# F7 F
    '''/ ?- O$ `+ H4 e. _, o& B5 _5 }
    单行代码爬虫程序执行
    ( L% r8 m) f# n2 g8 Y+ ~, ~:param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档
    + l; O8 a$ x+ R. U' {1 O9 i:param url:即将请求的url地址,仅支持get请求) H; @+ L. u& V+ N, d) n
    :param type_url:请求url后返回格式,支持text和json格式返回
    , Y, x+ c( |2 T! t: y5 y) S" j! B9 I:param Thread_num:即将启动多线程个数,默认为1单线程
    9 E6 [( d. f; e, V:param sem:协程信号量,控制协程数,防止爬的过快,默认为59 x# U. q3 g' f- F
    :param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半* o( V0 Q* U, u( y8 s
    :param login:模拟网站登陆,保存登陆信息
    ( c4 V5 {4 `. ^:param Parsing:爬虫方式,支持re、xpath以及bs4方法
    6 F, I) a2 l% J% `2 Q- t2 w( M:param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,
    : X' f$ T; E7 ?' J& w  v1 `                       多次报错结束程序,默认否& i5 e2 U$ \+ S1 ^$ _* w) Y
    :param label:选择器内容,字典格式保存,
    1 h1 e; V" r9 t8 S2 `" Y* a7 s4 t                     字典值为列表格式,第一个参数为选择器,第二个参数为转换类型4 T: ~: K  l, W; f
                         第一个参数必填,第二个参数默认str类型
    # s; W8 {0 u& t! [+ z1 {" i1 `:param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否! ^% G5 u9 K, t# N+ X
    :param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫0 h" a' ]4 }  V- J: c6 E
    :param page:是否选择断续笔记接手下次爬虫处理,默认否5 Q3 p  V5 N$ l
    :param clean:是否进行简单类型数据清洗,默认否
    : N9 l" P% c2 q5 t; W3 c:param write_sql:是否写入数据库,默认否
    $ M' C% g  u1 D  S$ _1 @                         'host'默认为'localhost','post'默认'3306','user'默认'root',
    9 O8 F7 l* D1 m. f! L; U7 G                         'password':'密码','db':'数据库','table':'数据表',
    9 D) B0 ]7 _0 R- m! k# i  U                         检测库是否存在,若不存在则创建,若存在则直接插入,
    : E) K) B: L  D- Y# K                         检测表是否存在,若不存在则创建,若存在则直接插入
    6 |1 k0 {5 {2 y3 L& p# \:return True8 @, I( ]' K+ m  w( E, F
    '''
    6 @" \9 `+ U" x: ?介绍玩法2 y* I7 N! X) b' }0 L
    接下来介绍的均为调用第三方库的情况下运行:
    $ w  i; |. m; n. q
    " }! H+ x, M7 `% Gfrom simple_crawl import request
    9 \5 q& A4 s" X, ^5 z/ D7 e5 `第一种玩法:输出源代码+ g- V% l4 v/ Q4 M
    调用requests库进行源代码请求。
    1 T/ Q% Z9 r7 M1 T$ t& J6 Y: Z9 p8 U# ~( C
    特点:
    / s; {2 ~3 _# L3 q, ?0 j请求失败则调用ip池处理重新请求访问,
    - e' e; f2 M, |7 M% g7 A. b出现五次失败默认网址输入错误。' q/ u+ `; c/ c; K! ~
    支持text以及json字符串返回。默认text。
    7 k1 q, Y  o' C: {% y; ~! H: \6 J7 `9 A6 j
    缺点:/ n$ j3 W2 S& c8 ?" X% h% d
    暂时只能进行get请求,不支持post访问; B, I. m& a& \, S6 v" a1 G
    $ i9 e0 z& h- @6 ~; i3 x
    :return text or json
    - Z& X, u. x2 X  P* [0 l7 c
    : g# H0 G* {3 `# G. B1 _request.parse(! Z3 U! o5 C8 L/ {2 K
            url = "https://www.douban.com/group/explore",# s$ q! w1 h9 h* B8 _2 W# R7 I, y; v- C6 q
            type_url = "text"
    1 s) u/ w5 w8 Y) H).run()# s/ s! |! N0 R; t8 S
    # return text
    1 E+ \& p! X  Z
    - i9 V2 y: R6 u" d0 A第二种玩法:模拟网站登陆并保存信息
    * z6 U5 n. g6 e7 x调用DecryptLogin库请求登陆访问。( [0 r: N, z# X1 ~; H5 U& F

    5 x/ g2 q& h- _6 p( p7 pps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源+ C( p1 K7 s5 Y7 b' p3 X( S
    在此放出文档地址
    . y0 s' r3 M$ X% ^DecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/
    : ^2 Q" N. h7 D# }; X2 X8 @; Y/ A9 H
    特点:1 S1 }; F. R" }8 @
    将DecryptLogin库中二维码继承到此库(非二次开发)
    ; V- p- K0 @% I4 {3 ^支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆)6 i9 v; @0 G2 y6 z
    保存session.pkl信息到本地方便下次登陆运行9 v: ^! T+ F. T2 @# ^# l5 y
    & i) ]" e' @7 J9 \& C3 f  X/ s1 N
    缺点:8 c; s0 p1 L' @6 s! W
    session.pkl登陆信息过时无法自动删除。
    & }- M6 v$ q- A0 Z  Q; s: I! h# L5 U导致下次登陆疑似cookie无法正常登陆。
    1 h  t& j" Z( U0 m+ j$ I  R. e
    , p4 V* n0 y# s, F* ?, O# q: X8 S:return session& m% j" B' W( p& g

    # S* w; |  T( Frequest.parse(3 e' m6 I, W& C, C1 {/ ~% b
            # 臭不要脸的推广一下我的店铺
    . s: R/ d0 Q: ^! e+ |8 y' E        url="https://shop574805287.taobao.com/",
    3 G; d4 U# g1 `3 q( D" P        login="taobao"8 L1 q8 S% `! }& R9 y* U2 K
    ).run()& V. v, a/ |7 N0 \
    # return text
    1 T/ z( ~4 ?- R; `+ z% A; y2 }- |
    % K8 {- g4 P. @: t- \第三种玩法:爬取网站信息7 c9 x0 [' l( o! E) B6 ]# U
    爬虫库自然少不了爬虫的过程" V' N  O$ i. K- Z8 d9 c5 b( ^

    & ]$ P% V% ~7 n+ Z" Z# t8 b特点:
    ' x+ p- @8 c. n6 {0 z4 R% ?支持re库,xpath解析以及bs4选择器。3 t4 J! D: I/ {, @
    爬取方法为字典格式。单方面输出。; a3 s7 A8 b% k) e2 d) H4 X
    字典键为保存的字段名称。
    ' w1 q* a; b+ W1 q; u- S字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。0 u1 _- q& T6 j& K% E: X

    * P+ P$ J% x5 B0 f缺点:暂无(等待小伙伴们发现); c3 m6 d/ W/ o0 }8 Z$ @
    9 }( ?2 i3 t. f$ p- `. F1 O9 a/ T
    :return reptile_results: |  v" T% x$ j% a" i

    $ L' w, ~  Y% H5 r( P! A: jrequest.parse(; f7 m- Z/ E* w% l6 T
            url='https://www.douban.com/group/explore',3 C5 `  R# q9 O2 S7 m
            # 字符串格式,选择器方法。
    - f- `& n" d2 }" }1 ^: C: M    Parsing = 'xpath',2 F5 U( h3 A$ d& Q4 f) C
        # 字典格式,参数如上。$ Y, o; ?  @! Z) f& T, X
        label = {
    * \5 t8 x9 v8 k8 a* X: R" \        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    # S  A3 x. o, y( ~        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],  g0 N7 ^( F' s. \
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    3 k( m5 H4 M: b3 a) }& X        }$ n- \  l( e* [$ v
    ).run(): ~) `/ |" @  N1 m2 v6 h( t
    # return reptile_results(list)
    7 k/ {! o2 F  y3 E3 {6 K' P% \2 F+ A0 A+ K  p
    第四种玩法:自由保存信息
    9 d! v. A% w: ~5 j# q4 W目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。7 l0 z* T6 v$ d7 F3 f8 c3 N
    * ]/ ^1 k; L6 ^+ N" }! x. J4 J8 ?$ q
    特点:
    7 i4 ]  _. |3 t( c( X0 N  U) v/ P写入文件均为数据格式传入文件。
    ) d5 B5 i  m) W* f( l7 p7 Q" o3 Z) `且输入格式规范方便阅读and省事。
    & D( v; M$ T, S& i: k8 X
    2 H, [3 B( k# `6 C5 l缺点:
    6 R' }! j9 @: S; `# v- i保存格式仅四种,  s* K5 H2 t6 L4 x
    不方便用户之后读写操作。7 z# @) S# D. W1 F

    2 T7 Y/ V$ U' ?" y; N( y8 i' h# F:return file
    + j5 C, j; t4 G- g0 a# }& t7 S+ @
    + F% t# O/ T7 D+ k3 T5 r4 \6 n9 Y! u! d5 ?request.parse(* n5 ]. x5 k( y5 z* }# a( A  S
            url='https://www.douban.com/group/explore',7 B. P+ J- |1 R% o6 H7 U# ^) M
        Parsing = 'xpath',
    : @5 D! @  v& G% X; x0 \: d: o    label = {' a6 s+ _" Y; f- e5 T1 u4 x7 A  K
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    7 T  g9 G/ |- @# [7 Q' I  _: z) t9 k        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],- Q' @: Y7 F. A; i0 R* h$ S
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]0 h4 k0 O# u5 c$ t8 z, Q
            },
    ; e* ^/ w, K6 Z/ D7 @* s* ~& R    # 字符串格式,具体保存位置填写
    4 c# b1 j* W+ ]$ |- H0 _. T8 u    write='result.pkl'% M- _: p# p0 d# O$ U" u1 }
    ).run()$ g. D) u' B. Z! l( h' \( R
    # return file( V! z) t7 l$ ?
    + I3 ]( W  [! P% x1 ~9 ?
    第五种玩法:读取下一页 url 地址继续爬虫
    2 ~% W# @% h# i  y% X/ S9 F7 }这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~' {3 H* w  Q* P  w4 ?1 h( h* Q

    " r- ~6 O$ n" \特点:
    ( I6 k+ K! _% d4 H; \/ _- |5 L继承之前的Parsing参数选择器选择方法。
    ' j. b3 g: \3 e9 X& A在这里可读取到解析后的下一页 url 网址。5 O8 _1 E3 ~* \, V0 ]- R2 {
    方可继续进行爬虫处理。方便用户使用。
    8 |+ A) N# K* j( o7 v1 I4 \4 h* h3 U- }3 J  n
    缺点:
    , O  D1 ^, c" i8 i' ?若爬虫时下一页 url 地址改变,便结束爬虫。/ X- c, h0 r1 Q/ r
    只能爬取所给 url 地址中的信息。6 ^% t5 D8 y3 v, R- {( j& \
    无法进行某一界面的多个网页爬取返回。7 F9 k: e6 B( }9 U3 s
    造成访问页面单一流失。  N" Q/ Q4 }; z8 {. ^& T

    : w" i4 r, n- L:return None- t# o/ z7 ^5 Y6 I/ A* }! h

    4 E' `9 z! s% D2 wrequest.parse(
    ; J9 R/ `# P: f! D) s: d        url='https://www.douban.com/group/explore',  H7 Z  M6 ]4 @+ Z3 _
        Parsing = 'xpath',: X, {* q! q# X! I
        label = {; Z) {- A! m: g4 W
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    # j: ^& T9 A. r        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],% @- p( t- F7 D; Z3 C
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    * ]- p% h6 I: R+ e: L        },* ^! O+ K) f; @5 S, O
        write='result.pkl',
    5 z' X  A. l3 r$ f+ k    # 字符串格式,根据Parsing方法继续请求下一页a中href
      ^! Z' K  T  d: c9 K    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    % y: |! C: o4 p3 J).run()4 \' z8 }0 `/ h+ }* a# P5 {
    # return None ! x5 T6 e% R# t2 m
    . i- j! v! c% F; Y
    第六种玩法:爬虫网页保存! ^; M2 g) Y! D1 N: j
    听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!* W. S0 C: [2 a$ F

    9 R" ~" t2 s/ K  a+ b3 [特点:+ b0 D( ^+ `- _6 v
    持续输出断续笔记。, N% C! @/ d8 T' B
    将此次爬虫的 url 地址保存到一个文本文档内部。5 Q6 f+ U. `) L+ M" z# M* e
    下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。
    , |2 A+ p3 _; f) S, n
    & F& L0 ~# p& e: a7 Q: w7 Z缺点:4 V/ P, q9 H( T! m% p" I' R' Q% d
    读取内容不单一。
    . z$ D* E" z$ U% k导致下次爬虫无法正确读取上次爬虫留下的痕迹。
    % H8 k5 I$ n3 q; j8 |2 J2 M0 _8 V2 d, G  H4 q3 m
    :return url_file
    - k5 G4 {% ~6 Y4 H+ E
    ( n2 `( y4 U$ j% crequest.parse(
    ( ]+ ?* A, u7 |: k7 C    url='https://www.douban.com/group/explore',
    7 w! y6 w! M4 }9 g    type_url='text',% a" i, v) [2 D0 v
        #login='taobao',
    6 ?0 K! G: p) `: P  F0 v( n, l! C    Parsing = 'xpath',* M: V6 O. P3 ]7 u: }
        label = {2 Y( f+ j& K) I' u0 w
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],: k, p) }- }1 g
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    8 v3 c. Z9 {$ X5 X1 P0 @# R        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]' _+ A# o: [# B; m: s+ h- G& e
            },. ^) f9 r0 h, W  o4 M# I1 t
        write='result.pkl',( j6 H9 \* G6 k7 r3 i8 m2 p8 G6 T
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    : ]" _* L1 L; i    # 第一个参数为是否需要断续笔记。
    & l" t) O$ r* r8 B, ~  P1 Z9 e    # 第二个参数为断续笔记保存位置。$ o6 z8 Y5 g6 _0 i
        page=[True,'url_page.txt']$ e( ]! P: @" L. w* Y
    ).run()1 }# i4 ^$ T* L7 X8 L) p
    # return url_file
    ! F' x9 z1 B/ m0 H. Z8 O. u" V- G( K7 r- [6 Y2 Q
    第七种玩法:简单数据清洗) g) S  B/ c% A& `
    数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。( H1 S, h2 j* T( c% P$ S' `

    $ j9 H& z' E) H% r/ ~4 h  U特点:
    * e3 A$ {( o4 C. w  H' n本人曾写过一个底层数据清洗。( v: e- V# B  w9 f& g5 _) |
    能将列表格式数据进行归分清洗。8 d) F# {& b, Q6 D) y" e$ w5 [# R
    主要内容请参考另一篇文章
      J( x4 O( A6 E: M" ~: |# C如下连接:数据清洗
    4 r$ s" ]1 T! b, q) n( O0 q( j6 ]
    ; M  |% @! s5 d6 s缺点:( \) l2 K: x, w8 h' M+ Q0 ]1 q
    数据清洗格式简单。2 E) _5 T* `; @
    数据清洗内容单一。) T: Z2 e8 p4 I, d  e; G
    无法完全做到绝对清洗。/ y4 z- H9 o& q8 q2 O' p  n2 T+ z, Z/ T
    有待改善。
    4 @% s# x3 r* g+ n( D" x; Q! Z( e# `, Y8 T6 S( H3 U' t
    :return keyword_list, value_list; J1 @. O3 a3 f4 U

    & o7 A  l1 |3 g* Y/ Hrequest.parse(0 `4 L) @9 y" H# C  z
        url='https://www.douban.com/group/explore',5 K) |; ^. O+ b# ^; G
        Parsing = 'xpath',( |' [$ v0 a+ L) z" I
        label = {$ E' Z  L) ]) e9 v8 {# k2 ~
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    4 u" \7 {* o5 H1 E3 F9 s0 r5 g        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],. \) B+ r! c/ v
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]- D- l! p$ n! q1 O0 w+ M/ e1 V  d8 L
            },+ r1 W, E5 o6 T& ]  _
        write='result.pkl',+ x8 o; @! V( D/ K) \
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',% a# Q6 {' k& y0 r( {, D' T
        page=[True,'url_page.txt'],
    8 ~! q2 b. _, @" ^! D  B! M- `8 I2 ]    # bool类型,默认不清洗
    * Y' E4 {# x$ h    clean=True
    3 T, w1 c' i' C2 G).run()5 ^3 W2 }0 |5 U* }$ e

    9 M$ E3 `4 }" s) L% U% f8 v第八种玩法:爬虫存入数据库% Q& p2 k( a( Z/ p6 O; ]2 C
    存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。' \% _. M% N$ j: O
    2 T, k  I6 Z% n0 Z7 P% Q% B1 N
    特点:1 b, j0 Q1 A2 l: \# `' S% B* {
    信息存入MySQL数据库。# X8 x- f& S3 S" t' d
    可连接docker远程数据库。
    3 I1 i$ m' i4 z. u# B9 T# Z数据库的库名可以不存在。
    , j3 G- ]7 F3 |: `2 S4 B. N! W  L数据库的表名可以不存在。
    ' Y% `  e" d5 q8 Z0 Q1 o根据之前传入字典键与值参数判断表类型。
    / K! i9 E, F6 ~0 T自由建立数据表传入信息。. S7 r- y2 K$ Q; P$ ~
    % i/ ?8 [# o% ^* R9 {7 x& X! o
    缺点:8 K2 J, }) n5 q6 {; Q: ^
    仅支持MySQL数据库。
    ; I% t! K/ [7 C/ n7 W3 S2 x3 \# F4 a9 o$ f# Z
    :return SQL
    5 ]$ i0 [; `# p! P8 {, M5 J7 H3 ?6 x& E+ u# {
    request.parse(
    2 T" o3 [8 M" b1 [; u. r    url='https://www.douban.com/group/explore',+ s" I! H) ~  A/ r
        Parsing = 'xpath',0 Q- K) L7 x7 ^( F* O/ Q) d4 X. }/ H
        label = {
    2 A! u% Z: [2 w9 v# d5 D) M        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
      M7 T4 s; J: z2 A        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    . B/ a8 u5 ?1 l4 _; |; {9 r        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]; L! g6 z6 |, C$ L  Y2 o! U. f
            },7 g8 h& Y' M: G; Z+ I$ k; d
        write='result.pkl',
    % O3 u% e; x2 p4 W* x    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',9 ^3 i9 L! ^6 g1 R- h8 O( y# v
        page=[True,'url_page.txt'],' G6 a. w) \( v+ q% n0 r4 p" a0 u
        clean=True,
    " @8 `! i8 o/ o% C# \    # 字典格式,
    8 u, N6 W  \6 Q( a& f% c    # host可有可无,默认localhost6 N/ S6 q  o3 l. @: c" v1 ]+ k
        # post可有可无,默认3306
    1 M5 Q* q5 u9 ^% g# ]9 C1 b0 V5 D    # user可有可无,默认root' S4 e* g  r7 t' Q
        # password必要参数,数据库连接密码
    & A2 h0 u: z) N/ D* ]& x+ W    # db必要参数,数据库即将存入的库名  ~' }& K! T  [) R9 e+ U
        # table必要参数,数据库即将存入的表名+ b- \& E2 ~# D5 W
        write_SQL={
      n' P8 w( X" e& o        'host':'localhost',
    . j4 [" h6 L3 L! n& ~+ e5 h1 y4 y        'post':'3306',6 S' l( B0 X, x5 R& B; M- m, `
            'user':'root',4 }! ^0 G4 L4 _/ o5 s
            'password':'123456',
      |1 n: U9 y$ y        'db':'example',
    , a$ K8 ?& e5 B7 Z        'table':'example'
    3 R" J8 v6 q$ f% Y9 I        }
    9 B8 e' G7 o5 k7 b) l5 P; j, c, d# q    ).run()
    ' a' l- i$ x# |/ E  y4 `2 u4 u& O: }: \
    第九种玩法:重新启动爬虫5 v. H. M8 [3 U6 G
    爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。; p! r2 u1 K, z( j7 d3 o
    3 t* l6 q. k, b  t" G$ E
    特点:
    * o9 U3 v9 a1 A/ J. s7 k检测报错重新启动爬虫$ L1 ?) v+ R+ G. v! N  X; K1 b' T
    无需手动处理错误信息7 T' a6 H1 ^$ b$ d

    2 O1 q$ i( L! s8 s, C# w& ]5 ]缺点:
    - V- {# q- _! a7 e无法收集子线程错误。
    : o) V$ ^% e8 e3 J2 [- z% [8 ?: J& B4 P
    :return None! k, u% v  f1 N# Z4 V& k

    9 z; P- L9 K9 Grequest.parse(
    8 L) o1 g7 o* h/ q        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],3 @* `( g) N; E$ F) o
            #login="taobao",/ V, X6 R2 K4 Y- @& x) d( w
            type_url = "text",1 l, Q" q7 n. K: Y% ?2 D
            Parsing = 'xpath',0 B, f6 h: r! g8 w+ X6 o, `+ p
            label = {
    + H6 K% a4 z8 u5 u/ n( }            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    : Y& w/ y8 \/ p- i3 z            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    ' ?2 Y4 R  H2 D0 C5 A. l1 `& I( H            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]. N3 ~1 ~9 \2 U8 j
                },5 }3 F$ i3 K' X9 y$ `) G4 |7 H
            write='result.txt',! n3 b$ c- H) g9 `% ?4 i7 D' Z) i% {
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',' z6 U6 }2 Z% h; {1 l
            page=[True,"now_url.txt"],
    7 e9 W: Q6 W8 O        # texting 参数为是否启用连续爬虫
    $ z! F# _7 s$ L0 }! F        # 爬虫程序异常报错后重新启动爬虫; t/ N4 b/ \: S6 K* K3 |" f
            texting=True,9 n1 ]. @  A4 M* A
            ###' Q& N3 `* ~( [. X& Y
            write_SQL={0 n- ]9 J( v8 w1 q; P0 \
                'host':'localhost',( r1 R. _: H7 S2 [/ y; l
                'post':'3306',9 O  V9 j! v) g, O6 k- g& Q
                'user':'root',
    # K% b: ?6 U  k- j            'password':'123456',
      X5 p- g7 y0 S            'db':'example',4 |5 h/ E* G$ u3 G! `3 Y  S# a
                'table':'example'
    ' M8 H$ @. i2 L5 ^6 \            }$ x0 I( ]; u- Y# F0 j
    ).run(), ?2 Y% R8 `* r% L

    - ^3 l8 g' j. ]; s) E9 ?8 ?9 H第十种玩法:多线程爬虫" ]: U6 s2 v; ?6 {
    特点:
    ! O/ M% ~8 _$ `% O* r爬虫速度加快,% n4 @/ g; U4 P' L9 N0 Z4 E' O; p
    更好的利用了线程。1 }; x, I3 `' F: D, ]
    + Y  e: V3 k6 k* W1 ?" J
    缺点:暂无  _& ^7 e4 w+ T9 Z

    5 i- t/ k  Z: g! ]$ {:return None
    , d3 s$ u- v7 ~/ O9 n0 S0 Q
    ' z! i2 ?6 z9 n9 i# z( Irequest.parse(  q6 \# H  b% K  s
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    # ~7 h" B) Q# }0 a- a        #login="taobao",
    , b4 w2 |. F- ^) j3 r" K# n9 D        type_url = "text",
    * G, |4 j! N1 r1 j        Parsing = 'xpath',7 _3 c2 \$ g2 H2 k. M, d
            label = {
    & s$ X! |) k4 |+ J( R            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],- k- U& o9 h6 w6 s. f- r
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],% f; O# B! E* s. h% y: v0 S2 ?$ C# \
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]- P# |/ a* a& F5 a8 z# N2 z+ A. `
                }," ]( \! ~' b* O# k
            write='result.txt',
    & V6 `( R: i6 y( A- _# p! D        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    2 F3 v+ y/ c% K" W  d" U" i        page=[True,"now_url.txt"],
    ! F! A8 y. c% ^. Q1 l$ q* ^  G        #clean=True,
    0 d7 l$ e4 ]* [! }        texting=True,
    . r! F7 B) n, @9 \        # status="threads" 启用多线程爬虫
    # G! O% v: l+ W        # Thread_num 为线程数目,默认为1 单线程; w! |7 U4 O7 c+ q5 n4 X' Q# A  p. J
            status="threads",3 _0 m9 I  o4 p6 T/ S
            Thread_num=3," |4 C; ~" y" H; p* ]; q2 d
            ###4 c* n6 T5 o$ `/ r. S) S
            write_SQL={
    / p. Z$ v: a& e4 L            'host':'localhost',
    ; v3 }  K7 h7 s0 o/ f1 Z% J            'post':'3306',
    $ P9 w8 S9 g$ r! g  h! t            'user':'root',
    8 @; f: _4 s8 E5 M            'password':'123456',+ g0 M# V4 l$ u, i# C& [# X
                'db':'example',
    & O& F7 K, x( \            'table':'example'
    5 B- f  L8 X; ?3 T( L            }
    1 ?4 C" I1 o: L# ~! x/ K).run()3 |  o( R/ h! U# T3 Z8 l

    5 `2 B$ @# v% Y4 p3 a, C4 _第十一种玩法:多进程爬虫3 p1 P  Y6 H7 S9 S. o  ~: X
    特点:! |, ~1 q7 D# {1 y
    爬虫速度加快,5 P- d+ \0 P" W6 ]# r
    更好的利用了进程。) @' ^/ [6 Y' Q% s6 |" u1 C
    ; d# \, r+ D* J% d
    缺点:暂无
    8 Z. v6 A6 `) b- }" ?  z' d, t3 t8 V' u8 q6 \5 T8 [, k! `
    :return None
    % [- \' G* Z- d5 r. ?7 r0 T% k' s8 T, ?3 ]4 n1 G4 W/ a
    from simple_crawl import request2 G( C3 ?3 D4 M$ T
    request.parse(
    3 ]& ]1 l6 ~( ~; ?& u& |        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    5 _1 H+ s5 b) k  u  ]4 s        #login="taobao",6 |7 h: a! Y! k- i" T
            type_url = "text",7 ^: J: m4 {. }- J
            Parsing = 'xpath',. g" k! e$ j  g3 s/ w; {) s7 ^* c" |
            label = {
    ) @0 u6 [( u  B( B! Q1 ?0 t            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],- u/ r( L3 u7 o. ^
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    / E) c2 B: [3 J& R, @  ]4 L6 S            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]5 W0 j- W# P% x$ o
                },$ a+ C9 y" j. ^+ e9 ~0 A
            write='result.txt',
    7 _, h9 R  A2 }  V' ~$ X) t7 E        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    " @! J; G$ E/ l8 X+ ~  V        page=[True,"now_url.txt"],
    4 }4 M; w! w; u( w! B0 a# O# m, D        #clean=True,& g$ z8 O, R* W6 @  r5 A" C& ^
            texting=True,4 r1 z1 |( k6 n" n
            # status="multiprocessing" 启用多进程爬虫
    & d5 {8 J  \" ?* w        # cpu_count 为启动代码核心数,默认为系统核数一半
    ! `  p5 c7 o, m9 q4 Q* D! Q6 l/ @9 G        status="multiprocessing",; D3 f3 E3 S1 U: h( @$ P8 b
            cpu_count=2,: ~' x7 ~6 I9 _2 E" q% N
            ###
    4 I! H0 s. T3 r4 ?$ W0 G        write_SQL={
    + R# U1 w3 G: q            'host':'localhost',
    0 U+ g$ T% b: J# r1 E            'post':'3306',
    & j- _! z! x: P* Y4 V: o/ o            'user':'root',2 n- S1 e, R! y5 w, y0 Y, t
                'password':'123456',
    $ m0 Q4 Q6 r; u8 U3 F9 ?) j, y            'db':'example',
    , h9 Y. Q/ Z4 A3 C# }) A            'table':'example'
    ) F1 g; \( {( R0 z" w0 J# M4 h            }* k- }8 l( L3 I( B
    ).run()- N7 W6 F  \* x+ x  A6 m

    . u/ u0 @7 W2 c+ O3 u4 m- O第十二种玩法:异步多线程爬虫
    $ W0 P& _. V" m9 W特点:
    ' h6 y$ ]& j% _4 B* v爬虫速度加快,, B; ]6 f1 s( Z4 |* h
    异步使得爬虫无等待时间,
    + @# I) c0 [3 N% V/ H# F( O/ J同时使用多线程速度明显加快。
    2 L9 H2 r( R" v) Q0 V1 l
      p/ m+ G  ~( |7 m5 U* ?缺点:暂无; g& K% l6 f! A, \8 n

    8 i- Q8 N( A, M; P+ d. S" r, e:return None3 A. F0 Y  P5 r/ G- a9 K

    * R1 b- d) J" |, kfrom simple_crawl import request" V5 |7 U: A6 q7 U( _: y& `
    request.parse(, Q2 Z1 U6 h" f. f
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],- p: R! U+ v# [* Y8 n
            #login="taobao",) p" ^3 m- o: V  b2 v' A  s
            type_url = "text",
    : q$ k4 a" ]- c1 p9 }: P4 ?        Parsing = 'xpath',
    8 v, a0 }/ o. k+ Q        label = {
    . P; b5 y; K7 |) ^8 I) I) ^! Z            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    + v$ W) i; M& \            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],0 o7 |+ w1 v! p! |
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]+ v- J; ]4 M; b" v
                },
    2 O' l4 ]0 ]3 H; l+ B! e        write='result.txt',
    5 b/ }- ?7 a% x        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    $ d8 u% r! H; i6 V/ M) ~& }        page=[True,"now_url.txt"],7 Z2 C- w7 }- I1 m
            #clean=True,5 C) B& p0 `% W+ n' Z
            texting=True,
    * ^; A) C* X; ]1 [, X        # sem 参数为异步引擎数目,默认为5
    3 |- T1 \" L5 J8 J/ C1 D        # 其他参数同上
    ! r2 n% J" m  J" `7 H        status="aiohttp",! P- Q' ?+ d# X2 i) r$ M, x
            Thread_num=3,
      W7 o% t8 ~% r' x* ^% E) \        sem=5,
    + r7 z$ h  w3 M8 j        ###  F1 m; L+ A8 p# ?9 W
            write_SQL={( X! C( K( y$ c6 |6 a- v
                'host':'localhost',9 x! m- X6 L5 P/ k4 t/ C0 T: |
                'post':'3306',' d0 z1 Y4 Y  j; [# r, b2 H
                'user':'root',! S+ j. ~, ?/ J' i/ u/ z8 k: b+ [
                'password':'123456',6 F. Q! p  o* u( n
                'db':'example',( `  C- F. `1 I8 _: u
                'table':'example', ^: z4 Z, K( M0 W4 o
                }
    : x5 O" z% }  }& \) l).run()
    4 J( k. s4 {( {7 o+ i; A! \
    ( Y4 ?. [) l8 v: l% m7 G+ O3 K3 ^# V第十三种玩法:异步多进程爬虫' }% l- Y, R) f1 [3 i0 y
    特点:( l0 l1 @4 X" B# H
    爬虫速度加快,8 g" u; K9 V% l- m
    异步使得爬虫无等待时间,' x, d, W3 E* c
    同时使用多进程速度明显加快。
    " |  p( k% x( [* E8 t2 |  j+ I# Y8 @% N2 \( J( M; I5 a
    缺点:暂无2 N; m  \* a9 k4 a  b

    - J' ]# Y. o  l4 ]:return None
    9 \/ S1 c; k& a$ {4 ]) E- k* W: w2 w
      \1 v8 U& a* U* M  Efrom simple_crawl import request
    9 Y( Z- M  C) L0 _) z) Wrequest.parse(7 V5 w% I5 m9 x4 ~
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    - s) m+ e# L1 S6 @, ?# p6 B/ r        #login="taobao",
    % t5 A- k0 Y. |, f4 d        type_url = "text"," X" c1 Y! e3 I* L  k
            Parsing = 'xpath',
    , K; N/ k" @# z7 P3 T( l& K+ g        label = {+ k, f8 K+ r% H# J
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    9 C& b. @  Y+ y+ K( P# j1 _2 V" W            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    * T4 u/ ~# j- ?5 v* q            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]* ^* @& \( Q5 N: T
                },& K/ V* L/ f2 H& |
            write='result.txt',/ ~( `) [% b, K$ X6 R& H5 ?+ e+ S0 D+ C
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    ; k/ B2 W( l; \: R        page=[True,"now_url.txt"],
    3 u/ Q$ [4 z& b        #clean=True,: W  _3 o& a* P$ P1 ^& E4 w
            texting=True," a; T3 j' n2 C; k: l
            # 参数如上1 Z! B! H% W# b3 E. G, ]6 L
            status="between",, _2 O7 ~: G* h) e5 X  L
            cpu_count=1,6 o: N& g) m8 E$ j% k) M+ _
            sem=5,  w- t" n# y9 I$ [8 P
            ###
      j# p6 d" I, `8 t- v1 V$ ~        write_SQL={
    ' R2 ^* F+ K+ V" s# f' Y: S: B            'host':'localhost',
    ; M+ U$ s- M- D/ w1 H: H            'post':'3306',
    3 z" h% s2 w* @$ @            'user':'root',
    % @7 D. |7 I; Z7 p; i5 ]; E) G            'password':'123456',7 |. D. J( v) Y2 U" p4 q
                'db':'example',
    2 x" t- g8 T3 c  I1 D7 X  h            'table':'example': W4 L4 k0 F+ y& m
                }0 q, q2 G; i% `& H5 _1 j+ T
    ).run()
    , l9 q) _+ H$ b
    , Q# Q  c/ j1 ^8 a9 V$ F  [/ E+ D3 S: b0 L% C7 T" {1 |
    功能介绍完毕🤞
    8 |: u1 }. J6 ?9 `, m9 Z- Z" k最后还是希望你们能给我点一波小小的关注。
    / }* n* I: i6 ^. ^/ |5 c& ^# D" U2 P奉上自己诚挚的爱心💖# R* e- U: D, y9 u( _
    ————————————————
    6 A* ]0 b' u3 j# E. E9 g版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    + p# e+ _$ Q2 a2 j5 y2 _( d- i4 G' b原文链接:https://blog.csdn.net/qq_45414559/article/details/106005684. l6 o8 B3 k, B+ Q1 W/ a* X' e5 V

    % S3 [) A# ~8 x( J' u  P) t" h& V0 \; ^/ Y7 T" m: C! C
    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-9-23 20:06 , Processed in 0.555622 second(s), 56 queries .

    回顶部