QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5405|回复: 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
    $ i! z0 L# u# |) z  n- U6 n* {simple_crawl
    + j1 u6 U+ v3 c& }仅需一行代码即可达到爬虫效果4 ]' k8 ~! g) y; w" ]
    项目地址(欢迎star):https://github.com/Amiee-well/crawl
    2 N/ h0 V3 g6 m1 F. t5 [/ E1 Y# I使用方法8 `$ |. [0 K) |* c2 W2 q! V
    pip install simple_crawl# t) y. N6 J+ p; v
    6 P: b% Q3 A6 m  O/ V
    ### 以下源代码为简单介绍,详细功能介绍再源代码之下
    ! q, b; c8 ]" {4 T8 r+ }from simple_crawl import request
    3 L) U* d6 R  Y2 e$ v$ i# Vrequest.parse(
    & O- D2 n) k' e, [, W! T! v        # status 参数为运行状态,支持单线程多线程多进程协程以及联合" Z- u! V0 I( i. g6 Z% t8 S
            status="aiohttp",
    - u) ~5 \: |- E+ e        # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式
    2 ]7 b2 Y! V5 M* q: e# |" g        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    ; p" x- r/ ^8 m; O4 b( ~        # login 参数为获取登陆信息,如淘宝等网址需要登陆信息2 u( F1 P( g8 z' @
        #login="taobao",
    , F6 M* N5 q5 d8 K1 q    # type_url 参数为返回源代码格式,支持text和json,默认返回text
    ( a) W& T1 o7 L+ M    type_url = "text",
    6 i8 ?6 ~; |( n" D4 a- J6 J    # Parsing 参数为解析方法,支持re、xpath和beautifulsoup8 c3 i9 f1 K! m
        Parsing = 'xpath',
    2 }* a% ]3 S2 v- n! }7 G    # label 参数为爬虫解析过程,字典格式,详情见下方
    1 U7 C/ S- |( ~    label = {
    . z  D- Q) P+ Y# y            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],. J+ ^- d+ M0 ?  c4 y" ~
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],0 X5 _) `: J" R, o8 ?
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    1 l9 A2 A$ o* e! X9 h- ]& y1 k     },
    % M# V& ~! c1 K5 b; Q8 ?" a0 x" }2 h9 b     # write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱4 t# ?6 N8 D: A8 x
         write='result.txt',2 D# Z+ ~, O3 h2 z2 j! y) j7 V
         # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫
    7 ~' B) v% |  {- v! f$ [     next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',  n/ C2 H$ Y" |! u( t
         # page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫9 d- ?' }! S: ^8 e+ C
         page=[True,"now_url.txt"],
    % J2 w: t  y; ]  n     # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息$ r3 l& F5 r, J; {; f
         #clean=True,& [- Z6 E4 E/ U" {9 ]
         # texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序
    $ b8 v6 z" `; X# N9 d7 @     texting=True,
    2 w6 a, d* ]' _4 w     # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态  Y) B( u( v+ `  @. Q
         Thread_num=3,
    1 a, [/ _' I1 x8 u" f4 Y0 }4 X     # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态, U0 j& q5 ]( v/ Y' Y8 z, h
         cpu_count=1,& O: K, t4 o8 J: G5 J, f% m4 p) Y
         # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态6 s- L7 B% _$ }4 c5 L
         sem=5,7 c( }9 y2 x1 B6 o1 x! @/ @
         # write_SQL 为是否写入数据库,默认否
    # L4 |& ]. [+ Y+ p7 P) ^     # host 参数默认localhost6 I+ I  O0 a( y* [
         # post 参数默认3306, T4 u% x  J& r* P
         # user 参数默认root, ?  c+ |! d0 G: {- b, d+ D0 j0 b
         # password 参数必填,必须正确
    4 ?' T4 V6 g9 Q6 n0 B5 `4 g     # db 参数为即将存入的数据库名,若不存在自动创建
    ' T8 A8 m( {" L     # table 参数为即将存入的数据表名,若不存在自动创建" K' o/ l4 e8 U# d6 c
         write_SQL={
    & F) n6 V' g( O: C. W0 R  K! g         'host':'localhost',: ?8 A1 T/ N# Q
             'post':'3306',
    + J  C. Q3 ?8 Y$ C" E5 w2 a1 c( ]4 g0 H         'user':'root'," p& r0 u' B+ [3 o" J* x
             'password':'123456',. B/ ?* C/ q  N+ ^) E4 y' T
             'db':'example',  ~/ W  O$ W( o$ o. y" K
             'table':'example'
    + f5 W  D5 E( w* Q$ B6 \! l      }2 s1 ~8 D* R) C; o+ C- y" N$ d$ c
    ).run()
    6 x' U9 Z7 {% J5 j& `# N, j
    # b( D$ B4 I4 x* i5 W5 e介绍一下crawl参数设置:
    9 T$ h% P1 s# B9 K* J
    9 z+ \: S# j* O- K" l" z'''
    ( t8 u2 d/ h, _5 s- ~1 K单行代码爬虫程序执行
    & k' q: P8 v0 X, ?9 B& Y:param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档, P3 e. h8 f1 Y1 m2 {; k( u" u2 _
    :param url:即将请求的url地址,仅支持get请求
    8 W) p9 i' i' O:param type_url:请求url后返回格式,支持text和json格式返回3 S( r: [* N  u' i' V
    :param Thread_num:即将启动多线程个数,默认为1单线程
    . q3 M* U1 ?- t+ W& ?' f:param sem:协程信号量,控制协程数,防止爬的过快,默认为5
    & v- C. F3 h% O( I- d( d1 A& a:param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半
    7 P" x( h# C( K5 ^1 U* n# \; c: P:param login:模拟网站登陆,保存登陆信息
    9 B0 ~* S6 |  b- M, a( M8 W4 ?:param Parsing:爬虫方式,支持re、xpath以及bs4方法4 S2 S  c( |0 [# j3 ^7 O
    :param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,  a2 M% C7 C4 R% U9 k1 @. A+ M
                           多次报错结束程序,默认否* L5 a- n7 u3 j1 F# ?
    :param label:选择器内容,字典格式保存,
    6 E+ l8 f: Q0 O/ h                     字典值为列表格式,第一个参数为选择器,第二个参数为转换类型# Z* c8 E3 O$ D  C8 J( U
                         第一个参数必填,第二个参数默认str类型" t% Z8 C( O4 T6 \) A# L
    :param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否5 a; u+ _% K) h$ _7 z; C7 ^$ W
    :param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫
    4 o4 W# w# b3 e1 f, n:param page:是否选择断续笔记接手下次爬虫处理,默认否
    # `( |: A% A& x3 W$ h) C8 {:param clean:是否进行简单类型数据清洗,默认否
    - N2 f) o# s1 Q, W# g0 X:param write_sql:是否写入数据库,默认否, _% @5 C# t3 l
                             'host'默认为'localhost','post'默认'3306','user'默认'root',
    7 v1 t: ?5 r2 J: Z! O" v) z+ D7 Y                         'password':'密码','db':'数据库','table':'数据表',- j5 o  O; o, B( \" K/ ^8 z& I
                             检测库是否存在,若不存在则创建,若存在则直接插入,+ t7 ]1 w) P* Z- h
                             检测表是否存在,若不存在则创建,若存在则直接插入
    6 W; f1 s  Q% u( E2 o:return True1 |3 i+ ?; a' ^& Z! A9 B9 p0 Z
    '''
    % q. e; f6 b; G* N" {介绍玩法9 O4 W. c) k# r( F
    接下来介绍的均为调用第三方库的情况下运行:
    2 E1 E6 A7 o% H8 v; A. Q7 ]5 Z+ h/ R' W; g4 S- d, I" p% v
    from simple_crawl import request
    8 L- R4 ?+ R$ A8 c第一种玩法:输出源代码* O& B! D9 u' l2 h% l. T' }
    调用requests库进行源代码请求。. g0 Z7 W' \- O0 q1 E9 K3 {. D2 v
    4 g3 f; [9 |5 k9 R/ \
    特点:5 q2 X- q& r, L' _2 ]" ?- m
    请求失败则调用ip池处理重新请求访问,
    * T5 o$ s4 n) g9 q" m出现五次失败默认网址输入错误。
    5 L" f& R+ J0 k$ K8 j* N7 b支持text以及json字符串返回。默认text。
    7 r& M3 Y# J' D* i# z/ O2 o  k3 [, S/ V; @5 I
    缺点:% \( S2 H" L5 U
    暂时只能进行get请求,不支持post访问/ k' u5 _: q% ~4 N8 L  X- W

    . _8 B8 d& N9 b% ^* g:return text or json) S: d6 n  @$ o+ \& g
      {+ V9 }6 U9 P5 Z
    request.parse(
    . Y9 l" o7 H0 k* D7 u9 S) b        url = "https://www.douban.com/group/explore",# y* \' e8 I1 a* t0 s' b8 Q
            type_url = "text"
    6 ~" N6 n5 p/ O' a9 h2 n).run()
    : g" V" r4 D3 }" R9 e, b# return text8 |0 ?) }6 d9 N1 f% [& R( a
    7 m+ I% N4 ^- H! \) w* u
    第二种玩法:模拟网站登陆并保存信息1 h% {( C! C$ ]- [, |! p
    调用DecryptLogin库请求登陆访问。! K. [4 g/ ~' G& w& ]3 B9 V) P7 w

    7 \  D7 ~* q) y* h; ~3 t/ Yps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源
    ! D6 D( t) m) ]3 i: D9 ^( \+ m在此放出文档地址+ k4 B. _. p6 ]1 s+ Q' {- z
    DecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/
    ) S2 h2 e* }; X1 N; N0 C' T, O% m7 A- R1 D2 B6 t
    特点:
    4 Z5 C. e' K& a: H/ q# o将DecryptLogin库中二维码继承到此库(非二次开发)
    , Z5 d; \6 Z; y; {. q: @5 k支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆)
    9 {$ J- S7 r1 `* {保存session.pkl信息到本地方便下次登陆运行$ r" I) A9 D0 E
    9 C- V: B- g, y% z. A
    缺点:
    $ M6 O$ A( x- |! l- |- J6 }session.pkl登陆信息过时无法自动删除。
    ) s7 q/ y. A2 T& w导致下次登陆疑似cookie无法正常登陆。
    $ F4 a! o, F' ]4 {+ |* e3 Z) P
    3 i  _9 h; R* Z9 v: M+ g, V% D:return session% S3 G" n# {, v
    ) L2 v% S6 ~# N- G* h- W9 d
    request.parse(
    + q6 ]( q1 `1 b/ t* q" t) F        # 臭不要脸的推广一下我的店铺
    1 w# }  w6 n* ~( L5 ~; @/ S        url="https://shop574805287.taobao.com/",
    ' D+ H  \+ k0 ~  D% o        login="taobao"
    ) y5 A. N$ Z, y, E# a- q* [).run()
    . U8 O6 O8 ~" ]: [1 j3 W! L# return text1 J6 P3 A2 X! R6 C& c
    : ]9 ^/ I6 Q/ E$ y' D; Y
    第三种玩法:爬取网站信息
    * r8 E% W) |/ x爬虫库自然少不了爬虫的过程4 W2 a) j, j1 q% G. g. b' ?

    9 a, ^* Z% B2 R: X% G特点:
    ) W6 ?' K# C" F  d支持re库,xpath解析以及bs4选择器。
    ' S: v' ?6 c3 H6 x0 U爬取方法为字典格式。单方面输出。/ m! y+ q+ b; r  k) q
    字典键为保存的字段名称。% z" F9 ?' ~- H9 K
    字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。
    + A. H7 d0 T. o
    3 b# W% B/ y* m- K- f& ?缺点:暂无(等待小伙伴们发现)$ A2 E: F" E* k7 `. ~0 S) B
    $ P/ J1 x, M2 `0 ?
    :return reptile_results
    : n* B) z. R6 ^( ~
    " _/ L" d' [. `request.parse(
      b$ c: q- H! s* J9 {        url='https://www.douban.com/group/explore',9 r7 I9 ^% G9 F: z. j- z7 X
            # 字符串格式,选择器方法。
    - ~. Z% F5 j1 S, {* m* z, h    Parsing = 'xpath',$ D6 H: d2 U8 b4 J
        # 字典格式,参数如上。
    6 v6 S2 Z% ]) `& k8 x    label = {
    8 ?/ h; u2 D& D$ [8 r- q: _        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],6 A! c" i( E5 z4 R" f4 f
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],: l- e- t) x; h  l% e
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    & C: W+ G2 j( o2 ~# o5 ^4 l        }/ N# G% E0 v+ C6 T
    ).run()9 [! {% o+ Q& S6 V/ X% J1 n' L) s
    # return reptile_results(list)
    3 \% v$ j7 l# O& q1 W" U
    " v1 F2 h* k3 j3 Q) k4 D第四种玩法:自由保存信息
    $ z; g1 E( c7 B目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。
    % Z+ _" ^1 u" @. i) n% U8 T, I9 i* F5 G2 p0 v
    特点:" @, d8 O- i% N9 Z5 e% R% P
    写入文件均为数据格式传入文件。8 t% H1 |- C& @& Y  x- Z
    且输入格式规范方便阅读and省事。7 {7 N- Q* a# J. r4 K3 J4 B

    6 u' O/ a  ]# k- c6 ]缺点:1 e2 T4 N: T" N4 y; g* i6 V
    保存格式仅四种,: e* y& [2 r4 A& V' I5 Q, p
    不方便用户之后读写操作。. `+ q* n1 a& P6 O
    7 D) l: f- k/ g: {$ y) P4 ?
    :return file
    " c7 {% O' e! }8 e% f) w  _$ o8 U' D1 m: v3 D6 W7 T1 _! ^0 D
    request.parse(3 a: x# F  v& A) h
            url='https://www.douban.com/group/explore',
    , _& I2 y# }  V$ |    Parsing = 'xpath',2 V' h3 m7 R( f. `  ?1 B. o
        label = {$ w$ S" y( M" x1 {( B
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],6 B- y/ l! R. C; z  t# H
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],% x1 ]8 g* S: ]5 o6 x" k6 t& G
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]3 q5 z5 u; P3 X% p4 h2 H( U, E& {& s( O
            },5 H3 z4 H' m( Q
        # 字符串格式,具体保存位置填写
    5 Z' B$ w! [' o. N9 X    write='result.pkl'
    * r! \: Y$ F6 C2 z).run()
    6 s# i) w; {* M' ]* j" O# return file
    ( x, V2 L# s9 j. g: z5 c0 j9 i
    2 L5 K) A2 U) m第五种玩法:读取下一页 url 地址继续爬虫
    ! W' u' O1 S5 o, x这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~, c" M( f5 \+ f6 O7 e8 ~. K& m# B

    % K& \/ \1 K( E. @  A! x特点:
    6 `5 l& i- Z. Q继承之前的Parsing参数选择器选择方法。) f2 c7 e& ?8 d, T5 b( o7 D+ u
    在这里可读取到解析后的下一页 url 网址。4 R1 K0 ?6 i5 A/ p
    方可继续进行爬虫处理。方便用户使用。
    8 d: x) {8 T6 c- |5 w& z6 u3 }, j) `- W9 B" `5 l7 T/ X1 ^4 e
    缺点:  }" o" {- z: e' ~0 }) g* O3 |
    若爬虫时下一页 url 地址改变,便结束爬虫。
    ! l( n/ p: ?. b' d只能爬取所给 url 地址中的信息。7 Q; \; s. D! w
    无法进行某一界面的多个网页爬取返回。' j; n% A7 H. T
    造成访问页面单一流失。, P* C% d& R6 G! u8 i$ Q/ A: u
    8 G" G2 ]& K4 C  z- N9 Q0 _
    :return None8 }5 ^& W- j7 D8 w: m. C  P3 @  ~
    4 I1 j  [$ u, [2 ~
    request.parse(' r0 Z" {. ?1 d8 z" E+ r( i
            url='https://www.douban.com/group/explore',
    $ \; s4 o9 q* O: Q    Parsing = 'xpath',3 u  w) }% W% b7 V( o3 z+ m
        label = {
    ' s$ s9 J9 t5 f. l. ]        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],$ [) n4 D% l5 [4 n/ }. w# B1 C8 [% w
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    4 S/ T. k0 M  Y$ ^* k9 R* E% m        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    & {* ~% A/ u$ [, S' z) q, X4 _, o& t1 |        },
    * D5 }* q. q: |* u4 t$ D    write='result.pkl',
    # s0 v* {% x: p- f3 y9 E. _: Q    # 字符串格式,根据Parsing方法继续请求下一页a中href
    ' B% Q$ ]6 ~: ?! I    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    0 i! h% S/ e7 t- {* R0 K6 v2 v).run()4 Y0 l9 _8 X. b
    # return None
    ; G7 z( L% u6 l9 r
    + S4 W; B! ^& Y' p第六种玩法:爬虫网页保存
    2 S# t* @* ~* s( k听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!1 P" p9 g5 V5 {2 H
    ; \1 H  E1 I% A* N
    特点:
    , Y4 v1 ^$ }/ V0 D持续输出断续笔记。. T* \6 a$ o) J4 q% j
    将此次爬虫的 url 地址保存到一个文本文档内部。! h( |% O4 I$ N$ z, \, {
    下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。
    & x1 c$ M. Q$ B0 L, i, Z8 _& E+ r- i( n2 H
    缺点:
    1 Y8 W4 D6 a/ @- J读取内容不单一。' o5 d5 I+ O& B- a5 n3 u5 t) ?, ~
    导致下次爬虫无法正确读取上次爬虫留下的痕迹。7 W, H3 K( T9 `

    ( D. }  P3 a) Q2 a: M" T:return url_file! d5 \& P3 ?' s: v$ b6 l/ ~

    ' i) e) L% Y3 I' y7 Zrequest.parse(
    5 N& m& c/ g: W" P- W    url='https://www.douban.com/group/explore',; q; k& g8 l( O  n! u
        type_url='text',9 N' N, |& C" m! o# I! M6 v2 L! D. F
        #login='taobao',3 C3 s/ L6 I1 C: |' ^
        Parsing = 'xpath',! M1 k8 N! M6 H+ P" d% v6 m
        label = {
    : }: j6 u' B& j7 t; D        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],0 M" O  ]6 v. l5 S+ V9 J
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    % T; [# W/ @& z$ v& j& |. |        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]# Y/ p- Z* D6 w8 b
            },
    : F8 y2 B- }5 A% f# K+ e- m    write='result.pkl',
    8 x  Q. k( U+ Q; W    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',6 g+ n- K% _$ V! c
        # 第一个参数为是否需要断续笔记。, Q& X. W  r# o, L! W7 y
        # 第二个参数为断续笔记保存位置。
    . q3 j/ y6 x# T  H4 i9 C' f7 h' F5 }" y    page=[True,'url_page.txt']
    ! K' q# e0 \3 k" c).run()) W/ \# o  \/ ~5 R+ T" @9 ]8 Z! [- Y
    # return url_file
    1 v7 ^: h4 |  X2 ?6 j: }% R3 n1 {! ^: I, W7 w
    第七种玩法:简单数据清洗
    " c6 J! y( Y0 l0 q1 o数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。; X6 [0 l8 Z5 u8 N

    ( ?( Z: }) s3 _特点:
    3 _1 [" Z, Q( ?( @2 x本人曾写过一个底层数据清洗。
    1 f3 [, v0 f2 d7 X# M+ x, e' M; c0 R能将列表格式数据进行归分清洗。
    & }& w# |( z3 [/ C! P主要内容请参考另一篇文章7 E8 V! ]  `  p, N% D8 `
    如下连接:数据清洗# X  [! }$ l' _7 B- N" o

    & _2 ~* o# \! T& q$ n5 E- y缺点:
    - w) K( W  B' k  \; p数据清洗格式简单。& T: S7 A) E/ c1 k
    数据清洗内容单一。
    * E2 @) s! O/ E  j  B( M# J无法完全做到绝对清洗。$ C8 o  J# T: C# Z
    有待改善。9 @' p  o5 |1 ~$ l0 X7 w' M. U1 z- N
    0 J4 \* s. E; S" S0 H) i
    :return keyword_list, value_list
    / k+ j" T( u3 t7 }$ |1 j
    9 e/ E) X  Y. |5 Frequest.parse(
    , Q8 |% j# R) s$ J" w* D. J    url='https://www.douban.com/group/explore',( P' y* T  o& ]+ [8 F) c1 f" z9 |. _
        Parsing = 'xpath',
    # `" `5 u/ X1 ^* H6 u    label = {
    + }1 k0 \  {8 O: E7 o. R1 a) F        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],! O0 w% }5 F  X& G- L
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    ! O! A- `! b2 G0 I+ v8 j3 [        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]# J3 C. y7 k) K+ u7 t
            },, ^+ g/ z1 E/ U% l' O, Y
        write='result.pkl',
    ! s* K8 p% W$ n; h. D! S4 t    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',! x2 r2 z7 Q+ R# O1 }$ b( A' O* k
        page=[True,'url_page.txt'],& Q8 K  B8 M' w0 D
        # bool类型,默认不清洗
    8 q+ y1 w# g5 X6 x" F: R    clean=True! Y4 i2 K3 z' o
    ).run()/ g# F$ [+ c! K  t" S
    4 F4 ]3 E/ q' J3 i% Y
    第八种玩法:爬虫存入数据库
    , c, q4 f9 f" w( I存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。
    # D/ y2 S# j  F) s3 r- U' ^$ B, A: H- L6 ?( t
    特点:9 q  T( _2 d4 t" P: ~- l
    信息存入MySQL数据库。
    & P! p$ x4 p* W+ K- p) t可连接docker远程数据库。
      `3 \$ V0 K- {& e* g: y( K$ C数据库的库名可以不存在。
    ; P0 {4 T: P5 x% ^数据库的表名可以不存在。; x) x+ f6 Z' U2 r3 B. i# [1 Q5 n
    根据之前传入字典键与值参数判断表类型。
    ( E. \: K" X8 O8 U% |自由建立数据表传入信息。
    6 _" {: d- I# g, g4 Y9 E0 j+ n* b0 |, P0 f. H+ d! ~
    缺点:
    ' \  {7 |0 _) P" w- E7 e+ y6 G仅支持MySQL数据库。$ b5 }& e5 G* }- t; f: T
    " V( t  S: s( U4 K  c$ l0 e2 ]
    :return SQL6 M3 Q6 I! d: D& |+ f3 W# `, m1 B
    3 U8 |* p& D$ _) T
    request.parse(6 j/ M; q2 o' y, J& N3 _
        url='https://www.douban.com/group/explore'," p* G2 Y+ @1 J( W! q3 e7 v5 P
        Parsing = 'xpath',1 g- ]( P+ }1 k( p: }3 a
        label = {
    1 Z* h0 n! C% X8 w  L6 a( c        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],# c1 V6 P( \% ~* r
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    * ^4 u1 P' p! n5 v        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    . {& _# p# G9 N5 }        },! o6 C' @+ s9 }. [. [" y
        write='result.pkl',% N- v2 J) R  E3 x' w# _4 w2 D
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',. H. ?$ ]9 G! O
        page=[True,'url_page.txt'],
    4 ^: b# c$ g+ q. E0 g/ b    clean=True,- d' d' M" N$ N; ?
        # 字典格式,3 h! s9 A" [/ ]! ~1 `$ h3 l
        # host可有可无,默认localhost
    " E5 }* w9 y" H8 v6 f- J    # post可有可无,默认3306
    + G' t" D1 h; N# X    # user可有可无,默认root2 M0 D. V# M* J, Z9 z
        # password必要参数,数据库连接密码6 L7 p2 R/ V& ~) a3 }2 {
        # db必要参数,数据库即将存入的库名; m; v& D+ N5 H) m8 I; R
        # table必要参数,数据库即将存入的表名% e$ s" H1 D( D% e8 m
        write_SQL={: w8 l$ M4 m! R) `  i% V/ o
            'host':'localhost',8 G. [2 g) J0 F# B, [# I# D& G
            'post':'3306',
    , U% C! _6 `2 y: q  n* y- m6 e& ~        'user':'root',
    ; U0 |$ A+ L5 y& \, i        'password':'123456',
    & Y6 _! u, p! T* ]  l- C4 o) J        'db':'example',
    ) K' a3 J9 {& |" [$ E        'table':'example'
    ( w& |6 K& D% o2 b% _        }
    ; {" T+ U$ w8 I5 I9 j    ).run()
      {1 Q( c; \4 G7 [$ L+ P$ y& Z& Z; A
    第九种玩法:重新启动爬虫
    3 f0 ~8 E8 _$ u: b4 u; p爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。- H4 B7 H8 H( l+ X# P  G
    4 Z  [/ b% j" f4 d
    特点:+ v# @8 k: h8 [7 y- X
    检测报错重新启动爬虫. ~) t( x6 K9 i1 `+ a9 k) e
    无需手动处理错误信息
    5 P  U5 V. t$ _7 `
    1 ?+ B  ?( s3 Y/ C2 O缺点:# F! Z! j# X- j; C0 l
    无法收集子线程错误。
    - y/ v, x8 X. e/ K5 }, n! w+ a) d/ _$ K
    :return None) H$ Y+ V( t; b8 ^
    7 \' t5 f& ]6 t! y/ U- z- c+ V
    request.parse(2 X; Z: `, z- A) ?; ^) S' p
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],/ ?$ n  R1 M. i0 y
            #login="taobao",) G7 W  _. V% E5 ~) R+ u
            type_url = "text",# Z& ]$ z' F0 b( A, g! [3 B
            Parsing = 'xpath',
    4 j% A7 P* Y* r7 {5 X5 G- z        label = {2 \  D  m# K& m& \: T/ U5 V  }
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],& [" o! Q( S+ D! y: `
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],. `1 r" O7 m5 c9 V7 |
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    1 b& a: y/ I; P; g( u            },) n- E/ T$ @4 k+ q9 L" A
            write='result.txt',6 p7 `9 F; J+ N5 D7 d! f( o3 T0 D
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',$ j. u( i8 O( M. W, D8 V
            page=[True,"now_url.txt"],( q8 ~$ {% M  O! v, f
            # texting 参数为是否启用连续爬虫1 j- d8 K6 L2 d8 r4 `/ y
            # 爬虫程序异常报错后重新启动爬虫  q) Y$ @% W* I4 n3 z9 J) G
            texting=True,( |. J6 y# }5 n! A
            ###0 l# L5 ], {8 H
            write_SQL={
    8 V6 S5 U; y" }( c$ A            'host':'localhost',
    ! I7 T+ R$ B3 N6 x            'post':'3306',
    , G) @8 C; q& a$ z# B: j$ X            'user':'root',
    4 ~+ l; K: ?( A1 j4 ]2 x8 S            'password':'123456',- Z( P, ^. v; ^7 z4 ^
                'db':'example',/ u) z1 ~4 d. D. @' R  N5 D4 I6 v
                'table':'example'( f- _; {* k6 ?, ]
                }0 P* T" x: a8 h9 ~8 E
    ).run()" Q  W# D9 ^9 M5 b
    ! G' `2 w7 m% z# c) i, ?" o* n: v
    第十种玩法:多线程爬虫
    % n2 T9 r2 u( F; {$ E: e' P特点:
    * M, F: E* V( u, h爬虫速度加快,$ y8 F9 L7 y8 b0 S: S( D8 g
    更好的利用了线程。
      h. n' [# L7 g+ k( C2 v) S, }) N% c
    0 ~3 z1 @% e* G" u4 n* r% }缺点:暂无' w, Y4 a7 D) F7 R, m
    5 N8 q5 _2 w% {/ j
    :return None" C" |# X$ @$ l& O

    ' S2 q) O- [" i7 crequest.parse(
    ) ^# Y$ R7 }+ k" y) b9 {        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],2 [) r! g# p2 n. }" {
            #login="taobao",% M$ K. H& S/ J5 p/ S' X+ Q
            type_url = "text",
    % |2 C+ Q( Q# f1 y$ a        Parsing = 'xpath',7 i' \! R0 N- c5 @
            label = {% N( h2 o% Q) n% S! G' [
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],3 M6 W3 [0 M- l+ t
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],% W) ]% P% [- P5 M/ A" ?2 }9 v
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]- ?' m2 ^6 U  N# k  E' B/ d5 j
                },4 M1 ^0 C3 L8 |7 p: g8 f+ L
            write='result.txt',& I6 H  a4 H* V' U- u6 O
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',% p/ B  x% B/ G* b
            page=[True,"now_url.txt"],- f  z4 u, E/ o# A
            #clean=True,/ x8 `- |; i& |0 Y
            texting=True,  b: o. b: X/ u) b: ]& A
            # status="threads" 启用多线程爬虫, `: _; Z: e$ ~( K
            # Thread_num 为线程数目,默认为1 单线程8 O7 K/ q6 v. H) U$ Z
            status="threads",
    1 \9 O9 [. B7 {3 D+ i        Thread_num=3,
    : C& s* |: L+ R0 h( h. H- N        ###- p) q3 L! o2 N; J& W/ M
            write_SQL={% [! ]  ^5 [: f+ N5 F
                'host':'localhost',
      g0 C' I0 B6 f: E  y1 W! L            'post':'3306',4 a6 M) R: ]# G8 b
                'user':'root',6 i0 n/ W% i/ c- k7 p. Y
                'password':'123456',: @, [+ b" X: c# s. ]7 y" q
                'db':'example',
    - i: U9 V5 O/ J/ H* T3 A            'table':'example'
    5 V  C6 c. o. g/ I; C& k0 Z            }
    - ?* e$ I) @: S9 I( W).run()
    / G5 {) E* P: l( H8 f6 C
    9 U1 [6 D0 y: q! r第十一种玩法:多进程爬虫
    3 Z% B( S: J4 U* `# }  h# T4 W特点:
    8 R% @! M! o1 f& S! g, L爬虫速度加快,
    + [# q# w. r' A+ l& w更好的利用了进程。
    * {7 q; j- x! n6 N3 [5 X' t! j# x) n* I4 b
    缺点:暂无# r* p5 k- T- ~0 v7 B+ _
    , `$ s4 o  }# C4 [( ?/ }+ v
    :return None# S5 [# l" i& f( q+ Y1 A: E

    5 a! A# C) a# V* m' a4 Tfrom simple_crawl import request. c# n9 P% ], ^
    request.parse(
    $ D# c$ _* V, }# \( v        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    $ {5 x" G3 ?' `( [3 @( h$ y        #login="taobao",* W, O" A0 C: W$ i4 t9 f; e
            type_url = "text",
    * U4 |' e0 H/ g' p' ~( }        Parsing = 'xpath',
    0 F9 h2 V: ]6 m        label = {
    / J  Y, v- K, A+ J  C! ]            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    1 ]7 V2 j+ P( j            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],1 a2 Y& E# y1 O4 k! T2 k2 f
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]7 Q, A4 _6 \/ x
                },7 [3 y+ K, D: n. |  p; n) H$ W
            write='result.txt',$ q# Y% O, T) i6 f/ M' M
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',# f2 ?( S) ^2 m
            page=[True,"now_url.txt"],* n' t* z; T# I; M7 w8 ]; \
            #clean=True,1 a" u1 q0 x8 Q/ M4 z6 \) o9 L
            texting=True,
    * `$ {/ a5 z" g4 K+ g3 `        # status="multiprocessing" 启用多进程爬虫
    % F) {2 F7 c. G! b* d        # cpu_count 为启动代码核心数,默认为系统核数一半$ o, ?* L' ^. w- l% A! W; ~% r' ^1 S
            status="multiprocessing",+ q0 C8 o5 x9 L2 [1 p! X
            cpu_count=2,- t+ o% ~% }! z( l7 H4 A
            ###
    . _5 F9 i4 f# ~+ \0 Y        write_SQL={; @6 G9 I. c& _! {) n
                'host':'localhost',
    # `8 U  ?; c  Q5 ~* L; A            'post':'3306',
    6 x, }* f+ C+ H) x6 {' D            'user':'root',( o4 M+ {8 F9 {
                'password':'123456',
    ( }# ^( N* K6 k, d* L            'db':'example',
    2 m% O6 @" i8 F/ m6 ?6 n" |            'table':'example'
    - Z+ U, j; W9 H8 T9 O& B            }
    5 A- b0 M3 t5 L8 L- c* w).run()
    2 b, s/ g3 J# |2 L4 L1 q$ D: {7 |" ~" R7 g
    第十二种玩法:异步多线程爬虫
    " v, [4 v1 W) z' {  w6 o9 }" h特点:( l% h7 I  g! m6 k
    爬虫速度加快,# F: k: A& l5 O# U% r# f
    异步使得爬虫无等待时间,
    , @- h! `& Y- @5 r; Y  E同时使用多线程速度明显加快。
    : h9 A, Q7 K5 [. Q/ ~) @+ e
      @- t) N/ e! ^; P% n缺点:暂无6 X/ C, R6 H) T1 `- @
    ) I7 }2 d4 }9 b$ W! V
    :return None
    $ `% k, _4 _, T7 B9 C* ~. M& p' N# t/ n
    from simple_crawl import request6 o# f/ F6 O, v# Q2 {
    request.parse(/ @* c0 q( K; j; f; A; J! q: l5 `
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],3 m* A5 z  F. L* y5 }- x
            #login="taobao",
    & U3 i7 S8 s6 F) T. E        type_url = "text",$ b! P% q/ ~/ {- P# R
            Parsing = 'xpath',1 f. T" U+ v8 o
            label = {% [/ K7 m% C+ v! h# z
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],3 R- z. g" J% s
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],! F/ ^9 s. F2 g/ a9 w7 L
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    2 c$ A$ L: x* |! Y8 w( I            },: P# ?* Z: P3 h2 r, N& G
            write='result.txt',
    9 h$ T( {) `8 H1 Z- Z0 g# c8 q/ m        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',! S7 G0 v5 R9 Z' h' a' S
            page=[True,"now_url.txt"],
    , Z4 w2 L, C& Q0 x* e% O        #clean=True,) V, U: M) X$ W- k3 R+ A
            texting=True,
    . b: h! n+ n  Y+ B; \        # sem 参数为异步引擎数目,默认为5# H& m7 V$ T! `9 L7 S
            # 其他参数同上
    3 f+ u$ q. @& ?) l        status="aiohttp",2 ^. c. k$ J* E
            Thread_num=3,0 J1 f' O. |3 r# o  ^
            sem=5,
    , l$ ^$ d3 ?0 C: j7 k1 S        ###0 j; _. W7 g5 K( j& r0 e8 B  ^4 X
            write_SQL={) M4 K8 n$ k  H( e# |0 `
                'host':'localhost',
    5 ~8 A  o; D7 R1 W7 k            'post':'3306',0 L0 F% Q4 S% i: V
                'user':'root',4 i* B* P5 x1 C" L& y/ V4 E# @. ~; @% \
                'password':'123456',
    + K4 c* p) J7 ~1 v            'db':'example',
    : A% K8 a# I( m2 Q            'table':'example'6 ]' ~0 t% }0 F" V9 N
                }8 m7 b5 k2 K- h. j5 ^
    ).run()$ O% U' X, G  F* o0 {8 U' N' P
    . I; H' x: o- N) _
    第十三种玩法:异步多进程爬虫+ K3 \4 S% N. k
    特点:4 b. {+ ~1 A/ M7 w2 P% s
    爬虫速度加快,
    - E0 R- x  c# a. X9 \! v' W4 L' i6 G6 W异步使得爬虫无等待时间,
    1 V7 w7 c5 e5 c$ q6 T同时使用多进程速度明显加快。
    6 {3 f9 r! C/ m5 k' X9 M
    # `" j, t8 |5 M) V6 [0 h# U: I8 p缺点:暂无
    8 r5 \  q$ Y% ^4 r
    " [1 U8 S# _+ F2 m. x) {:return None
    ! r6 I" o, t/ b  |. S( S. @& o2 v) U# U) ]& [* S
    from simple_crawl import request3 F: B4 ^8 {* t( c% J
    request.parse(
      w9 t3 d  s6 V/ }3 ^/ [5 b) r2 s        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    . }/ y* x) t7 }/ n; B: W        #login="taobao",
    - K( A. l. K2 y  f, A/ @        type_url = "text",$ K2 b: X5 Y& j4 E- P. Z- J2 L
            Parsing = 'xpath',) d* o. t. p- K) m
            label = {
    ! o8 O6 M4 z* T5 m/ r            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    5 l; N" d. }( b9 \, R; b4 V            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    2 r( z2 z1 w! J& ^            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    ; z3 m/ M% |9 C* q            },% E' K- h, S% B
            write='result.txt',6 I. M3 P" a4 t4 H
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',  V, \2 z& j* V
            page=[True,"now_url.txt"],
    . c, I  m, a9 b/ k! [        #clean=True,
    $ a; C5 y4 _1 C( @7 y        texting=True,+ R+ i7 m; X; Z3 F5 P
            # 参数如上
    , r, q" ~) r' h# I5 x/ Z        status="between",
    6 w% l" Q* W* G. s        cpu_count=1,2 x+ f1 J, H& @; {  k
            sem=5,  Z9 x0 m0 C0 L4 X" I) {
            ###
    1 ?$ h0 L* }9 g2 d4 M" k( T        write_SQL={) ?( Y- j5 b+ o& _7 B: ?) V
                'host':'localhost',
    5 a/ d7 C6 j) n; U* p            'post':'3306',& x) l4 ~* \$ {7 D5 F* G
                'user':'root',
    6 s+ {3 L5 @# l: h1 \            'password':'123456',. Q, l, f: y6 \& t1 l0 {% l
                'db':'example',
    # _6 p$ R; Q- Q            'table':'example'
    - C6 l" F0 F9 K4 i            }
    5 g6 x8 S! _' p0 [).run(); r2 X. a% ]' P0 j4 t6 ]

    & h! q& P8 C! p' D7 u
    4 s+ L* ~; p: |" \功能介绍完毕🤞7 N9 Q! L$ E2 C
    最后还是希望你们能给我点一波小小的关注。. P  t) G" F4 i2 c. N' b
    奉上自己诚挚的爱心💖7 L. \2 h. B9 B( S
    ————————————————
    / G, z- E# j" e' I版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。; c) ?! n" Z% z1 p  ^/ b! w& E2 `
    原文链接:https://blog.csdn.net/qq_45414559/article/details/106005684
    . O/ w, M3 H/ U+ D" Y
      a7 F2 w/ Q4 \4 B5 T1 Q+ ~
    / e. @; `6 m: s: ]& _
    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-4-19 06:13 , Processed in 0.395512 second(s), 56 queries .

    回顶部