QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5418|回复: 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/ y# n/ c- V$ g  I2 K, Q. [' {simple_crawl% a. V( Y* Y% d" C' B5 ^/ r
    仅需一行代码即可达到爬虫效果4 u2 t7 G. K0 I* z  p( `
    项目地址(欢迎star):https://github.com/Amiee-well/crawl1 _2 F1 E  ?3 Z. P
    使用方法
    % J+ Q+ |$ g! ?# D* z+ Mpip install simple_crawl
    ) b  c7 |) e7 H3 W9 D7 U# `" S; R/ W/ u" E
    ### 以下源代码为简单介绍,详细功能介绍再源代码之下
    & f" r& w! L& Q( Wfrom simple_crawl import request! L& b& A2 {3 X. L3 G
    request.parse(% u& P6 ^; y- h2 r/ O' m
            # status 参数为运行状态,支持单线程多线程多进程协程以及联合. W' T( H3 ~. [% f! C
            status="aiohttp",
    , A+ F9 M5 z6 e' |0 w7 u        # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式$ {% y& n2 N0 ?7 Q) ~4 z
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    " {4 i+ @2 z/ L/ z2 Z+ P. C        # login 参数为获取登陆信息,如淘宝等网址需要登陆信息
    # z' X1 W5 l' o- g8 p    #login="taobao",2 C4 ^) U( F/ e: j: c# g9 `: W' m
        # type_url 参数为返回源代码格式,支持text和json,默认返回text: z! k  Z3 `; [/ |6 Z% a* l3 o3 F
        type_url = "text",2 _6 ~# [1 \3 E' y7 ?
        # Parsing 参数为解析方法,支持re、xpath和beautifulsoup+ U! W/ q+ b3 D* A+ l/ t
        Parsing = 'xpath',
    6 [, i) q6 s, N0 w+ T8 D0 w: A    # label 参数为爬虫解析过程,字典格式,详情见下方
    * T  Y' |" @/ C- B& t    label = {/ V6 v$ n& w8 i
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    , ~* L5 V' t9 l            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    * o' p' B  ?1 p8 o, h+ b$ [* r            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]5 a( T# ]$ |* l3 Z' _
         },
    6 F- `  C' i  r  p     # write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱
    # q+ Y; C7 R( o* P# |, ?8 X' l     write='result.txt',/ N3 e& C$ k" a, V- l7 K4 K5 M
         # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫
    + R. f( V; f1 M0 H     next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    * l  m6 o3 E+ B     # page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫
    * K. n& j" P5 T/ i     page=[True,"now_url.txt"],
    4 |& V1 B$ \6 e; C     # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息
    1 B. n6 s5 W/ a; a: U     #clean=True,
    - k" u" U" @: ?7 A     # texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序
    8 t  O7 f4 i- f( E8 e     texting=True,% ^5 m! V2 y% j" J* V( x- W
         # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态  \! F3 c: x2 ?* p- O. \. w
         Thread_num=3,
    7 H0 a3 `" K5 c8 e     # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态
    7 K' ]( n, k4 @6 b. \. D( d     cpu_count=1,
    $ [3 [2 B# A! c* K0 q& ]" w' O, H     # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态
    / K+ l3 o7 W1 L  L/ D     sem=5,- Y: W* w5 G2 Y( w+ C
         # write_SQL 为是否写入数据库,默认否3 _+ Q, D+ z' J! C% I% O" Z
         # host 参数默认localhost
    ! ]  }* h5 K# E. c& Y" ~     # post 参数默认33067 p" s+ O# W" N  L
         # user 参数默认root4 m" p( W$ q* d, [
         # password 参数必填,必须正确
    2 u3 f) A- Z1 R6 L     # db 参数为即将存入的数据库名,若不存在自动创建
    ' d& l6 W+ K0 D" n1 L( D) R% o     # table 参数为即将存入的数据表名,若不存在自动创建
    2 F4 s3 ~2 U6 @7 K) @, K     write_SQL={5 h) T! o2 e& y6 f% G3 j! u
             'host':'localhost',7 n. }8 {/ A  T, i; [7 N8 }
             'post':'3306',
    & N7 X* i$ R/ ^2 u! q$ y         'user':'root',( ^& [3 R3 n* i! }. S
             'password':'123456',$ [" ~# M: V  H* [( f% Q  E  ?
             'db':'example',# ?; {+ C/ i4 R! X
             'table':'example'
    + d) J4 H0 S. J  T$ h      }9 v1 y- r( \' m: ^6 z8 w
    ).run()7 c" k6 a9 T6 _- L' b6 `

    8 A& D" j  p" g% ~  d0 B# B: T" f介绍一下crawl参数设置:/ T/ c" Y+ W2 f  F5 h; A

    , Q' N( z7 F5 A7 U) o) ~0 e& o/ S* R'''
    7 g1 ^/ P/ k5 b  @单行代码爬虫程序执行% u9 K2 s) }3 s  V0 u
    :param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档
    - U$ s. }( n" A( r$ h, j) K:param url:即将请求的url地址,仅支持get请求
    . z7 G  X) t2 u! ]( T2 d4 a6 |7 v0 M:param type_url:请求url后返回格式,支持text和json格式返回7 F5 ]' a' J. n0 `
    :param Thread_num:即将启动多线程个数,默认为1单线程! B2 ~0 V5 V5 C; a3 q$ h
    :param sem:协程信号量,控制协程数,防止爬的过快,默认为5& d: x2 `  ]( n; l4 s0 k: q, l
    :param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半. v4 y  [8 s, x/ m7 t1 u0 N, F# d5 S
    :param login:模拟网站登陆,保存登陆信息4 o3 b7 U8 F2 k, y' P4 V# ~& R
    :param Parsing:爬虫方式,支持re、xpath以及bs4方法
    9 `& m3 E' F: J4 H. z& L( _9 }:param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,* V; o. S% G6 z7 T  y
                           多次报错结束程序,默认否
    5 _3 ]5 U( Z' L+ u. K# ]:param label:选择器内容,字典格式保存,1 ]3 Q) x) a  |7 r
                         字典值为列表格式,第一个参数为选择器,第二个参数为转换类型
    ) S/ g1 v- ^6 g: s1 d4 H7 w  M+ k                     第一个参数必填,第二个参数默认str类型4 k% {$ @1 _% X( K
    :param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否
    / b/ n2 Y- k/ s  `( e! j( v5 y% j* z. M:param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫
    . d9 v0 Q% \) B0 c' d" R:param page:是否选择断续笔记接手下次爬虫处理,默认否
    % f" u7 m6 R; l9 u* ^, Z- w; D:param clean:是否进行简单类型数据清洗,默认否
    , R/ v3 d* n! B* y6 U% }4 h:param write_sql:是否写入数据库,默认否9 I  a& @; W; c8 H" Y$ _
                             'host'默认为'localhost','post'默认'3306','user'默认'root',
    ! ?5 m" b4 d* k                         'password':'密码','db':'数据库','table':'数据表',% l# E/ Y+ q8 b, T) o
                             检测库是否存在,若不存在则创建,若存在则直接插入,! c  I. F! U2 V
                             检测表是否存在,若不存在则创建,若存在则直接插入! M/ F4 d$ [6 a# ~2 u! w& s
    :return True& }$ I: r1 m9 V& S8 z
    '''
    % X6 N; n# a/ j6 K5 E+ R$ L# V/ w介绍玩法! a6 d; U) q& r% _( F0 U4 h. l
    接下来介绍的均为调用第三方库的情况下运行:
    & P6 A! W/ Z0 O, N: p9 o9 T! Q9 A, F! P) p( p3 y
    from simple_crawl import request
    8 W  m( Q, E( F" o9 Q6 d第一种玩法:输出源代码
    2 L, p% \0 Z, ]# }/ _调用requests库进行源代码请求。/ Y: z* K7 P( R/ @) m( \
    * R  k4 C. Y, F
    特点:, d7 a/ c6 k8 ~# i$ t
    请求失败则调用ip池处理重新请求访问,  K+ A4 a: e1 J! r, _! F  x
    出现五次失败默认网址输入错误。3 u9 B9 S4 a$ x1 m& X7 N
    支持text以及json字符串返回。默认text。. @2 g8 g1 Y8 a( R4 C
    - H3 ?. A. r: X! ^6 H! Y4 u
    缺点:& d8 u; g( W# {$ h4 @" ~8 O/ L
    暂时只能进行get请求,不支持post访问1 M( f- c2 k1 f5 W1 E
    # r; k3 h: b8 C# k& f
    :return text or json
    & C! S2 r9 D' c8 @1 t5 J7 Y; J
    ' c2 W# Y  ~/ ~6 v$ U! vrequest.parse(
    - W; l' [2 _. Y% j0 j6 A        url = "https://www.douban.com/group/explore",
    & Z5 R. L9 z# M! d        type_url = "text"; J7 W& \7 _$ N& u9 ^9 \* V
    ).run()
    - G) T- q! Z9 U" [6 A# return text
    $ `$ W5 v7 g1 V5 i$ W( S, n6 v% L& K& h$ d: P
    第二种玩法:模拟网站登陆并保存信息* W0 [: N2 `5 V4 j: Z! x0 n
    调用DecryptLogin库请求登陆访问。
    ; S$ A9 S+ b. w# \
    1 j9 Y3 \' ^1 T4 _- K: I# \4 X/ a; Pps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源$ p0 }4 |! S+ E7 i" J" U
    在此放出文档地址4 x" ^4 \) k3 W' u
    DecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/
    + d- g$ d3 i' x9 t( b& Y8 l6 I0 x# \1 x* \, h' q; r
    特点:+ x/ ~: ]: V% i0 g
    将DecryptLogin库中二维码继承到此库(非二次开发)4 G0 E( u! T: S( Z% \- B
    支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆)
    7 S1 Z1 Y: }$ L9 R保存session.pkl信息到本地方便下次登陆运行
    3 z- r  ]% L; v3 A* U" ?1 T. P; o6 L5 J7 U# o, D9 x+ T9 }  Y
    缺点:7 x3 }- G: G+ r2 |. N8 |8 ?; n
    session.pkl登陆信息过时无法自动删除。9 `7 j4 Q6 X% Z5 |% G! L0 x# w5 v4 l
    导致下次登陆疑似cookie无法正常登陆。% J8 T; J9 {) ^! R! [4 G
    3 I9 n# u  X. _+ H; U
    :return session7 w" Z, S% V0 G
    9 i: M- ^) ?; g& e- _
    request.parse(5 w: i& y" `3 B7 ?7 R: ?, n
            # 臭不要脸的推广一下我的店铺& K' u1 }4 d. H, `6 E9 t" q
            url="https://shop574805287.taobao.com/",
    9 p3 D! y& x! `+ H$ _% D        login="taobao"
    ) h  ~5 O. H( u/ G).run()
    ; n8 g- q2 ^1 n8 U$ ?# return text
    ' Z; v# o/ u6 u3 o. m
    # |+ O/ N7 k* O8 P' u# g第三种玩法:爬取网站信息
    7 M" y& ^' M3 j+ I: X, ^6 d爬虫库自然少不了爬虫的过程( @/ y! y  u# q# s$ D& ^5 ~

    8 P* H  X* L$ ~* A6 J( C' m特点:
    # |* ?5 n0 z3 {* x2 Q6 n支持re库,xpath解析以及bs4选择器。; G/ {8 ]6 q$ o) m
    爬取方法为字典格式。单方面输出。5 i; ]( ^( o/ J5 a5 m4 @
    字典键为保存的字段名称。$ e: X: {1 P( G7 o
    字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。
    - f4 e& @. s3 o
      W4 L- S( \+ O缺点:暂无(等待小伙伴们发现)6 j+ @' V6 ?+ @- _3 D8 }$ s0 s
    4 c' \1 x( B9 q9 S  l  H4 }
    :return reptile_results" y" e4 r: k4 y* z- R2 T7 y

    / O0 L6 d  o3 D# }/ Irequest.parse(
    3 j) r" t% K% h) I, U" X        url='https://www.douban.com/group/explore',; @. e# h2 j) H8 o% W" p4 T/ U
            # 字符串格式,选择器方法。# W& r. C5 |$ B5 J
        Parsing = 'xpath',# L" z5 m6 ^/ A
        # 字典格式,参数如上。* w  V8 P5 z3 y
        label = {8 }6 v/ o9 b* g# H+ ?! Z
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],. v  D; P7 X$ T' |/ P
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    : x; ?2 o, m2 E1 C- s        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]: @  B: t$ A! i0 N, K* _
            }/ e& ^1 {9 s, i$ }! L" A
    ).run()3 q: q) E: q' B
    # return reptile_results(list)
    2 k! C! E# z/ @/ m& s. I5 {2 h- ?
    第四种玩法:自由保存信息3 d! ?6 C3 H% t0 `, u3 Q: V
    目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。' P" a5 Q9 J/ P* I* w" y1 O1 Q- p
    & `. `$ @, g' S9 i6 W
    特点:  J( o6 H3 Q! d3 _% e3 R7 [
    写入文件均为数据格式传入文件。1 _0 w) h7 R7 b" [1 Z8 s
    且输入格式规范方便阅读and省事。
    7 J4 P7 ]! a" k
    / G6 t+ {+ s+ i/ \% l9 @( ]5 J3 l' Q缺点:+ B' E- g8 v7 B2 C- h# H
    保存格式仅四种,
    # A/ V: n9 i" e! p$ m' z( s7 L不方便用户之后读写操作。/ W( S0 R: `3 O" |; ^
    / O. o. f6 F' r
    :return file2 N9 v6 R2 w- M: y  X2 s8 y

      D2 R: L; f" f3 f; |/ orequest.parse(
    5 `8 L4 c5 R, s0 i        url='https://www.douban.com/group/explore',* |: e, n% ]- X0 o2 y
        Parsing = 'xpath',8 Z2 ]$ i$ j' i
        label = {
    ; E" M% j( n; G8 c$ ?6 r  e, P! `        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    2 ^! I3 `' ?  E) _$ ]        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],( \7 {9 y. u  Q( u$ w6 c& f/ W0 a
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    6 N* s5 ^% J; [$ {& C/ Y        },) }# T9 Y  z: h/ b
        # 字符串格式,具体保存位置填写
    7 h! P: y: Z0 D% s' B/ ?' G, h6 _4 B    write='result.pkl'
    $ Z9 [! M% K0 I$ {% s# @1 g).run()
    ' I: Y  w& {0 B9 @0 ]6 @- l! U6 v. N+ k# return file& X  O/ o/ B- K8 e1 q# @9 N* f

    $ L0 x8 w1 z: \  t第五种玩法:读取下一页 url 地址继续爬虫: o" B( c1 K/ ^1 @, H
    这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~
    # h* g  R- X8 r6 @4 j- k
    + {. t0 Z* X/ G7 u5 M  X2 y特点:
    ! u5 I, ?1 a; J继承之前的Parsing参数选择器选择方法。( A! T: e4 X6 g
    在这里可读取到解析后的下一页 url 网址。
    ( I$ x; i! |( z2 e* L方可继续进行爬虫处理。方便用户使用。
    1 W( m4 A' R0 I+ X
    $ h5 O# o$ A% {/ t& M1 J缺点:/ O; R9 J+ D0 _4 u  ^: j  e! T
    若爬虫时下一页 url 地址改变,便结束爬虫。
    7 Z- O, ]9 a% v+ @1 K只能爬取所给 url 地址中的信息。: k% m- T. @" n/ \$ T/ `, Z
    无法进行某一界面的多个网页爬取返回。7 O* L* W0 a3 w2 N
    造成访问页面单一流失。
    6 f; g. P% M; M7 e( H8 u) {- |4 h+ w( l
    5 _1 q8 b) v" L) {8 @$ m:return None9 y9 q* L, o7 Q6 P- G6 D

    3 h! k; @2 i. l4 Drequest.parse(
    4 A4 E& a9 ^+ N5 D* \+ e# k        url='https://www.douban.com/group/explore',
    * G  h( z( i1 O: Y+ j& C$ y) x    Parsing = 'xpath',% `5 @1 X; M: O5 j1 |0 W
        label = {
    ) q$ o" M" x6 p% X: ]  h        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    0 }; o, {# u# \/ V* I        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    1 y. h. ~: ]# v3 U2 A0 S5 ~        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    5 I/ c+ }' w, f! e& l8 n        },
    4 I* X, I+ N( n* k( f: _9 W    write='result.pkl',
    : v& W$ X4 W$ F0 A: U2 K    # 字符串格式,根据Parsing方法继续请求下一页a中href
    * c, w5 _& x) s0 \8 K    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    . K+ G  I% K! G8 t, e2 D0 d9 Y, X).run()
    . `9 A7 K7 |4 p  |1 s, ?# return None
    " T5 b/ I4 v$ g& q  e4 J
    ; U* R7 N. z% D& t+ K6 `4 X. k2 w+ k5 v第六种玩法:爬虫网页保存  s' @8 R( G8 j& _" X
    听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!! U# E; q" R3 i9 t9 N) j& ^7 q

    ( b! G2 y1 A+ U8 G: w( t( @特点:' l4 J' X' s9 r! e- s
    持续输出断续笔记。
    ' P  S) x2 \; b( f1 P" ]/ e4 L将此次爬虫的 url 地址保存到一个文本文档内部。
    6 N0 w. V. |9 S! v" [# P下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。
    0 [" R" \. G) Q
    $ J* q7 G5 M5 d) v' M缺点:
    5 F4 d# E6 F2 j4 ~$ ^* V; s读取内容不单一。! ~) A. d: \2 m. q! S2 ~
    导致下次爬虫无法正确读取上次爬虫留下的痕迹。
    ! d! h- \% A0 O$ e6 k! h$ |# F, T: z% J1 u$ o. M
    :return url_file6 J, T" r! y5 X3 i  W( y5 p* F3 P
    : t7 y' F8 {6 q' V, X
    request.parse(0 h: y, K9 ~8 ~& `
        url='https://www.douban.com/group/explore',
    5 `* Y; }' G# o    type_url='text',! p1 L4 U3 ^6 c; V
        #login='taobao',
    1 @" n' r% @5 H; K4 r) z: ?    Parsing = 'xpath',/ l& b- K( q5 i, w! n) R
        label = {
    ; A- f1 Q: m  h6 G6 D3 e8 _6 P        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],, `: b  Z9 m, @. ?: Q- n# F
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],! ~) T) w' n7 p( j! y1 u
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str], t# r/ b, C: ]/ n5 p8 J: H
            },* O, Z( A# f* v0 I; k* d
        write='result.pkl',
    ( i; |7 L! W/ L    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',' ^1 U: }) b" Y+ w& U+ e9 u% z
        # 第一个参数为是否需要断续笔记。
    % F$ {8 b5 @2 n8 Z' Y    # 第二个参数为断续笔记保存位置。; M" \( p0 s% W" `- ]: Z8 a
        page=[True,'url_page.txt']
    ' p+ _2 F5 K0 D6 F4 v).run()
    2 Q* C! e8 \' Q2 ~3 [  g# return url_file
    , b: Q# d$ @3 Y9 V* k
    % `4 X, g' l# j第七种玩法:简单数据清洗. {; [8 `# ~; R; ?; U: b
    数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。
    4 k7 i5 n: `- N3 i# V" ]* @6 X3 R" K0 T* j
    特点:. ?  c( c' ~4 A. e  c: Q/ E
    本人曾写过一个底层数据清洗。
    # {4 z1 _  ]# W+ h3 D8 `6 M2 _( w能将列表格式数据进行归分清洗。( Q0 s1 T$ r. e6 v
    主要内容请参考另一篇文章
    ( h- w" p& X0 [% `' m如下连接:数据清洗7 D: P' o' H' [6 ]/ x# W: |

    8 c2 g/ l3 r7 D8 g' n) C缺点:
      u$ e& }' |5 v" D/ B1 p数据清洗格式简单。1 `2 h, i# `+ T) j$ H/ z# N
    数据清洗内容单一。7 A: A( c1 a2 j; j& Y8 Y9 W" Y
    无法完全做到绝对清洗。
    * N; Q* p5 I+ ~/ z有待改善。- ]) T% A( X, }8 b  t9 P7 {. d: K
    - y# c+ [$ n4 |( |
    :return keyword_list, value_list
    ; K& y8 @8 l! U" W" \* Q& P4 S4 U/ Q# v) y' A
    request.parse(
    " z) g* l0 N7 b& S, j    url='https://www.douban.com/group/explore',7 R/ U# }- c2 ]: O" t6 q$ ~
        Parsing = 'xpath',7 `, {" V! B# J3 B' }4 q
        label = {# [& X1 C& ^( @1 {$ ]* `
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],9 E( d- D" A) v2 Y: D
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],9 \. ?2 D* U8 a0 Q9 `5 f
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    % w. h6 L* E: O& y. U9 v        },: J# t1 H) J4 Y2 d8 y7 v
        write='result.pkl',
    ( u9 v9 X9 o+ p# t1 f) [3 U2 N% ?: G6 s    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    0 R0 Q# ?$ S3 E# L. t" F. D  Y    page=[True,'url_page.txt'],
    , E# ]# `  S! Q- K' o    # bool类型,默认不清洗& }1 m) j+ u1 q8 G3 q
        clean=True2 B4 Q2 n( A; |( M5 i0 I
    ).run()
    ' A+ Z+ m) y* v! J" N7 ?  C: u$ {. ~: [7 N6 X: }" g. U% M
    第八种玩法:爬虫存入数据库) W' U  C7 q2 |9 v5 {8 O# n
    存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。
    2 V% s! b* v+ E1 K$ j& ~# T% l5 [
    ' J8 ?+ }/ [9 g7 r8 Y特点:. j" q. X% H" q, k4 U4 t
    信息存入MySQL数据库。
    % f* q  U( R% w7 r% P可连接docker远程数据库。% T# I& B: W# d
    数据库的库名可以不存在。  b/ m. f2 K0 G6 Y" ]
    数据库的表名可以不存在。
    0 V( a) o8 Q$ b1 h" A1 v根据之前传入字典键与值参数判断表类型。  H$ f$ {  I1 i& {" Z0 G- u4 P4 Q
    自由建立数据表传入信息。7 \+ c. c' a8 q. h3 e1 H4 k- S

    0 H3 w$ G5 X  M( e0 [' S3 v缺点:# r. b" Q  F) n9 x. Z+ o
    仅支持MySQL数据库。  i- n5 ?6 r6 L5 I, j* I
    & e6 W7 x" p- v
    :return SQL
    # j9 z0 u- }# Q2 _+ ~% M* e, g; R: [% Q: }' t) W
    request.parse(
      m$ L" i4 ?% Q% Y; D    url='https://www.douban.com/group/explore',; r# K4 p" a! }/ ]& A
        Parsing = 'xpath',
    % F' [3 ]; ~7 w: p* M    label = {9 w; x8 [- x; E
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    ( h6 g' M" a; F+ L        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    5 c% R: o. Z. }6 d; Y- o        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    2 Y, Q' U$ _* ~7 I4 @        },! X& U5 m+ i2 d: V; W& Z% s
        write='result.pkl',
    : ]) z/ ~7 E/ X6 I    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    + @  |# h& [1 X- ^& c0 m    page=[True,'url_page.txt'],2 X  C  D2 \" {" Z7 z6 J
        clean=True,0 I( ?2 v3 S" m' c" l6 [2 J
        # 字典格式,7 a' f" A. Q) y
        # host可有可无,默认localhost* H! w2 s! w& d
        # post可有可无,默认3306
    8 a( @) F3 ]$ J4 ~    # user可有可无,默认root
    . _; p7 e+ [! C1 t) T* \    # password必要参数,数据库连接密码
    , l' p' z* r5 w9 `1 g6 X4 `    # db必要参数,数据库即将存入的库名% M# C" |2 h( p9 g/ F0 X
        # table必要参数,数据库即将存入的表名9 X: d* G5 m- J* m! S: w  A
        write_SQL={4 F( f5 N7 H  M0 h. G! k1 u* a
            'host':'localhost',
    " d, M' J' {" o        'post':'3306',4 a" _% s5 ~7 I- H
            'user':'root',
    & `8 }$ F( }. p- l        'password':'123456',' o6 v9 m- N  S8 n5 J+ o4 ~
            'db':'example',! a0 ~0 I8 i1 h4 F$ g. B) D
            'table':'example'
    0 a! Q% E/ J0 o$ D8 g/ J        }( i1 n( w' q6 X7 {/ z
        ).run()6 j9 J# u9 M* L  p* g

    . A6 D- L( B( U! a  z第九种玩法:重新启动爬虫0 J5 g* d2 S" C$ m
    爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。; W0 K% I, _2 y
    6 q8 Z% J; }* W
    特点:" d: Y# a- w5 i5 O3 B. ~# N+ s
    检测报错重新启动爬虫
    & v/ ?# c) B( i- t2 S无需手动处理错误信息: f8 i" e9 m$ G. C; n" x
    2 A6 O5 B4 E, G1 y6 ^' q/ L
    缺点:0 k7 e& n* h. g, V+ r# w: K
    无法收集子线程错误。
    1 b! H: n8 E! q3 ^9 z- J9 ~
    " s! Z) q) H5 q$ ?+ E6 d:return None
    : T/ }) n+ _, q% V) T
    % _& A* {, |4 g# ]. K  t/ frequest.parse(
    8 H+ `% c* j+ a        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],% V- a, b$ I3 c2 E) |4 U+ T
            #login="taobao",5 g) M1 v* I# x9 N$ T: i
            type_url = "text",
    2 [, f" N& A9 g3 T" P0 P2 `% I        Parsing = 'xpath',
    / o, u  s- _  z2 S3 X2 @9 |- M9 {. i        label = {
    3 Z7 N  k! b6 U. u7 q            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],+ d# I; ^$ ]7 z4 d9 r# d
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],1 P* X+ J7 _) O; F, B
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    ' \" x% M2 \( E% U( c4 O            },
    8 i* @/ g7 z; z6 a5 n        write='result.txt',
    2 q2 ?( ^8 K: Y/ E  o$ M        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',% `: \  ?# X3 J6 x* k" a5 _4 o: r
            page=[True,"now_url.txt"],
    . S; t2 \  U2 D        # texting 参数为是否启用连续爬虫
    ! g3 k4 o/ y2 [- `' b" Y, u        # 爬虫程序异常报错后重新启动爬虫
    + o7 ~; n0 Y8 ]5 R  A1 D+ @9 Z        texting=True,
    7 e7 Y/ x* K0 N9 v8 o        ###" y  \2 _& B4 G2 c9 Q
            write_SQL={
    - Y/ H+ F: P: p$ p            'host':'localhost',+ p8 u# ?" j6 U
                'post':'3306',7 w( P" Q9 D3 E8 \6 p
                'user':'root',) u; T9 x7 }  L2 {- y8 s& {
                'password':'123456',
    3 _  k$ l! n/ ^, P  t0 H, Q& Q            'db':'example',1 l+ z/ I' T5 |9 \3 @6 V
                'table':'example'" n7 w! s  Y) L
                }
    ' U' T/ u3 G" P+ {" i! _).run()
    ' i9 z0 L( O- o% m! `
    0 P# P9 v' g; t# _' D0 f第十种玩法:多线程爬虫5 W1 d8 K' J8 z: z0 C! ^* A7 T
    特点:$ K. F  x; `+ B# J$ X" N
    爬虫速度加快,6 i/ X; y5 _4 X* d) |
    更好的利用了线程。
    ! |. W: U# R  a" E% i. Q
    4 f" y2 g0 `$ O9 o0 c1 M缺点:暂无- w) Z; ?/ r7 V4 U; }2 `
    9 y( D( U0 s4 M0 y6 j) m' W' z
    :return None
    * U2 O& ?9 V( s0 U1 X& E4 f) E: j4 C
    - J% Y& H$ l2 k, C7 Yrequest.parse(
    : |6 D4 n2 ~/ y$ j2 @        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],$ t* m  w$ F( s! U6 v" y- K- j9 M$ b
            #login="taobao",
    , t. I, N- _, F- c; }        type_url = "text",$ o' a4 U( o! P9 l
            Parsing = 'xpath',! e. Z$ x/ O, j( V$ R- d
            label = {* r; K0 L  r0 E6 i
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],, P' o( f: O, U) x* l
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],# F. r  Z* U% b- A9 y' ]* h
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]) |+ }7 L9 j) J* O1 \( I& n
                }," A6 ^+ ?5 Y. }  a3 T! c5 m
            write='result.txt',
    5 ^5 H0 p+ E2 ]0 ^2 c        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',: c' y# o/ Y7 l+ h
            page=[True,"now_url.txt"],
    5 `2 l/ L& @+ K+ D0 a$ h        #clean=True,/ }( S; f" r, q. g7 X5 z! U
            texting=True,; f( P: e+ L1 o! V# ^' x  I3 N3 B
            # status="threads" 启用多线程爬虫( P0 |2 P% t) m  o, M1 Y
            # Thread_num 为线程数目,默认为1 单线程% ~# J2 c& b: I" R2 T/ h
            status="threads",/ m7 o2 u1 b' c8 ?9 U
            Thread_num=3,
    , J# `! c* k6 u' q        ###: P( y; ?9 M2 `, @2 I' z
            write_SQL={
    ' Y9 p# `7 j5 @            'host':'localhost',
    9 Q5 G( w( Y; o' C* J' O) ?            'post':'3306',
    , X! w: T9 j6 r- f3 F+ h            'user':'root',
    " T# u" y) Q) {6 `- |0 [            'password':'123456',
    + [+ A2 @6 U% c            'db':'example',
    ( {: A) {$ K2 y            'table':'example'7 @* d' R5 N+ q8 ?5 Z% n
                }
    ! K8 j; p% }$ q0 F. [/ {).run()
    " V! t" D: v7 S: {$ O' H$ Z8 O1 [5 A3 I# I3 ^
    第十一种玩法:多进程爬虫
    6 D) ~( v: U  _+ y特点:( T- G5 I9 j7 M+ a" a9 O! ]
    爬虫速度加快,
    ( ^: w$ K5 q+ w4 t3 q. o; ^更好的利用了进程。+ ?% }+ |7 Z1 e
    ! s& d" O  z9 H" R
    缺点:暂无& @, q8 D0 g. u6 `% t: b

    % X. f3 ]. X0 ]( z8 t8 s6 U:return None# _2 C$ }# _9 D& g
    ' l. x  `1 m( c3 g
    from simple_crawl import request
    . t- u! |7 c* D9 l2 D7 y* Arequest.parse(% G( k4 F! \. M/ \! B% ]
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    5 L4 n# g( k% X7 L        #login="taobao",
    # t# f; e" _/ L4 ~$ x  Y, B        type_url = "text",
    * T; ?" |% h) y: r4 v        Parsing = 'xpath',
    / A+ T! G: I. Y6 @0 l; n7 K        label = {6 }) c6 ?9 [! O# f
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],  K- e6 O+ x: W6 P) V, z/ X# K
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    & T( y: w, s% r& ]. A1 j+ E            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]: P& y+ L1 H+ T4 B4 s* z* J( W" S
                },
    & ^) n5 e: S; b1 K* b5 [6 r  Z        write='result.txt',% L. {1 T( o2 q6 P
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',: l4 i0 ?4 ^* V4 u% F
            page=[True,"now_url.txt"],
    / Y8 ~+ a* A% C$ ]2 T: ^        #clean=True,, A: \. B% r: P# u% @
            texting=True,) A* V7 y, l7 d" w- }0 g' \
            # status="multiprocessing" 启用多进程爬虫
    # k* U) `0 g& p& c4 d        # cpu_count 为启动代码核心数,默认为系统核数一半
    / z4 m: Z% Z0 l* t        status="multiprocessing",! @* G1 s: T* c/ E
            cpu_count=2,
    6 {8 o$ e4 }, Q5 p0 t        ###% Y  u$ p% H2 L) y% X/ a% _
            write_SQL={3 E! A( V, Z: Y  f& Y5 a
                'host':'localhost',
    " l( ~5 z) M- d( `7 H  T            'post':'3306'," Q6 P6 |% ^8 v2 b" K/ h
                'user':'root',
      z2 W' X  H% w            'password':'123456',) d0 t% S0 k! d- w- P0 Y
                'db':'example',0 [9 P; v1 t+ [
                'table':'example'
    9 w+ c" J& c# q& K6 o6 Z5 X            }. e5 K( q. }$ K6 E& H
    ).run()$ g* F& z6 v" H# }. b2 o

    7 u+ v9 m, s+ y. P. l3 n; m" N& {2 [第十二种玩法:异步多线程爬虫1 p" S+ m3 A. y
    特点:
    7 s; l8 l, i* ~. A7 ^, y爬虫速度加快,) h$ E# ?% V2 a: W
    异步使得爬虫无等待时间,
    / n. m' h$ H1 s0 d( |. Y同时使用多线程速度明显加快。* F$ o7 q. q0 }/ ]( G9 g

    7 f4 a4 n: W4 I% W+ G缺点:暂无
    ' y1 T; L7 q) D
    7 K3 w; a, {- S4 ?7 G:return None( a7 M& k0 |5 J9 }$ E2 ^4 G/ K- \

    8 ]' F$ P( ]+ h3 w2 m# s  G; gfrom simple_crawl import request& u+ C1 u: x( K  h5 t7 R* h6 y
    request.parse(
    ' ~3 L$ l3 K  K. q! a        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],$ d# j, n# b  |# e; z+ K1 ~" [9 F# b
            #login="taobao",
    . z' H( W" F0 Z+ f! w        type_url = "text",
    9 W  L7 R+ A" W( W7 a( y: b& _        Parsing = 'xpath',
    6 A. K/ c6 `8 t" r' Z        label = {$ E2 j' C0 V, c* |7 |6 e0 ^/ U
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    9 V7 T5 E! t6 C4 @0 B            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],+ i! w/ h8 t2 N; Q- `3 F6 f( P! [0 ~8 x
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]. V1 d9 T8 J" V. X# V* D* Y- U' e
                },
    ' j# w" ?! J$ x* |& C        write='result.txt',% f& r, A$ X$ F/ {$ v/ G3 g
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',% l2 k% P3 a* Z/ `
            page=[True,"now_url.txt"],# o7 H& ]2 ^8 m2 o- F
            #clean=True,. h# C7 \* R, O- b
            texting=True,
    ' P. H3 E! J, \: F$ F* F        # sem 参数为异步引擎数目,默认为5
    , d6 O- I2 ]! k$ f        # 其他参数同上
    , n" Y% w* n, k& a        status="aiohttp",$ T: j( M* e6 C
            Thread_num=3,
    & R+ K4 K0 M1 V3 v; O. {        sem=5,/ F% ?( N: l! c
            ###
    1 P1 I, n5 G/ P7 H4 h% H( [, ?        write_SQL={
    " z+ f8 X& \- I$ ~  w7 j            'host':'localhost',
    0 b. P! `9 P5 E7 D5 u6 c            'post':'3306',! i  X# X% B, ]# p. }! k
                'user':'root',
    $ L3 n6 H0 j6 e' u8 w+ h9 ?+ }* i            'password':'123456',- |4 o3 e% R; p) w" p$ f
                'db':'example',8 R' P1 M2 G& d+ S4 w! }! C
                'table':'example'$ m# J0 K4 W0 C1 i4 ~" h& c# m
                }& R! S" L$ V. T+ b2 N/ o6 m# q
    ).run()- E. N, s7 e; A0 R* F
    ; Z8 ]9 |$ s  u: q% E1 T
    第十三种玩法:异步多进程爬虫/ I& E1 c, l, @6 x7 @- @( Y
    特点:
    9 s5 V  z: S0 w* N6 J, \  f爬虫速度加快,
    + j% |3 A) ~! ]7 I7 I& n6 h3 z异步使得爬虫无等待时间,
    1 m* M" f" Z7 q8 L2 E/ T/ m& J同时使用多进程速度明显加快。6 G' W& z0 m1 P0 ]. J7 ?) w3 E2 t/ O& G
    7 ~, L6 w0 I4 U/ P: V# T" m& ]& S) o9 o
    缺点:暂无
    ! x6 u: _" i4 p* D
    1 G* m! o; x8 s# f:return None: G+ e4 g1 w' B) c, o$ y' _
    3 s% Y8 H9 g4 e3 [
    from simple_crawl import request: G4 ^4 s" ]1 Y1 \
    request.parse(1 w  S. m; \& h# o- e& A4 e
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    ! V' s5 s1 q6 A" M% Y! l& |+ Q. V' \        #login="taobao",
    3 w: f! v/ N3 f  D/ C  C; |        type_url = "text",' D1 t$ u  T1 K" R2 j/ @5 l
            Parsing = 'xpath',
    1 o6 W  D1 V* S* [6 Y& [        label = {, n8 D, j+ `: E" D7 p6 |) B9 H2 J/ ?
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],5 V3 V- K# R2 T. U
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    + g# z" \- x- [, |  ]& f$ A            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    + z. \) ?% \3 b" B- v. f; q9 P& @            },0 {4 ?$ v# J2 A' t) O9 J; w4 C
            write='result.txt',
    8 h; F' H: h+ F        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    1 V( u) y' h0 V. Q  W        page=[True,"now_url.txt"],( X) x$ K" V/ \' y0 ]
            #clean=True,
    5 f* t: Y! x4 }! r+ W        texting=True,8 b) a1 F9 N$ B& e
            # 参数如上
    & x3 u. c; z+ G/ ]6 [7 i( ~        status="between",: y4 }' y1 I$ F: @# J* _
            cpu_count=1,% Z4 p7 n2 L) I2 f
            sem=5,
    : }- P5 C6 u. x' O% F; C8 `        ###
    ; M: I1 H- m0 ?$ f! Y. d( ?        write_SQL={
    % t. A$ w' {5 c' M7 w            'host':'localhost',
    . v. x2 m: H* C1 \1 @+ |            'post':'3306',5 B4 I( ~+ p$ A# A
                'user':'root',
    # K- x3 z' R# x# E) w            'password':'123456',
    + X) g- Q# M, g            'db':'example',+ d$ ?( @! K& _/ d* R) H
                'table':'example'
    : I$ H$ b6 @2 r) x            }
    * }  r3 b. W( r3 {+ Y4 c. C).run()
    * c' @  @* A+ r& O& l2 q/ ~) a8 U9 N) f# v8 y4 p& |) q

    3 N) h" j" [4 c7 a功能介绍完毕🤞* F. C) w- d5 V
    最后还是希望你们能给我点一波小小的关注。0 W3 M3 x' H$ y  I  v  j
    奉上自己诚挚的爱心💖
    1 l/ O& @- Q7 ^  ^9 ~$ r6 l0 X& q3 ]————————————————
    % p( K) a( t/ N/ P版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    , N5 ]1 O5 K5 u' @1 J4 J原文链接:https://blog.csdn.net/qq_45414559/article/details/106005684
    . N/ Y2 F/ {: u" D( r) `) Y
    $ ~/ n8 p/ u4 |  L) Y
    ) N; h# {5 `- }, [5 ?: X6 A/ h9 ]
    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-5-8 04:43 , Processed in 0.347087 second(s), 56 queries .

    回顶部