QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5472|回复: 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. {  L0 `" J* ^( |
    simple_crawl
    - _4 U. Z9 j$ E6 s. _6 D8 C4 J) ]% u仅需一行代码即可达到爬虫效果
    3 w% J+ o2 a) V2 P  J项目地址(欢迎star):https://github.com/Amiee-well/crawl$ m. Q$ L: m# I$ Z
    使用方法
    7 K5 O8 ?! ^: J& \  m' @+ \# T/ o( Ypip install simple_crawl  D# o' C* e& i6 D, C

    3 r% t) Q+ v. h% [0 V' D3 A### 以下源代码为简单介绍,详细功能介绍再源代码之下) K4 L+ n, h& S% Q8 A' d
    from simple_crawl import request
    ! P# W+ T/ S" o0 g2 Erequest.parse(
      U' E/ m  J" m( K+ P6 N$ F        # status 参数为运行状态,支持单线程多线程多进程协程以及联合3 z0 R: H+ |" }3 u1 G4 L
            status="aiohttp",% S# y, I; G/ Z( I( ~. Z
            # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式# x# s) w1 _- ]. J4 ~" A( M1 H
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    8 ?$ N# Z5 `) z) g0 y; a0 d  i        # login 参数为获取登陆信息,如淘宝等网址需要登陆信息# f; r3 @: l1 X  u4 J6 [+ J
        #login="taobao",
    8 ?$ l7 x9 n  a" T# O2 X    # type_url 参数为返回源代码格式,支持text和json,默认返回text
    % e% z6 x& E# L" {9 S0 X& d2 T* k# c    type_url = "text",
    2 {) d( N$ H2 P: o- u" @7 B( `    # Parsing 参数为解析方法,支持re、xpath和beautifulsoup7 ^% H$ \# N1 [+ j* d; t
        Parsing = 'xpath',
    4 d6 w% G" [9 h8 q& @, m1 d    # label 参数为爬虫解析过程,字典格式,详情见下方
    5 b2 \" D4 P. T. I7 z+ |# g6 @    label = {) e* b& Q; y& e0 c# v% R
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],6 g2 f9 b7 I: w2 P9 {
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],: r1 y2 P6 U# Z9 h* z: D
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    2 n# I2 _7 y+ U( n     },
    . V5 z$ {' x& x. ]/ s1 w6 [     # write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱  L0 U+ w7 k4 j0 g# i/ u
         write='result.txt',
    & x) }' k3 ^; S* |) _     # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫* M& }. A! V" r! x( I
         next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',/ I$ A/ o8 }0 b, e1 i7 \
         # page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫
    3 z% G7 k8 l/ L  }  N7 H7 h( G, g     page=[True,"now_url.txt"],
    ' q6 u5 F1 F+ x* g* e6 p     # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息
    : o1 C, t% c6 E* \. [2 k     #clean=True,, S/ d7 C8 `! @' V
         # texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序
    " F* G* S' G" i  X: R     texting=True,& D; i8 \4 a% Z# S1 ~
         # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态: [9 C% o' l, r1 ~& U
         Thread_num=3,
      ~; x2 N: M! Y- f     # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态% b5 a; O+ y; Z9 H& Q6 o, y
         cpu_count=1,2 @; _3 h8 v/ \7 q6 `$ ^
         # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态
    " N! x: S7 F& Q     sem=5,/ e$ S3 d! k, |9 o  R
         # write_SQL 为是否写入数据库,默认否$ N( Y; B7 X/ `
         # host 参数默认localhost9 l2 S1 }, Y3 V% [4 R
         # post 参数默认3306
    / ?, [* ]  n$ ]     # user 参数默认root% d5 i2 l: E& N8 c
         # password 参数必填,必须正确$ ?6 p* {# E( C9 F4 o8 X# n1 H
         # db 参数为即将存入的数据库名,若不存在自动创建
    2 Y" u. d1 z4 e' E     # table 参数为即将存入的数据表名,若不存在自动创建1 N3 N2 V3 e6 i) f
         write_SQL={6 ]8 |" D% g$ t' y( ~; E
             'host':'localhost',
    " Y! Y' O$ h8 e         'post':'3306',2 U# V* \* l: |6 F! n
             'user':'root',# s% u+ ]0 O) j/ @8 n% v
             'password':'123456',6 m7 W* |" \( T  I3 P0 {4 ?9 `3 \
             'db':'example',4 }5 G9 y1 s* ~5 A+ P% Y' G
             'table':'example'
    , i' o- I8 t6 c4 [8 b7 V      }
    0 j9 h; g+ ~$ L  h).run()# c" _; D: f5 _* e. A: n" I7 t
    8 ~# a6 \% x, j, ?
    介绍一下crawl参数设置:
    2 B3 V( ^% C0 A- S% q
    : J# s1 L% g- w* \& j'''
    9 i1 E1 d' S2 w) `# d单行代码爬虫程序执行4 ~+ }( X$ u$ ]
    :param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档) O0 t* ?8 k/ T; s
    :param url:即将请求的url地址,仅支持get请求
    7 L0 i& s8 H( c:param type_url:请求url后返回格式,支持text和json格式返回
    * s. H/ V; `6 T1 p3 I" Q; K:param Thread_num:即将启动多线程个数,默认为1单线程
    & I' B6 @, c; i% o8 y: V* L:param sem:协程信号量,控制协程数,防止爬的过快,默认为55 P; _$ U2 a1 }, G7 ?
    :param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半
    4 |4 y, s4 F6 y6 k8 ?:param login:模拟网站登陆,保存登陆信息
    4 a& i" y, T& N4 F5 d:param Parsing:爬虫方式,支持re、xpath以及bs4方法: g" r: `& e8 M7 k6 |1 ^
    :param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,
    : k" Q( x1 R1 ^. k                       多次报错结束程序,默认否
    9 ~5 J% ^" b- M3 c! I) [" P! [5 P:param label:选择器内容,字典格式保存,
    0 r0 Y* i, D' d  G0 x: j" `# f# F                     字典值为列表格式,第一个参数为选择器,第二个参数为转换类型
    2 z! C5 s' T8 b7 J0 M% c! L3 w% U0 W' z                     第一个参数必填,第二个参数默认str类型
    2 g( |8 \7 F( c2 ^# D, _& e" v:param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否
    $ S$ p% Q# O/ F; Y9 @# ?:param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫
      |' Z# P& S. ~" j:param page:是否选择断续笔记接手下次爬虫处理,默认否
    . h* h/ L  a: |+ I% D:param clean:是否进行简单类型数据清洗,默认否
    7 O  O. B2 x- E:param write_sql:是否写入数据库,默认否+ q& _0 r4 V0 A2 ?4 m) s( J
                             'host'默认为'localhost','post'默认'3306','user'默认'root',/ z" |& G: K/ n( K; C4 U' w& L/ X
                             'password':'密码','db':'数据库','table':'数据表',% O7 y2 M1 d  ?/ B" U3 a
                             检测库是否存在,若不存在则创建,若存在则直接插入,
    ( m! _9 N9 A2 F8 u' m& p+ u: Q                         检测表是否存在,若不存在则创建,若存在则直接插入
    2 |6 i: h$ c: F, C  w:return True7 p4 R+ C% b% _0 A$ o
    '''5 p+ H, o, [& m0 @2 t
    介绍玩法
    * l5 B& m% H. y6 A6 g接下来介绍的均为调用第三方库的情况下运行:9 S! [  S" N$ a4 t8 i. `

    4 H! v3 g" m% t1 m9 t* i4 jfrom simple_crawl import request7 C2 E5 w6 ?  M8 v( P, E4 e
    第一种玩法:输出源代码
    9 p% i6 O& o1 o! ]0 }. a调用requests库进行源代码请求。
    , U" @, i/ c& ]: a2 l5 z: I6 J7 I) q" n8 {% p% p6 _9 L) U; H) H9 l  [2 }' C1 i
    特点:
    * u; M# ]; [" m# j请求失败则调用ip池处理重新请求访问,& G) `4 C9 }' @% C9 g3 v7 G5 _
    出现五次失败默认网址输入错误。7 d( b; T6 [; U% w4 \; z
    支持text以及json字符串返回。默认text。
    $ l8 W& Z$ d$ c6 T& L
    & y$ i8 T1 L( [! C+ Q缺点:, l& q) ~9 R( \! u& \
    暂时只能进行get请求,不支持post访问
    1 M4 e: N  I0 R0 v% B) l! U
    # J- o- a! Y6 X6 W" o6 L. y:return text or json
    ! d: Y# j& `$ O  r5 U4 Z! g$ Q+ u
    " ]0 g$ o3 G& Urequest.parse(2 q. [2 Z1 u2 {( ]3 K6 s9 `0 c
            url = "https://www.douban.com/group/explore",
    " i- z3 O& L2 Y% u        type_url = "text"% F. @: ~5 Y- ~/ E8 x
    ).run(), q7 B1 q% J! R6 }! p! z) a" P# q
    # return text! H$ R5 e' d$ s4 [$ v; N

    & _4 Y7 d8 Z  v7 I第二种玩法:模拟网站登陆并保存信息
    / [/ `& m- P8 D' E; N7 f6 C( @调用DecryptLogin库请求登陆访问。  {! u0 u1 u3 {. y

    2 I6 B+ K2 u- q! y. A; pps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源+ e" }; f0 t1 s0 ~: N
    在此放出文档地址4 V. [! V8 j- L' D. d$ }) Z: {
    DecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/9 B+ `# b4 ^) A' I

    & w& H6 |; o1 O2 ~: e0 f5 \特点:
    5 G( d* f1 P  ~( z' R9 J. F将DecryptLogin库中二维码继承到此库(非二次开发)
    7 D; `% f! e, D; V1 i支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆)
    ) j8 r% M7 _- m) }- w保存session.pkl信息到本地方便下次登陆运行7 f  O' U: y0 z4 i- x: {3 Z. W
    9 z" `4 a8 K, P, l; z$ ~' V
    缺点:! g' G* `" W" I1 f& K" y0 c) s3 E
    session.pkl登陆信息过时无法自动删除。. U$ Q* G3 d& e
    导致下次登陆疑似cookie无法正常登陆。, T/ O) \( T5 H7 s6 G
    - f9 Y- z  {: G5 v  d# [- v
    :return session
    & ]7 S. i5 Q) Q/ U
    % b) G) v# i6 M3 R3 b$ lrequest.parse(
    $ \9 p: P  j0 m8 P- ]        # 臭不要脸的推广一下我的店铺2 Z1 X9 m7 F: b; q7 j# e. f* s
            url="https://shop574805287.taobao.com/",0 _! c9 P! O" S" W
            login="taobao"
    4 E: l  J# H3 P, W).run()0 ?) J1 z! p  P; n" p0 u
    # return text
    $ ^4 ]" U) E, e0 b; j/ K/ W% A" P0 p3 y6 y7 G- I! [
    第三种玩法:爬取网站信息% S$ b- K2 {/ {* C+ G& O" R- X4 \
    爬虫库自然少不了爬虫的过程
      `: V& N8 G6 c2 s& ~) w
    & z" F" {9 n  v9 K2 n特点:2 G2 ~: ~6 M. W3 {( p% w% R- Z
    支持re库,xpath解析以及bs4选择器。& W5 Y3 ]% d6 H, u
    爬取方法为字典格式。单方面输出。* i8 N4 c  s! V8 D
    字典键为保存的字段名称。# O* Z; i3 h  Q/ r5 F, r. `3 B
    字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。- f3 I% t" ]& g
    : _, e& G( H6 c, c6 J$ m# w) D: i" [
    缺点:暂无(等待小伙伴们发现)- i: r  M/ O0 f
    ! L" F2 W. L% `$ x& S4 ?
    :return reptile_results9 E5 W, ]3 l1 b& F- A
    2 \" T3 w& g& {
    request.parse(
    ( T; s, h, n" P" a        url='https://www.douban.com/group/explore',
    2 H. K) u6 X& D, S6 r! a) p        # 字符串格式,选择器方法。
    + ?+ ?% }: _# ]6 k. K9 R    Parsing = 'xpath',
    4 A  h* U, w; j! ?3 i    # 字典格式,参数如上。) t* v7 C4 H' P$ L
        label = {
    6 J2 |) }" ?9 Y  ~# g        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    3 q) ^& ^. D( @        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],2 U/ ^; [* e- k# K
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]/ i: e5 W& t( H; [
            }- A9 @, ]  ~9 d
    ).run()  s: e( Z+ a. l7 Y, |: x+ K
    # return reptile_results(list)2 Q: `8 e' e4 ?6 n/ X: Y( {  z# t
    # Y- ~9 w. m  N  v  K4 J+ S( b& V3 o
    第四种玩法:自由保存信息
    4 }: U" a) `' ?/ `- W8 A2 M目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。
    5 N* ]; M9 r% l; t5 p9 K, q. g5 }
    特点:6 B) Y0 ^& s4 V: a
    写入文件均为数据格式传入文件。  `4 J' q+ I1 V! J! z; }" }
    且输入格式规范方便阅读and省事。0 e/ n" P, t4 [
    ) l. {6 t( k) d  J6 u# N, o
    缺点:$ w( {8 S5 }: L$ @/ H% b
    保存格式仅四种,! P! B3 \+ P" J
    不方便用户之后读写操作。0 z7 J5 h2 J3 O7 z# f1 ?& i. e4 S

    : A/ ]6 E8 b% ~) ^9 P$ v9 f5 U( B:return file/ K0 I/ \: g; X; l
    ( l4 @' W( D& W. ]8 l+ N
    request.parse(, i! t5 W0 Z) C- }* ~
            url='https://www.douban.com/group/explore',, I' |# T4 I% h0 L, n: k8 Y
        Parsing = 'xpath',4 V( Y3 f4 w. r/ A
        label = {
    - v. Y9 N3 }7 `; l) E' i* A        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    + j, U1 \3 [- D; }" Y9 T        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    9 M9 D/ q- [2 j. O' w        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]0 Z+ C* Y% G# @- e' y! I$ {
            },; d8 ^9 O7 \$ d" L* X
        # 字符串格式,具体保存位置填写6 s/ E. O1 `& v; ^4 B
        write='result.pkl'4 P( s7 v) i7 S. V/ ?( m
    ).run()
    : u9 a6 I9 c% `1 E$ D& u# return file. s7 J) `0 k  s$ B' C  D& c

    5 {/ V2 s6 B; D/ ?' A第五种玩法:读取下一页 url 地址继续爬虫+ d7 \4 N5 S- a% m- F% i  U
    这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~
    ( H$ U. ~/ o2 r4 K, v+ {3 u# f
    0 \' ?1 S8 d! h/ b& O5 ~特点:
    ; K1 B6 E4 {' c( J7 X3 y继承之前的Parsing参数选择器选择方法。9 s" H7 Z7 X( D1 R: |0 u
    在这里可读取到解析后的下一页 url 网址。
    ( f3 R2 G( F* {0 N- E( J7 V, X# U方可继续进行爬虫处理。方便用户使用。& v3 y8 x) t3 s5 o  K4 R5 [1 Q
    3 \: Q3 O5 M6 u( l
    缺点:
    + a& Y# z9 G5 h" s* F. |/ g! k若爬虫时下一页 url 地址改变,便结束爬虫。: b3 r8 o2 G8 U0 K3 M
    只能爬取所给 url 地址中的信息。
    , Z4 Z3 J% o+ h4 M8 ]8 K无法进行某一界面的多个网页爬取返回。
    ) L- U. B& ]* w8 r- Y造成访问页面单一流失。
    # p4 V5 q# {0 [% m5 I  V8 X5 {
    % z1 J. |* h- B, O:return None6 D9 Q! C% o0 V1 C; ^3 h

    ' M2 f- x6 `3 a5 g3 V2 O/ j- Crequest.parse(, _7 x5 n. L+ R% [6 E. J6 N
            url='https://www.douban.com/group/explore',
    ' O+ B! C, h( q- A# y$ l. G    Parsing = 'xpath',
    5 s" v$ o" R* {0 |' O    label = {
    ! Y/ L' {2 k* {8 w7 S        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],7 F7 m# I* r' `, g8 h
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    , c$ V" O. j- K" \! l1 K: @9 q        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    8 V5 C% c# d) V, n% a        },
    3 e; w) E  b7 s# X    write='result.pkl',
    5 @8 k0 R% c2 G    # 字符串格式,根据Parsing方法继续请求下一页a中href, t, P6 ~$ u$ ~( c; G* t
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    0 e7 x. @' {, O/ c9 f) D9 i).run()
    . Y. O! V$ Y& p) E! B# return None ( R7 G* v6 f& E6 a2 l- y8 K3 e" V

    ! P; Z: k% S. B: ]/ M0 N第六种玩法:爬虫网页保存
    + b9 v7 N5 K$ m( p' J2 {听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!
    6 j" X: L* c" n# b; M: L, R8 k  z
    特点:8 ^, ~: y9 a' j' |
    持续输出断续笔记。
    " F) h$ D$ D6 Y) m. C将此次爬虫的 url 地址保存到一个文本文档内部。* D$ F& V# ^7 U
    下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。/ O1 `( X! U: N
    ' }7 @8 i6 o  V5 l: c* J
    缺点:3 N6 X4 i' o/ K2 \* P7 U9 v
    读取内容不单一。) b1 J! f0 Q# E8 r) \0 [* m
    导致下次爬虫无法正确读取上次爬虫留下的痕迹。# a( j: {1 \% }3 T! m/ `
    # P% f- ^6 z2 S/ w) F  w
    :return url_file+ t1 Q9 L3 ^7 g* E/ e
    0 |. d1 o% b) M" @: d- P
    request.parse(
    2 _$ E# N/ H* r( M0 G) z: j) k    url='https://www.douban.com/group/explore',
      |& k1 t. S3 l& [    type_url='text'," |2 M  p2 z9 w
        #login='taobao',
    0 P2 Y4 k( Z, h  N$ v  J7 e& C" ^    Parsing = 'xpath',; Z( u7 Z# e" K
        label = {
    ! N5 P* q) U* i2 i% @- y        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],2 d" e# ]+ G) u! N) V. {9 S
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],1 ~8 l6 h; o. S5 T' P, o8 y5 U
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]  z, j, F* t2 _8 ~2 F# S
            },
    9 Z# K$ |) k7 b8 R3 t- T# N0 D    write='result.pkl',% g" Q  b1 E1 j& f
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',# ^: o2 p1 U# B0 b% G+ q
        # 第一个参数为是否需要断续笔记。8 e# A8 `' h+ v- G" K
        # 第二个参数为断续笔记保存位置。
    3 k& K+ w! L3 Q    page=[True,'url_page.txt']% B  \1 x# z/ X) R$ W* K7 R- S
    ).run()
    / O7 o6 |! }' z" |; u% u4 v# return url_file, G+ d% g1 ?- ^  W7 t

    / c' J; _3 T$ G; ^) x0 }4 y2 u5 y6 B" N第七种玩法:简单数据清洗2 Z& g9 ~' P/ S( Z( ~' i3 m
    数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。1 ?9 {) o% ?5 k' k! Y" r8 v

    7 Y, f8 \9 b" T' b. b! ]特点:' _. a" b2 ^8 o
    本人曾写过一个底层数据清洗。
    1 ~- B4 y. o( q+ F: c" d能将列表格式数据进行归分清洗。
    $ a5 E' m3 m6 u/ I! j7 ?主要内容请参考另一篇文章
    : [# w/ x5 D6 k( [' f如下连接:数据清洗) w0 ~4 j- @2 b1 u$ l% |

    ' ]+ f, ~& \+ ~% j4 y3 {' @" v$ s4 T缺点:
    0 f$ g. I' w5 ?) S数据清洗格式简单。, W% J$ v9 g8 S- l- S) E
    数据清洗内容单一。3 ?0 d' C6 `# e& g4 F
    无法完全做到绝对清洗。* o$ @* J/ q  S: \2 L9 I
    有待改善。3 p: o# k& t- Z* W! k4 n
    6 t7 {9 e2 t, x3 q( t2 H8 D
    :return keyword_list, value_list
    / M/ K$ m+ C9 z! V
    7 r& Z* a5 ^( t# ]4 zrequest.parse(9 H4 B* [* V0 |/ l
        url='https://www.douban.com/group/explore',) ^  }; Y) I1 t
        Parsing = 'xpath',
    " D, p0 I# H2 |$ _( p' I    label = {
    4 L& l0 i: X6 t        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],! {! N" b6 f* T+ h2 j" g
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],$ M5 V4 _( y& H/ [0 o5 y2 x+ }
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    0 z% ^: ^6 S4 x        },7 L+ C# t8 w# z9 Q( K
        write='result.pkl',  l* ^& [$ c$ b
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',7 y6 X' |! F- z  e9 }
        page=[True,'url_page.txt'],
    & G6 a, i6 e  x" ^    # bool类型,默认不清洗
    8 R( r2 o: n8 [' ?" F    clean=True8 b* n& j& `5 P5 l" `: J; ]' t5 m
    ).run()/ z: q, y% z2 S2 v* A

    $ g/ y: D6 e& D1 R3 t& c* i第八种玩法:爬虫存入数据库
    8 |: b" C) F# Q9 C0 Y, r存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。/ A+ T- n- K  x8 R3 F2 @% ^+ H

    4 ^9 d3 x. V6 B; H" C6 H特点:
    & i! T! J/ V) E信息存入MySQL数据库。! E: D# W4 F7 A( |
    可连接docker远程数据库。+ K4 r  x9 L$ K6 `5 ]4 d
    数据库的库名可以不存在。
    3 p# V/ |8 l0 f' u  C数据库的表名可以不存在。
    - b8 x& x* b. i+ _根据之前传入字典键与值参数判断表类型。: J4 ?/ N* t1 k9 q+ y
    自由建立数据表传入信息。
    $ R; ~# j  U; I6 m1 h8 I/ w# C; x# K6 T: Q+ j3 U5 V
    缺点:
    - D! n* b  D$ M0 @' Y- ?仅支持MySQL数据库。# E1 @8 I" a; W7 e4 m

    % \& D8 b4 k8 q" U3 p3 F7 ]:return SQL
    ) r4 n5 h8 s5 [' m) G/ ~
    ! \4 h9 x) m& o& l' _" Y5 j8 _3 h3 \request.parse(
    & Y; O1 u, _! Y) |    url='https://www.douban.com/group/explore',
      \3 ~& P  R) m# X; W9 j    Parsing = 'xpath',5 N* ^' @4 Q& R/ B+ k7 j7 I" W2 L
        label = {
    ; s; B1 {0 I  m! ^9 O5 K5 T; @/ n9 D        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    , D; [& r0 t9 f/ |        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],2 z, @( d, z3 c& o" f
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]; H- E, g8 w8 ]
            },$ ]3 Z8 N2 T6 U
        write='result.pkl',
    " P5 [7 k6 [8 S' E5 d# |( ^    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',( e  j  K' G9 |3 O7 n
        page=[True,'url_page.txt'],' I% ^9 u5 L) E  D9 k/ z/ X5 m
        clean=True,
    1 m. z! C* x3 F3 r/ @: s    # 字典格式,, {5 P* v4 P" e! G0 W4 b. B
        # host可有可无,默认localhost1 h+ u/ f4 h5 R, B
        # post可有可无,默认3306# L( w9 X8 r1 l. v3 g! k& B: @1 i
        # user可有可无,默认root
    7 D- [1 u9 F- @+ D# l9 `    # password必要参数,数据库连接密码1 n6 \4 c; M* t4 `, s. n
        # db必要参数,数据库即将存入的库名0 Y* g4 u7 [- K: d% U
        # table必要参数,数据库即将存入的表名
    2 l$ `7 Q0 ?' ^3 g# z  e    write_SQL={
    & X# {  {# _5 I- G' s        'host':'localhost',# V. u8 e6 F2 v; Q2 m/ W
            'post':'3306',7 u" l& }: v' U6 T0 L
            'user':'root',1 i2 C% R! E4 q' L4 y9 [
            'password':'123456',
    7 N0 B; W! J( A/ }; U" [        'db':'example',, f' X3 H, e- R- r3 ]7 w& z1 A
            'table':'example'2 E3 I8 N" T! V% K
            }
    9 Y" Y4 Q$ @  }7 x; ]4 ]" V    ).run(); t0 f& h1 r# Q5 Y4 f. z
    / X( h1 _' g# X$ O
    第九种玩法:重新启动爬虫5 m. z7 g8 t, Y1 X4 Q  m
    爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。
    - A3 B7 t5 X/ S4 d3 K1 p; e6 j8 @+ ?. ?. q3 X
    特点:
    2 z7 t& x! v3 ^  j检测报错重新启动爬虫% c4 I8 o* H" X( M$ N
    无需手动处理错误信息
    # w- h: g) F/ J/ s; \7 g2 G/ `) J, D( L; X- E0 S( I! ?# A
    缺点:  |/ n3 O- G; x, i' H
    无法收集子线程错误。  A  T' S" z  f8 ?( U% K
    & D. T% T# I3 O
    :return None) p9 q) q7 p; C4 {. A/ V8 W% o8 }+ A
    ) l3 S- k/ d6 f9 z7 L
    request.parse(
    $ j2 B' O  Q( ]- }0 W3 k5 ?        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    , [, s  k# m' {6 `# \        #login="taobao",9 Y5 t* C& A) O' n) {) V6 J9 f
            type_url = "text",$ R$ A5 I& O% a
            Parsing = 'xpath',
    7 T* |9 O* V7 m  t4 s. ^        label = {* T8 t) ]/ ]' d, n  b
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],2 x1 g0 Z+ K( M2 n# r  |" \/ v  ~! ~
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    4 m# ?/ }+ F& Q2 Q6 T            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]4 x8 g# J9 n% U  h9 U
                },
    ) D8 @/ [* M' Y, H$ T  ^: J        write='result.txt',
    9 R: V7 l& B8 ^& E% R) @        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    3 l- `, Z% _6 Z3 G        page=[True,"now_url.txt"],
    2 s, `# Z& `6 R% K        # texting 参数为是否启用连续爬虫0 ~' T  J* ]# a
            # 爬虫程序异常报错后重新启动爬虫
    3 b$ g7 ~- W0 o- f4 P' U        texting=True,
    / y$ S+ [6 d, U- K: i- {1 w        ###
    3 U8 A  ^7 I1 J        write_SQL={0 _8 O7 H4 h3 @2 D4 V# k% s9 j. S6 n
                'host':'localhost',
    * |3 s0 q* \! A- N. i$ t            'post':'3306',
    * w5 r, W9 ?+ J, l- A, a            'user':'root',
    ! G) A$ {+ i$ d            'password':'123456',
    % I' a. x; e/ m$ k0 r* C2 T3 i7 |            'db':'example',
    & K0 y2 ?7 w7 O( ^: h7 l- I            'table':'example'; Y, @, B; e8 ^. q- }
                }
    + R2 u3 N9 _! l8 |/ q& q  Q" u' t/ k6 B& ^$ T).run()5 n* [3 a  t3 ^

    # P& @3 T9 t! |第十种玩法:多线程爬虫
    + b; d# m+ E0 T2 I特点:' C  H2 I# Q3 P) T. x9 y! j* T
    爬虫速度加快,
    2 n' C3 m) s4 g2 w/ [更好的利用了线程。
      G* _0 Z- V' q5 q
    7 G3 k' I% [  O2 v缺点:暂无! c4 Y7 v2 W4 ^# x; ?+ d

    2 B' b4 C9 n  A$ A' k:return None2 G2 V9 A' k6 {/ o* J
    # B0 H: e$ \. p- O* Z4 j3 O/ G% j. b
    request.parse(
    * @( A3 I$ |8 B9 [4 f% U! ?        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],) j# J/ I2 n+ q4 U
            #login="taobao",
    " v+ L2 i( `+ Z, J, l# X6 Q        type_url = "text",
    + ?! p: q1 |6 q! k% G/ }  H2 d        Parsing = 'xpath',$ b, ^5 y* H; N5 z! V9 A4 T
            label = {
    + q; t: t; ]3 K( o" u4 w$ _            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    7 Y9 v8 I/ Z7 E0 C, B3 [% w9 x  g: A            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    9 T3 |8 D# G' U0 G            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]3 x7 u7 ^0 e8 T
                },& j9 w0 }- p2 F
            write='result.txt',1 h; H( R" B/ P/ ^0 r1 g: u
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',# e( _4 c' {: D6 W
            page=[True,"now_url.txt"],8 A; D' m$ F/ ]% X* N4 I1 C4 \
            #clean=True,
    / W, r1 N: \* I' ?% o) ~6 L4 y8 x, d- G        texting=True,8 K: a! I, _7 W8 N& F
            # status="threads" 启用多线程爬虫* k5 ?% W& y, ?  q: _
            # Thread_num 为线程数目,默认为1 单线程
    1 D& u5 I8 A* ~. F3 p% i- R        status="threads",% n" T. h+ L1 {3 @; a& S, }
            Thread_num=3,- N4 `1 O  o- D' h% W* {3 X
            ###, k9 l, _; a$ O: J5 G9 S: V
            write_SQL={
    " h" ]$ m8 B. T- I            'host':'localhost',8 r. ~) ~5 V$ a" \, h& ]2 D
                'post':'3306',; A6 U6 z+ n6 `( K0 Q
                'user':'root',; C( ~. _6 l- E( n0 ^& }/ X; a
                'password':'123456',
    7 F1 N+ ]# f& r5 C. j* {$ Y! E            'db':'example',
    2 k. i3 X- r7 H1 {1 n) B            'table':'example'
    5 |% S+ W6 {& T! F! f5 e! Z. E- O            }  `8 S# u# Q& y2 t9 F) E
    ).run()
    1 F& O. V( Q; v' l2 w
    ! t, H) z7 E' n) c第十一种玩法:多进程爬虫/ ]1 d" v# i; Q# }4 h! {
    特点:5 m/ F2 F, a0 U3 X/ k: Y
    爬虫速度加快,. Q' `% _% {/ B1 K& |: r! k- \; o* ~
    更好的利用了进程。' p6 N5 K$ ^0 q- X" l7 k( u/ D- \

    ( l/ B! O+ H5 L% r; T, q1 ]缺点:暂无; N' G* `# K4 ]7 e8 l7 p

    1 w9 r1 e1 G# }7 a( N5 y" H2 O4 C:return None
    : g+ Q& ]5 a% o; M9 E4 ^, S
    % ?. K2 g# S$ [# C) Kfrom simple_crawl import request
    % v7 [) v7 V* h5 P) O2 ~request.parse(
    # |0 F/ m! h# E7 l/ a/ Y        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],$ Z7 J  i* m4 Z! X) I
            #login="taobao",$ Q% ]' q" C" g, W% ]
            type_url = "text",
      R! a5 l+ X  y7 j( P        Parsing = 'xpath',' H: ^1 a5 V& P0 _
            label = {
    1 u7 U5 }( w3 G: r# I( e            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],7 L+ ]. q% q: i# w
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    ; e' S8 I2 z$ o5 \- b  T            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]0 h+ b" v: E/ H4 P
                },
    1 e8 c- ]2 {- V        write='result.txt',
    9 M) }# N) O# B$ E0 h2 e        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    5 O7 a/ ?$ r) [! |- d        page=[True,"now_url.txt"],
    " ~$ b! l0 r* T$ _6 r! v: _; X        #clean=True,, t7 e- w( g6 k
            texting=True,, d1 c* ^! u4 W+ g( r
            # status="multiprocessing" 启用多进程爬虫7 x- U8 h& p+ h, }; E) {# c
            # cpu_count 为启动代码核心数,默认为系统核数一半
    7 ]) D  ]& e5 X# `3 u, o3 j        status="multiprocessing",' Y2 [0 E# Q) E
            cpu_count=2,) B3 {- s. N& ?: g" N+ F
            ###
    , T8 k* K: M0 x3 \% c9 s9 B# r        write_SQL={
    * T- g* Q8 G3 Y' Z: C) @            'host':'localhost'," B- h, ]8 Z# ]. {3 i0 ?
                'post':'3306',
    * ~7 A; x7 S' ?            'user':'root',1 z! s) Q% K( t, E& U' P# N
                'password':'123456',6 L- h& c6 ]& o3 g4 N
                'db':'example',* T: T" }3 k) g2 T; }2 ]
                'table':'example'
    5 i# a6 g, _! R1 p( c1 y) N            }
    - p6 o3 k/ W3 @& U4 s, M6 R).run()
    0 T6 i3 ?- y. v% O1 N3 T+ U+ c: Z
    + [# \$ a7 Q, P  A% F9 L. G第十二种玩法:异步多线程爬虫" W" E# T: u, n: _
    特点:
    - U( |) T2 q  ~3 C' H+ M- O' G爬虫速度加快,% L$ D3 ?& F( g) n! b
    异步使得爬虫无等待时间,8 r' t1 s0 \) p, q2 ~
    同时使用多线程速度明显加快。* E- N6 x3 [, q- T0 C
    ! z6 P  N9 i. P& ?) }# _) w" c
    缺点:暂无
    % w3 D: X4 T( i/ |5 s" N
    ; ^8 k& b8 z& p:return None* {2 [+ c) a* |2 ~# y  d4 b4 a" q  V
    6 f  N+ W( Y( D$ v1 b4 t
    from simple_crawl import request
    / f# W$ W( S" Arequest.parse(. N% g  t- M; T1 I& c3 H
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],& P; Q- B" B) o+ h5 Y
            #login="taobao",( s& C0 ]/ }. Q7 g
            type_url = "text",+ ^- }' A* C5 `; l* @, B" U! u
            Parsing = 'xpath',
    & \& d1 R8 P8 t! o3 v        label = {
    3 {; P' q2 q9 h* A2 p            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],9 N1 v& d4 p; A* v' H6 e
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],/ f8 C' d* k0 P4 q5 ^8 u. B* P
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    : r/ ~+ D( ^% G# `            },% T! P3 o- U; K) h1 L
            write='result.txt',* l4 h2 Z6 {& E$ S
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',9 M& B/ q" ~# [( k) {
            page=[True,"now_url.txt"],
    ) o! Y/ R, m* M        #clean=True,
    . N6 I: U/ W1 Z" W8 V        texting=True,: M8 b' ?& G6 D8 s  @+ G8 {
            # sem 参数为异步引擎数目,默认为5" X; B( J- a; b5 R( |- c( e
            # 其他参数同上
    ) ^* l9 |# R7 c! @- x( {. E        status="aiohttp"," F" h& R; t5 {. v( \" U
            Thread_num=3,
    : K$ g: I. m8 |$ @        sem=5,
    ; e) P0 |2 e2 w6 h* m2 b        ###9 h/ I& K  ?7 h! r6 F
            write_SQL={1 R" p% [% _- W  w# P# `
                'host':'localhost',
    4 L2 `4 _9 h8 p+ I# W6 L2 U- a            'post':'3306',# B% |' m  s% J1 q
                'user':'root',5 u% R- l$ O! _3 y( f1 q: n. _
                'password':'123456',
    " \+ h! {3 F7 {1 g* c# T            'db':'example',
    ) z9 c0 f; ~. C- I' t% j& ^            'table':'example'( N9 R$ F3 d8 o1 f
                }
    & k) r! y: Y0 a! Q  [& [).run()
    ' [' u  E3 y+ v) }2 h- y" ^0 i* ~7 F4 s0 Y
    第十三种玩法:异步多进程爬虫
    0 l8 _) J  {8 t, g1 t. Z特点:
    ( F: a$ `& Y8 l爬虫速度加快,
    2 J* p2 W3 \& v8 n  O# n异步使得爬虫无等待时间,$ F" A; I$ {7 a* W: G8 H; G
    同时使用多进程速度明显加快。
    9 F% r2 J4 ]0 `1 G8 D# `5 j) [1 o4 K! t
    缺点:暂无
    9 m( t; h$ X/ @- e: e; ~: \( n# I8 i6 p' `
    :return None
    , Z. d& C4 x9 u3 J2 p: Z* G" H* x3 G* q; ?9 h& L
    from simple_crawl import request
    ' i& L4 |$ E4 t- {4 wrequest.parse(
    " v4 `: s7 X2 V) C" B  z! x4 B        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],3 ^0 I) m) K* _2 _7 R" y8 \
            #login="taobao",
    # Q# Y4 J5 }' {/ |& _        type_url = "text",
    * X) r( H+ o$ U        Parsing = 'xpath',7 I: T0 D1 v! `- T  a+ n
            label = {
    ' N& C$ ~) J, t0 F, M/ W' T( A            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],/ e% t3 K: q' i5 o. U* V: g
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],1 S: u7 S& A. Y3 r! Q! w
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    % T& T0 h, }4 d6 G6 Y            },
    & `' m6 I7 B! m% x        write='result.txt',
    ) @! C4 s: x- I7 s0 E$ M! P8 V: u: S        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    9 C. S5 C; l$ p/ S6 n# ?1 _7 c        page=[True,"now_url.txt"],
    . z( e/ V' A0 R7 _( A5 M        #clean=True,
    # `, t$ v4 A# P% b        texting=True,
    , u  _0 p! U- H- j7 b) c. ~, B* p        # 参数如上
    $ k, w& w0 v. j3 m5 S        status="between",
    $ T9 @6 B, I0 ]3 o- Y( @        cpu_count=1,/ D( {: y$ }& y6 i( C2 n
            sem=5,
    ( K) y! \( v. ?  K0 x5 @0 J9 D: X1 r        ###% D) ]/ P- b" g+ r8 ]! B
            write_SQL={% _( N# s; i$ J: Q
                'host':'localhost',
    4 ]- L6 d: H2 i$ x5 l  i            'post':'3306',
    / T" k- Q. \% l/ r( a9 u            'user':'root',
    # R( G+ P& U" o! L2 f            'password':'123456',
    & ?% C" t3 ~6 T* o  L4 ^            'db':'example',
    5 l1 u  n  [/ h& q$ b            'table':'example'
    8 K" K! V% A) Q0 G8 T, c% ~            }+ N9 b: _9 I, j) }6 _# f6 C2 k
    ).run()& \( ?# R; I6 ]
    , P( O' ?; [" P
      d  i6 I% P" R) i( o) F, O
    功能介绍完毕🤞
    * A: |4 A' a9 S3 u6 L1 i8 a最后还是希望你们能给我点一波小小的关注。  J1 K3 Y: C6 I! c  t
    奉上自己诚挚的爱心💖
    4 e4 ^- W( P, m( J8 q————————————————
      W; S- `8 V( O( y7 l3 v版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
      y0 G9 ]" v+ G0 O2 _; m8 S2 ?原文链接:https://blog.csdn.net/qq_45414559/article/details/106005684  ^+ @" }3 o$ Y7 J& P1 B

    0 D) E- N: n4 G& ~9 I& D& D
    5 b8 a: s+ r* t3 P/ V
    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-8-8 02:42 , Processed in 0.463569 second(s), 56 queries .

    回顶部