QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5624|回复: 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_crawl0 R( O  i# I# l$ c7 q; J
    simple_crawl
    9 P& `2 Z! U$ u' Z+ f仅需一行代码即可达到爬虫效果
    " X! O0 a6 f4 C( I项目地址(欢迎star):https://github.com/Amiee-well/crawl+ C/ c5 b; j6 U; h6 j. N3 e/ I
    使用方法* o: [; p& F5 Q6 s3 M/ x" @1 |
    pip install simple_crawl
    & `9 F; d8 e6 [, w7 @5 T3 h$ H3 C% U8 K. Z
    + P% ~3 N  q" t. x### 以下源代码为简单介绍,详细功能介绍再源代码之下  R" G# K. a8 W" s1 S' j) F
    from simple_crawl import request
    ; c/ c+ a4 W- v9 d, t6 xrequest.parse(3 A7 |; `* o/ y; C
            # status 参数为运行状态,支持单线程多线程多进程协程以及联合
    0 p' {+ z! I+ E5 ^$ x1 _        status="aiohttp",
    6 Z7 K# Z5 b2 P% _' G        # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式/ H- ^6 a- m: N
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    . U+ D, E& l5 A6 K1 }        # login 参数为获取登陆信息,如淘宝等网址需要登陆信息
    ' r% R7 z, R: A7 f8 F" q    #login="taobao",9 d6 L0 X" m* \: l
        # type_url 参数为返回源代码格式,支持text和json,默认返回text2 l0 ~$ T7 l: N1 s, [3 v
        type_url = "text"," P7 _0 B) _) G8 }& ^
        # Parsing 参数为解析方法,支持re、xpath和beautifulsoup3 s8 ?! q4 v' i+ M6 j; G2 |
        Parsing = 'xpath',% L3 ^; ]4 `: t9 {
        # label 参数为爬虫解析过程,字典格式,详情见下方
    " n) k8 h2 j6 d! m- E    label = {3 @" D# ~) B4 \
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],- }: i+ k, i9 E
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],- `) e! u* Y5 g
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    ( \& a& Q6 l" L2 H     },) L7 e0 Q, R3 r1 x! |
         # write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱
    9 e& J% _/ l) B! z7 r5 B# x- M+ K     write='result.txt',& Q, b% B2 E2 `6 @) S
         # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫0 H" R; ]. [6 h$ E0 a2 u% z) r# G
         next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',$ E4 X! Q: m" w# o! d9 d8 v- }) k
         # page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫
    ) x: W" q$ \/ o$ t9 [1 i$ K     page=[True,"now_url.txt"],
    0 o3 e# R/ C4 d1 x4 i; S% O     # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息2 g  U$ X9 ?  z* C' Y, z
         #clean=True,
    ; c! B9 K) C( t& T     # texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序" K/ B4 W2 N% h5 a# \
         texting=True,, w8 t5 @% P" F& `% n
         # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态
    ! t! x& \# d; \     Thread_num=3,5 r5 H( @( w8 D0 S' i% w
         # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态' a  y. K3 `# M4 h' @, `9 A
         cpu_count=1,5 @/ m" r- t' t2 J& ]
         # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态' v0 C; u2 l3 ^- e# b
         sem=5,
    2 {# \9 i' \0 c1 Z6 H2 C3 Y     # write_SQL 为是否写入数据库,默认否
    0 G- g- [- `7 X/ r" C4 L, s     # host 参数默认localhost
    - g0 N4 ~& b9 ^; x3 k     # post 参数默认3306
    " z% Y8 i1 M3 t, t9 g) m% N     # user 参数默认root
    0 F9 R$ i2 d! d     # password 参数必填,必须正确) Z$ t; N4 P$ \$ S4 [3 W+ s
         # db 参数为即将存入的数据库名,若不存在自动创建( f2 W- V& ?  W# l* d" m
         # table 参数为即将存入的数据表名,若不存在自动创建
    + \, h! K3 F- s+ f     write_SQL={  K0 H* e9 g' ]+ `! ^8 i4 ?; L
             'host':'localhost',) V/ [' l: l% n0 R3 B
             'post':'3306',
      N( U9 F" B: i/ Q         'user':'root',7 V* T6 r, O0 S
             'password':'123456',
    - P4 @# Z' V6 |/ F         'db':'example',$ r+ N; g% A: B* w- @
             'table':'example'+ |  B5 N, [- y: U$ B3 X
          }
    1 ~7 b9 `& D1 n) Q; o% V/ A9 r).run()
    ( \( U1 w9 g/ }$ ?- W
    6 w# @; b# ?3 a3 r' b2 w介绍一下crawl参数设置:
    / m# w" p. W- S! C( t! D3 N- `. m9 H
    '''
    / Y3 \7 S' X2 l单行代码爬虫程序执行
    0 ?: B; \; Y2 n. n:param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档9 G+ a2 y* Y( k) F  ?4 g3 ?. P
    :param url:即将请求的url地址,仅支持get请求3 A3 v5 @9 m( I3 y3 V( L! R# m+ |8 ^5 j' l
    :param type_url:请求url后返回格式,支持text和json格式返回
      L1 k# D8 G. Y5 }8 V) K0 {: O2 G:param Thread_num:即将启动多线程个数,默认为1单线程
    , H1 _9 H9 P/ E5 y& r& i; L:param sem:协程信号量,控制协程数,防止爬的过快,默认为5
    " e) P4 R4 I: `0 k  r0 \:param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半
    " z* s+ x* @1 [:param login:模拟网站登陆,保存登陆信息% Z4 T/ z3 O4 g$ z5 }, U4 K- \7 q8 P
    :param Parsing:爬虫方式,支持re、xpath以及bs4方法6 Y% {( G$ S( ]- {% }. \
    :param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,& G! B# O5 O* i: H1 K$ v
                           多次报错结束程序,默认否2 ?' F, ]. C4 t2 z, n* B) t1 C7 u
    :param label:选择器内容,字典格式保存,
    4 w4 D# Q" c  s- Y- `9 c, n                     字典值为列表格式,第一个参数为选择器,第二个参数为转换类型
    . O- C- p$ F! m! k% g                     第一个参数必填,第二个参数默认str类型* d& p0 S/ Z2 _" m$ T
    :param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否
    * j* |' b7 f9 {:param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫+ I  D! c( n% ?& g, }
    :param page:是否选择断续笔记接手下次爬虫处理,默认否$ K  u. f" u+ c, z1 u
    :param clean:是否进行简单类型数据清洗,默认否3 E. E% J- |& L% J1 I* {0 J
    :param write_sql:是否写入数据库,默认否+ v) p% k, f. D2 Z& n* t2 V' Q, J5 C
                             'host'默认为'localhost','post'默认'3306','user'默认'root',
    , B' V& |& c- O9 B                         'password':'密码','db':'数据库','table':'数据表',
    7 k2 h' Y- F" t+ r/ _                         检测库是否存在,若不存在则创建,若存在则直接插入,
    * b& `) W- v2 \& a# ], M1 J                         检测表是否存在,若不存在则创建,若存在则直接插入
    : ^+ v" [. [- M% d8 z) d1 ~+ q( H:return True: Y3 ]. d, ?, G/ q3 a+ V% R( _$ A
    '''/ i6 [5 n* i# `! F" ?
    介绍玩法; D, o5 d! v9 K# K1 d6 b' U0 z
    接下来介绍的均为调用第三方库的情况下运行:
    # v9 |9 ~, h& D7 d8 S' e
    1 F0 F: K# \) j7 x$ xfrom simple_crawl import request
    ; }) k2 N0 |0 y: J, q; g. j第一种玩法:输出源代码
    * d, J' x2 q& s9 y" z+ H调用requests库进行源代码请求。, ^/ c) p1 O, O. e- k* t! B

    $ o0 N+ B& @7 t" Q3 a特点:
    % M* {0 u8 f' {1 e. x' g请求失败则调用ip池处理重新请求访问," t" i- {: i7 ]! e. h. _. P- Y
    出现五次失败默认网址输入错误。
    1 f. P/ }; k8 j1 N7 }5 `支持text以及json字符串返回。默认text。' v# N+ F- H$ G9 j
    0 V3 }4 `3 V1 |
    缺点:! B7 I) n2 u5 i* C: i2 s2 w, R& {" l
    暂时只能进行get请求,不支持post访问4 X' U4 ]% M2 I/ q8 @* b& u
    " E* z! {/ t4 J% @: m/ n
    :return text or json
    * w- Y# @4 }$ p; C4 E4 y3 D) ~0 q, X5 |. M3 F! R' |; i
    request.parse(8 L% d% F  X5 K0 p( J4 c/ y
            url = "https://www.douban.com/group/explore",
    % s9 _% z. T# D6 B" _        type_url = "text"
    : h$ f+ h5 F9 N# G4 Y- I/ M: k' d).run()% f* {, Y# T1 v: ?6 A& u  d
    # return text/ L& ~6 W7 N! }) Q# b! g7 j. Y/ P
    8 `+ i& F" A' i% [6 C7 d' d9 R
    第二种玩法:模拟网站登陆并保存信息( j/ {0 K, P0 @. O+ x
    调用DecryptLogin库请求登陆访问。
      }# Y: X/ u' ?' E; L2 U# Z8 z
    8 e2 D+ d5 |5 m( {0 l% jps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源7 J5 f+ O3 w6 K8 D
    在此放出文档地址
    $ Z( Z9 B: ~: E# G# A) I# WDecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/
    % L' g& k/ S% J7 V3 }* ^6 @
    - u( I9 ?/ U7 a0 R特点:
    & j8 n+ {' a2 I8 H8 x% x将DecryptLogin库中二维码继承到此库(非二次开发)/ l6 s# h+ D/ g
    支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆), e: s9 _$ H- p; X# f: @  v& ?
    保存session.pkl信息到本地方便下次登陆运行
    - \& M3 v* T) E% o0 L9 R2 x; w* j' p4 B3 C
    缺点:5 G% b% {! ~/ ^
    session.pkl登陆信息过时无法自动删除。
    5 H' I. A- N, n8 S* T导致下次登陆疑似cookie无法正常登陆。
    1 |! w- [# P( W8 a# ^* h7 l2 _6 f4 P9 z
    :return session
    + h& L! e0 d) l9 S: F
    . n  B! H, m- Zrequest.parse(
    + h4 Y& w4 B! o5 d/ q9 o( c7 ~7 F        # 臭不要脸的推广一下我的店铺8 p( v+ Y+ p. F8 t1 o
            url="https://shop574805287.taobao.com/",
    " j- j9 Q& H5 q$ @        login="taobao"
    4 A, h& |4 [2 z; R7 o/ f).run()- m5 h, l/ I& C$ ]( |) S+ B: n. g2 V  J
    # return text1 V/ t' F$ Q/ E) Z9 G+ T* s
    2 Z8 Z. A  g, t/ C8 h2 O
    第三种玩法:爬取网站信息
    ( ^6 M3 e* t/ u3 [' k7 r  ^: u# R: o爬虫库自然少不了爬虫的过程0 `1 J8 _; ^8 t. w$ V! X; G3 L' r4 r. N, {
    , A% {. n3 P9 v. z5 w7 e
    特点:
    8 [  [' N$ b0 j1 l( x$ _支持re库,xpath解析以及bs4选择器。
    . s3 }, F, y  M. u# H" p/ }爬取方法为字典格式。单方面输出。
    : b! J' t6 C' A  k% ?* Q" L/ q$ |字典键为保存的字段名称。
    $ x7 ~) k( k' }* X; q  j) P  B字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。
    ( H, F6 z! @' l3 n* }
    0 r! ]0 m- E; g# X6 F4 y8 c9 \  E, m, y' v1 S缺点:暂无(等待小伙伴们发现)
    7 V3 e$ w- H6 h; L0 K+ ]1 @! o# d" m( d4 D) B# i8 N2 k
    :return reptile_results6 `, R& `! l. l: P. w# t

    / q( K" ]. ]& F/ ~/ {request.parse($ @8 t) k; N" Q/ F, g- ]
            url='https://www.douban.com/group/explore',) `5 N: k; `$ f. J1 n
            # 字符串格式,选择器方法。
    ! N& d8 K' X! Y6 E# F( B% Q    Parsing = 'xpath',
    - _7 V$ K! T* u) Y* F. o& T    # 字典格式,参数如上。, s6 Q5 w% D% A! C% \  ~/ u
        label = {
    # M/ B4 |, k( K( w2 e) n7 T        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
      H1 y3 s' ~3 H; d        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],) C( x; _4 R$ d- f. j0 N  ~2 n
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    8 i+ C6 N& n  X9 b        }- {9 z# H8 y* |$ O
    ).run()3 p5 Q- h! b# N/ @/ z- ~
    # return reptile_results(list)
    5 @; B1 `* ?6 b; b5 \9 T/ P2 [9 p. a6 e  v' \# v- G4 d
    第四种玩法:自由保存信息
    ; q' \+ W' Z, ?0 L0 Q& k目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。( u. Q# P. w; K# J; P9 c4 I
    1 ]3 }6 y7 o( t, q8 |4 J
    特点:, N2 b/ l& ?3 o' e) `4 R8 H. `  m
    写入文件均为数据格式传入文件。2 \" E0 F+ R' Z2 [; \% y
    且输入格式规范方便阅读and省事。/ W7 \0 a+ {: y

    % Z. N8 n) ^0 }+ i缺点:4 Q, t( U7 _8 j3 ]7 g! Q
    保存格式仅四种,- [; g4 u4 b: w  }7 d0 w8 o
    不方便用户之后读写操作。
    ; y' g9 x. {+ D2 i: J9 P
    - Y8 w. V. h4 \1 W:return file* k& g0 l5 @& Z, G: U" Z& |

    6 r( u; _) }5 k2 a& B0 Q$ n! Mrequest.parse(
    ! Z$ D( j, ?5 L. \  E        url='https://www.douban.com/group/explore',3 t: E4 O! r/ M' C, y' p4 v9 `
        Parsing = 'xpath',5 S/ b4 w! K" e* y1 ]! n0 k! {
        label = {. b3 L" D0 T  c/ T4 o* b
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],1 |8 s$ M$ t1 {7 j" Q) r
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    , Y# K2 G' ~; O; l' x$ o4 J& X        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str], |+ z* D& d6 R
            },
    ; O; A( {" r. p0 T) d+ l# f/ M& B    # 字符串格式,具体保存位置填写
    % Y+ F  r# m4 v" E$ F- x8 q3 L* M    write='result.pkl'
    9 v: j/ i8 Q- n/ n0 d- P).run()
    / D( y3 f# t4 Q# return file
    0 E/ `; V0 u, t3 F8 ~6 ?* l( Q, n) D  Q
    第五种玩法:读取下一页 url 地址继续爬虫3 P2 U9 t5 ]+ D& F8 |& m  h, z  N
    这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~2 P& o& J$ S6 x0 u, k0 a

    - ?% L; Y4 k: b/ c特点:5 e* k+ f; P0 F! ?; v" O/ L. P% o4 `
    继承之前的Parsing参数选择器选择方法。) g# _  [( }" j8 L; l7 h* z
    在这里可读取到解析后的下一页 url 网址。
    " Z3 c  ~4 i$ O& o方可继续进行爬虫处理。方便用户使用。
    , }5 F# D2 L6 X) d( b9 S5 w5 y' O9 `2 V9 j$ b4 W
    缺点:' Q3 B3 f$ q: b
    若爬虫时下一页 url 地址改变,便结束爬虫。' e. t9 k* [: x8 W8 W
    只能爬取所给 url 地址中的信息。
    ) y: r& v+ u7 }" p( V无法进行某一界面的多个网页爬取返回。
    & W/ q" b/ ~3 s5 l造成访问页面单一流失。. ~; Q  y' j3 v% s0 K; D
    9 @5 L% ^, c3 V
    :return None" p) }2 A& |& ?0 L# P) u, }
    9 ^, H: Z; B- o3 T2 z
    request.parse(
    * q! L. T! D1 H2 k  V" N. w        url='https://www.douban.com/group/explore',
    ( i5 H5 }. a( b, V( B+ f    Parsing = 'xpath',
    ) m1 B9 o) d% G% ~    label = {* W8 |4 r4 I/ |+ G" c) Z4 f
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    , R1 y- |0 q- B, l0 s        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],9 N$ ?, s9 b- U! i; z
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    ) O; ?2 u( e$ ^( l        },( w- f  O$ K! X0 i" T4 f
        write='result.pkl',1 ^# `& O! ~$ G" M( @; `' Y2 b
        # 字符串格式,根据Parsing方法继续请求下一页a中href
    5 t/ G2 r2 k2 `    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    . @" o' r; G( x# H& t).run()
    ; f- I: b; f) W0 r( ~! a) g& n  W# return None
    $ ^; Y1 @. K; [( x1 X" }2 N- w. N7 _3 p. m; a: n* }4 P, {
    第六种玩法:爬虫网页保存
    5 c: B+ t1 P4 x  O6 s0 [% \) e听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!- \; U5 K7 j+ g, V; X& I9 w
    5 Y+ |4 E5 p+ k7 E  o
    特点:. c& W" E1 D1 V5 \- G/ l! ~
    持续输出断续笔记。
    3 b( u2 V2 z+ [: b, j将此次爬虫的 url 地址保存到一个文本文档内部。
      \7 X1 s+ T8 D2 [" C下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。
    ! p3 M9 ~  N1 G% t
    ' j5 }! d4 F1 j) r5 w缺点:8 v/ ^" a: W- O" K
    读取内容不单一。5 h1 X) B. B1 Q5 ~
    导致下次爬虫无法正确读取上次爬虫留下的痕迹。
    " g& L% o3 k( A0 F9 m, f, v* _; n. p+ P2 |& r
    :return url_file2 g* A9 ^/ u3 c5 ?! y8 b
    ( y: `4 L* a- {) c
    request.parse(2 Z, ^# d) f* i5 S- Y
        url='https://www.douban.com/group/explore',
    , `2 h3 X9 j* ]- J    type_url='text',6 P3 w, u2 N( X" l- O: W1 G& p4 W
        #login='taobao',4 D( i* l0 _% D  S2 Z$ F  [
        Parsing = 'xpath',3 v% q: n' F% E4 J' n; n- p* u, K
        label = {2 J; b9 A+ S& e
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],9 f& Y1 |. @$ c; w3 S
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],& \) h) Q% b- A; e/ _2 d
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    3 ]4 P0 w& z3 q/ A# I        },
    ) B) \* z" ]8 a. n    write='result.pkl',
    , [! U& F( e+ W$ u    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',* @8 _3 p+ d& d  N
        # 第一个参数为是否需要断续笔记。
    & i/ y3 H8 P" G/ M( d1 R" P' u. C) c    # 第二个参数为断续笔记保存位置。" x; t" F0 N4 a
        page=[True,'url_page.txt']* I% V: p% u( ]9 O% [
    ).run()5 E% ^/ Q% y, \
    # return url_file
    ; ~2 k  c0 h$ r: y6 t6 ^
    0 x4 X4 P+ G1 \7 n% p4 m第七种玩法:简单数据清洗
    ; n) L; L' X9 t7 O8 |5 \5 u2 R2 K数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。3 }; B! v4 ], i0 I* ~* `
    * Z) m# m; U4 Y$ B2 o! O7 D# ?2 X
    特点:# O2 [' y4 M7 ^% c1 k9 W
    本人曾写过一个底层数据清洗。3 Z6 w. B% f* p. f
    能将列表格式数据进行归分清洗。$ u: x& s, a: w: ~$ s
    主要内容请参考另一篇文章
    9 X: r) x3 X4 ^. L+ ^如下连接:数据清洗
      G8 B+ |8 J3 A7 n# J% y* _) q( L* X3 r& j" K/ P
    缺点:' d( t9 q0 u7 D( C! |
    数据清洗格式简单。
    % `+ ^9 ], ?7 L8 _( o% x数据清洗内容单一。/ J' K- J0 \0 V
    无法完全做到绝对清洗。  c0 z8 G2 e8 j2 K6 U  @% c! k
    有待改善。
    4 b  m8 i% B- l- M
    0 a6 e9 f' {" q9 B2 y:return keyword_list, value_list
    ( x: d1 d  J2 G8 a2 A0 O" g
    # y% \" n4 d8 yrequest.parse(
    " g( \; {" h- }$ T% o' P    url='https://www.douban.com/group/explore',# y( t6 y" d$ c4 d9 j
        Parsing = 'xpath',% N( P+ }4 a* m, A; P8 J( N. B  A8 C
        label = {( \0 B4 Z" F4 L3 H4 t
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    8 O2 [  l) L8 |" o        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],; G$ Y0 Y8 u3 y
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]: ?* l; U) _6 T( p2 x
            }," |+ X& p- H/ o
        write='result.pkl',7 U6 Y" T; h* l" t8 `' e" d
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    + v. c2 j. M$ m8 a( P    page=[True,'url_page.txt'],* D+ P: {' k% o) w" T5 |
        # bool类型,默认不清洗
    ( o5 K6 Q- l( [; ?# @    clean=True
    " O( j- ]  `0 [% k& [8 G).run()
    : V/ g: J, C; x
    ! b% @* O" D/ C/ h0 m1 }1 u1 v第八种玩法:爬虫存入数据库3 J: V& r3 u, D+ ~- h5 C% X( g; L
    存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。
    9 ?; F: J  Y  e& M- p9 s0 n" P6 w* s# q! v; ?
    特点:
    ; W7 Q( f4 y; ^信息存入MySQL数据库。2 L: M( K0 H; t/ ^# H
    可连接docker远程数据库。
    * ^, Q( V0 `) A/ F9 ]9 ?数据库的库名可以不存在。
    % h, n9 [( i! t" @/ R& c. K数据库的表名可以不存在。
    & d0 L7 [8 t/ h% H& x根据之前传入字典键与值参数判断表类型。( m* P& V3 a- Z3 O
    自由建立数据表传入信息。4 I1 o, F: `- H. G. _
    7 n, v4 Q+ w  \3 u
    缺点:
    2 u; w: X. _5 v仅支持MySQL数据库。) h! Z2 h3 K1 C" O5 b3 z
    * \+ [. Y4 S) R
    :return SQL
    , [: }+ J9 K3 }# L/ [# I6 C+ T9 J% R1 \6 }; m
    request.parse(9 W8 ]& P6 f1 G8 p; a; d. x: e5 ^5 u9 O
        url='https://www.douban.com/group/explore'," `5 t4 h+ \7 C$ x! r
        Parsing = 'xpath',
    * D( Z/ l% E; ~4 E) E    label = {, R8 _# K" i! O4 L4 p' I  o
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    : P' N& `, @+ A! `) d5 R        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    8 c8 x  @6 z* p2 ]9 u- b        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    , J4 t0 w+ Q9 Y        },- D, D1 H* {* x1 b; |% {5 o: _
        write='result.pkl',/ _. R% ]: Z/ |& w! H6 K1 z
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',% ~* {! M0 k4 X& }
        page=[True,'url_page.txt'],! d, l$ O7 a0 \; w2 x5 \
        clean=True,
    / p8 q" ]  ^% @& ]9 ?    # 字典格式,
    7 k  e; l: S7 s) i. P1 K! i! y    # host可有可无,默认localhost
    & Q( [) V" w( |! K! `2 t    # post可有可无,默认3306
    + k9 j* N7 [  Y( {; a    # user可有可无,默认root
    9 d' ]% `# X6 h+ \# D- y4 U    # password必要参数,数据库连接密码
    . O6 A) \4 c! J/ T3 Z    # db必要参数,数据库即将存入的库名
      i9 N+ v. c  o) `+ ]9 U2 |    # table必要参数,数据库即将存入的表名' p; i  |1 L4 A- `( b: u
        write_SQL={3 w8 Y4 a- K9 s! }: G
            'host':'localhost',1 P. Z" w$ {! t" P  ?7 F7 q2 u5 D, E
            'post':'3306',
    . ]2 O' B4 X: u0 R! ?4 e* U        'user':'root',$ _# ?$ x5 j* L) a
            'password':'123456',
    # m& s. T& @& j8 C        'db':'example',
    2 ?$ X+ g! z' {6 B" Z        'table':'example'( E2 ~6 {  l- f8 ?6 y8 h
            }
    7 i7 \; I9 i  h# g    ).run()/ }& F9 d1 g" }( u. w

    - n" B( ]8 a- |! ?) E5 ~第九种玩法:重新启动爬虫
    0 {7 h+ J: U# H# K1 g爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。1 X& `3 q+ w/ H& j1 D& }3 ?
    - t8 ~4 U+ f4 y3 o
    特点:
    . b0 F# p! v! Y+ F: Q检测报错重新启动爬虫1 Q& g9 X: s, s* c! Y) a
    无需手动处理错误信息
    + C- B7 R) K6 c  j% x7 d% v# a) w% B' n  P) S8 B; H
    缺点:' h1 q4 B# F3 [
    无法收集子线程错误。7 t! n/ Y+ N5 s

    8 c5 R; W7 H$ J; y  ]:return None
    2 {# S9 q) G/ Z& P
    4 q- e" p, h1 n+ {; I; B) Crequest.parse(- b+ |% w' s2 `6 w
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],7 {. A0 B/ {+ e0 k
            #login="taobao",0 q% c, }  B1 ?1 A* F
            type_url = "text",7 F0 ]+ g$ @% R; [
            Parsing = 'xpath'," B- }* E) ^6 j
            label = {
    4 f/ w" K/ }3 |7 q0 B            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],' ~4 j4 ]: y/ \! v
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str]," d- y7 d" r0 a
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]4 b( n* O5 m$ x1 P, h
                },# J7 ?  u7 y$ u  O
            write='result.txt',* M# }+ c/ \4 F
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',, K) a+ h3 d! g/ J/ {4 I* {( u, R
            page=[True,"now_url.txt"],
    ) W5 }& J  B/ Q3 R+ _% N1 I        # texting 参数为是否启用连续爬虫
    6 R. T# |4 Y4 h" s  H0 h/ }        # 爬虫程序异常报错后重新启动爬虫' Z. C  \9 r- J# I* ]8 J  l
            texting=True,: n( ~2 I& h3 O5 Z( i+ k5 K0 Y
            ###! Z5 {$ c8 z3 F+ x% s. i
            write_SQL={
    4 Y% |0 E9 S( e# v" d& k            'host':'localhost',/ Y& y4 c  m' z
                'post':'3306',
    # i( m6 y  z% M; L            'user':'root'," t2 a! N! W6 M
                'password':'123456',
    5 |, C; u6 i( \! M6 t# N            'db':'example',
    5 k" H) ^5 `. X1 I& K! |  r            'table':'example'
    ; T3 ]' M6 Q# I            }; S0 g# c  ]! a5 G: u# V
    ).run()
    3 S7 F8 H4 F2 ~: V3 [' I2 P
    : w+ c2 l* k" F% x5 O第十种玩法:多线程爬虫
    1 }0 o) e7 T0 m( C特点:; n* @' E$ H# n4 C
    爬虫速度加快,
    + y) f) r0 i; r0 I4 G. r更好的利用了线程。! x) y+ Z0 H) `. p9 }. L/ {
    ! M( m4 l8 P/ z8 ~( Y2 s
    缺点:暂无8 a3 N) Y' z/ k' ~+ T6 E
    9 G4 o# y: T7 o' @/ _2 O& ?* e
    :return None2 u8 ~* J  \9 b9 k: w, h) _" a

    % B# M: Z& y5 ^) I/ ?0 krequest.parse(+ B' ~5 L" ^$ x* M, l& x
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],9 Q) ~0 b; U/ I! Y9 T
            #login="taobao",
    ! J4 E8 a# S3 _# m        type_url = "text",$ L6 _# u. b6 e7 g' [4 ?
            Parsing = 'xpath',
    ) B* H! g9 {" N' Z        label = {
    7 H& |4 m0 V0 Q- f* ^            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],& y; l3 B' |; f0 s; u' h) i$ L
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    * t6 e) P. B/ a( c8 }            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]5 {2 m/ L& A& {0 \) V' a7 m2 d
                },, H( J$ z) `& A. P! N* ?4 P7 T: G6 ?
            write='result.txt',$ z' K" y  ]: z4 _7 g
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    4 @0 ^. ^3 v. B4 L        page=[True,"now_url.txt"],
    * r) D7 D) p; D8 y- _! Z; o        #clean=True,  D& i% Q7 N; \" C
            texting=True,
    0 @. V, m' R7 a$ R0 f        # status="threads" 启用多线程爬虫6 y5 z  k' y0 ]
            # Thread_num 为线程数目,默认为1 单线程
    : }7 H( j# H& v- j        status="threads",% v. y- n+ `4 D7 w# O
            Thread_num=3,$ r5 G. v; S+ [. K) b
            ###
      m; U- w5 l4 D; _5 S* G( @; r3 p6 U/ P        write_SQL={; j( t9 u/ B6 n- z3 |
                'host':'localhost',
    ) P' _* G5 Y, g) O5 z4 o            'post':'3306',5 d+ a4 E/ A  O: |1 G
                'user':'root',
    / K9 m' l1 E9 J            'password':'123456',
      B6 A$ _9 t' W/ w$ y( F5 ^            'db':'example',
    0 D* U! @* E7 [% w* i0 }            'table':'example', y3 ?6 c) w1 ]
                }
    0 c) t! O$ U  k).run(). J. y: e" p- T  t9 x0 K1 ~

    8 }4 M7 f1 b9 v- V9 |6 \9 ^) V- u第十一种玩法:多进程爬虫4 G; z9 s) N! o/ O' v
    特点:, S9 y4 a% |, O! V. `7 e/ n
    爬虫速度加快,
    0 p# }1 b# ]& R6 H更好的利用了进程。
    . h; f1 k) I3 f4 S2 a# Z
    0 B. E8 n1 |9 S# j缺点:暂无. T* E; s. r; t6 c: H% T" f
    / v" u. V) C& T
    :return None
    ( K$ m3 A' ?4 t  m& c
    ( D) Y) t3 v9 u+ Yfrom simple_crawl import request2 ]* d" p& W, k! q9 Y* `* P
    request.parse(0 [8 i6 `( U* L+ W& j1 {8 C' l
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],/ z, ]% y3 C% L. y
            #login="taobao",
    3 {3 ~: h& {, W1 d3 E        type_url = "text",: f. s  _0 u$ }* Q) ~
            Parsing = 'xpath',# {; M3 _6 m0 s4 K
            label = {
    ! ?3 Y  r5 D# i! S. r$ I1 t# \0 v            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    ' W0 w- }4 D, O3 x            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],6 m) ~: `+ X8 j. _2 _
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]" ]0 ^" Z5 `) ?  d
                },% F( ]7 q; s2 E' K7 t. x. A, Y5 q1 S
            write='result.txt',
    4 y% w. F6 p- B) s' T        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    ( j' F8 N6 T8 q+ d        page=[True,"now_url.txt"],8 G- N! `5 b( t9 z6 p- M9 L3 M
            #clean=True,+ N% [: f- @/ y) b9 H
            texting=True,4 i' Q) y9 k, ]/ Q! X, N$ t
            # status="multiprocessing" 启用多进程爬虫
    1 l7 A, e, }* s' w        # cpu_count 为启动代码核心数,默认为系统核数一半$ M2 |' l5 `+ z' K
            status="multiprocessing",$ s$ A( @; H: l' E6 z# A2 d
            cpu_count=2,
    ; }0 a1 }9 T+ d; H0 n        ###
    % Y0 Z8 x6 h$ k* W( D$ G        write_SQL={
      S5 I& r1 k  |2 P( s            'host':'localhost',
    * z- e) Y9 I* `7 Y  f3 v            'post':'3306',8 _& \, Y" l6 H# S& p# a" U
                'user':'root',7 [: L% b1 s+ G
                'password':'123456',. Y% V9 a$ B# M$ U% J' Y, u
                'db':'example',
    4 c: Z( I+ l" u# k6 }            'table':'example'
    * o* e) J# b9 \3 X* t; p            }" U5 U$ S1 v+ S# I& C( ~  w9 ]  B
    ).run()
    0 ?$ L3 {- U' d+ a; u" R
    6 ^# t+ y7 o9 O6 J& S. L- k第十二种玩法:异步多线程爬虫
    / b+ r  ]* G3 I% v特点:9 _; N) e2 X# C& _- V% e( [2 i
    爬虫速度加快,$ |- J0 s8 q  x, [& P
    异步使得爬虫无等待时间,
    " s1 Y+ ]: P4 h" v) W; E" k8 m" K( A同时使用多线程速度明显加快。* |2 X/ \) K5 q3 A4 D; P8 h

    * X. X5 @/ }8 |6 p缺点:暂无
    5 v6 }$ |, O$ b! y. ]& t' r. }- ^; n! P% h" I% s( J& x5 H
    :return None0 ~, @, B7 m1 v8 S

      k- j! q: m% l! f( I5 T8 X, afrom simple_crawl import request  ]  i/ V& W& x& I& Z! B
    request.parse(
    - y. B' h0 O: V4 q+ ^9 }- {: Q% {        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],2 C" d5 o8 y8 U! K) l4 `
            #login="taobao",) k6 D# e( u6 ]" [+ R' _
            type_url = "text",( U8 }, N* p3 ^% u$ g7 e% T
            Parsing = 'xpath',; |$ j) T; S  l+ _  S. N/ J
            label = {
    8 t( d( c7 g" U* x0 i            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    9 n1 G" n2 _# M- v            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],3 {: ^3 }' X2 }7 W; \
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    % q7 y( Y# y$ j5 n6 z' u            },
    # Z; D& k5 B6 S  J* A: a/ Q, X        write='result.txt',
      |$ q1 u: P) t! O; p        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    # s* f" G+ R& y+ @8 L        page=[True,"now_url.txt"],8 o7 v! M5 x1 c+ z7 e$ y& r9 _3 ]
            #clean=True,
    . R: j, U6 V0 z        texting=True,
    & \' G* `8 T2 H# u; K; Q        # sem 参数为异步引擎数目,默认为5
    8 S2 E3 B- v8 O. d" d3 Y        # 其他参数同上' Z" s/ x% n- L& R
            status="aiohttp",
    8 _; j/ F" q  o1 a9 `! k        Thread_num=3,
    $ S  c9 k+ n8 Y  f9 {" L. C$ d        sem=5,% j+ Y0 @9 z& M' B* w0 S  n
            ###
    , ~: f4 P0 E7 b        write_SQL={4 I( {+ q" _" s$ {3 a
                'host':'localhost',
    7 R2 y0 S' z2 _3 n6 m% `, k            'post':'3306',- i& s4 U4 i' u4 o9 ^
                'user':'root',
    / y& }/ J/ R. K' p, x/ H& Y4 k            'password':'123456',
    7 ^0 ]; x3 c. c: _( R% @- m            'db':'example',6 O" d1 D, g8 i4 ]; _5 O) Z; k
                'table':'example': p' f3 n+ x* J
                }
    : `, ?! A/ Q+ p3 l).run()
    3 s$ E" w: @7 d! b! [) g
    - d: d. ~" _) d7 m  {$ X! }第十三种玩法:异步多进程爬虫
    3 v2 Y; q7 P. J特点:
    8 O3 K) B: T( X8 ]  i爬虫速度加快," x7 U+ j, i7 `/ a, K8 [
    异步使得爬虫无等待时间,1 G0 i7 g: T! y" ?- a) `
    同时使用多进程速度明显加快。
    5 t$ q: c* r0 A, n( j) F1 A6 ~- R) g( J. \+ p
    缺点:暂无
    ; n, ~8 d# D9 H' I+ ]
    9 _8 i; w7 K; V  |* i2 x2 h% D: O:return None
    ( q. a) C0 v; |$ C7 _: m6 v' s) u/ t2 N. X5 J# @. L
    from simple_crawl import request* W' [& t7 {  J
    request.parse(0 s! k+ M; e% a0 O$ J, i$ p
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],5 ?: Y0 v2 [2 I* h. J  A. U8 B' b
            #login="taobao",
    2 w3 E6 R* O( u+ e8 O7 W        type_url = "text",. Y8 M/ d: }6 _* p) \
            Parsing = 'xpath',% x+ O3 U0 \+ |% M) a7 z6 o
            label = {' h* p+ S% ~* A0 E3 m
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],! T" a" d/ L  E# ?" d: W" K, R
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],2 a4 O! \- ]0 U* L1 q) q" R; j
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]9 \- r9 w* p9 i7 s! _3 }
                },
    / C4 v  v" \* K/ e9 |& B0 f  ^/ N: W        write='result.txt',' v  h1 A8 E* h
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',  B7 I9 ^" N9 W) T0 I+ j& t
            page=[True,"now_url.txt"],
    / F7 _% S9 t/ ~2 L6 h+ ~        #clean=True,- O6 x8 ^& d0 a! c$ P: |, W+ e7 H
            texting=True,
    ( h, D3 j, P0 u3 p, O6 [        # 参数如上# s2 N8 t3 x( S. A( y- r
            status="between",
    6 T: n0 B0 S' c' k% t- l        cpu_count=1,
    8 S- X, v4 d9 @7 p9 j+ V/ c# X        sem=5,
    # c" R; @7 ^: I/ ]        ###! {, g. \1 f  K* _, A6 f/ Z
            write_SQL={, ?$ M$ C2 s7 X+ o
                'host':'localhost',
    3 W) O, R/ z% p0 |/ L7 l            'post':'3306',: O% S2 X0 d; n) H" u% M
                'user':'root',
    ' o" A- E# m1 \) k" o( F: ^            'password':'123456',
    2 K- T8 \1 N9 L& g& c7 R            'db':'example',# @9 I- f4 ^% ~( u' F
                'table':'example'
    / m  h6 S2 k5 b! q2 U4 U            }
      i5 D4 n+ v/ R. ]; R).run()0 k' N1 f" f4 ~% {- _/ Z

    . K/ R# s, W% y  `0 w1 P6 b, F  P. m7 ^, _* o6 g
    功能介绍完毕🤞" f9 g8 v2 v) r0 q
    最后还是希望你们能给我点一波小小的关注。
    & Z1 f0 E8 N' c% O奉上自己诚挚的爱心💖
    / o' |/ ~0 L0 x/ x7 S2 `————————————————
    5 B  M* N; i# H. n  i; i# a版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。; o8 R4 {2 Y9 @* {5 d9 k9 z
    原文链接:https://blog.csdn.net/qq_45414559/article/details/1060056846 V- P) t5 W1 n; X& ~
    $ O3 R, Q, O: A3 \3 Z# q
    1 [. g' a4 @' r% |, k5 l2 N
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    738391227        

    0

    主题

    6

    听众

    32

    积分

    升级  28.42%

  • TA的每日心情
    怒
    2022-2-20 17:52
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    自我介绍
    哈哈哈哈
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    fastpost qq
    收缩
    • 电话咨询

    • 04714969085

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-11-9 19:33 , Processed in 0.257903 second(s), 55 queries .

    回顶部