QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5464|回复: 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& q+ t9 ?9 l0 k  [4 u" P4 \
    simple_crawl
    6 e/ B$ d  E( B1 e6 S仅需一行代码即可达到爬虫效果
    . v1 x) _/ E, t( D项目地址(欢迎star):https://github.com/Amiee-well/crawl# }% M' b- L/ \* v" n
    使用方法
    , }: Y: _8 ~" Q1 }pip install simple_crawl6 `2 y$ \; [& {$ f
    9 l* M  s5 f+ N% r! V. ^: L" y
    ### 以下源代码为简单介绍,详细功能介绍再源代码之下: r) Z) H8 i) I/ }/ q+ N* K
    from simple_crawl import request
    3 T5 o* c- S  e6 B' frequest.parse(4 ~7 a* L' \! L, e% t) J; N6 X
            # status 参数为运行状态,支持单线程多线程多进程协程以及联合
    / n  r0 b/ o3 K" c$ e( P7 g2 J        status="aiohttp",- m% O7 }/ z/ @% z" @, j" n
            # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式
    5 s3 p! \/ u( T/ u% j        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],, T  X5 b9 ^- l2 @
            # login 参数为获取登陆信息,如淘宝等网址需要登陆信息
    6 R- X5 t3 f( {% Y% B: {/ [    #login="taobao",, Y5 J1 ~, O( y: _, U
        # type_url 参数为返回源代码格式,支持text和json,默认返回text$ W; t: r1 J" j. P
        type_url = "text",
    & `1 z# f6 r: g% |8 p0 z+ b    # Parsing 参数为解析方法,支持re、xpath和beautifulsoup- k+ |$ W' p& Z' B% d& r
        Parsing = 'xpath',
    6 a8 p8 d1 j( b/ b# _    # label 参数为爬虫解析过程,字典格式,详情见下方$ I& P. u/ w3 ]' H7 S  ~
        label = {0 j9 }4 a6 w& h% H
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    $ e2 @# C/ c% u            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],7 d5 Z% |" s, o* h6 N, T
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]1 Q8 i/ n# T. I6 z' f7 d
         },
    # g3 G; p# J2 G     # write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱
    # Y- i2 a4 V! \! j     write='result.txt',
    ; ]4 ^0 N5 {0 I. C" s     # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫
    ( D! O; ~, ?5 p& f, C9 P) c) m# O     next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',5 r  K) B1 s6 t# D1 \5 c' ?
         # page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫
    , a( d9 M( S" O7 e     page=[True,"now_url.txt"],
    $ O7 ]9 {2 t' V( ^     # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息4 c8 @5 G: ]+ u+ |7 I5 c5 ?8 c
         #clean=True,
    $ y9 }1 D8 C( C     # texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序* X7 E& \: N& U: q* m# q6 r) H
         texting=True,) n7 m7 f9 n9 C! Y2 u
         # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态
    * K3 _8 \9 _7 _) U; x3 v+ h     Thread_num=3,
    3 e* N- e# j  @, F; x; E) u( y     # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态
    7 T. q7 Q. y0 n$ H' y     cpu_count=1,
      p1 i3 a7 ]# b, Q  ~( w     # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态
    6 k" ^. W3 M' k8 L8 g0 g7 x4 P     sem=5,  w1 S* f$ z* ~8 v8 M! _
         # write_SQL 为是否写入数据库,默认否
    8 l5 J' V1 d; t* ?/ d5 T     # host 参数默认localhost
    . K/ F- i* y% s, u) }. i% j     # post 参数默认33063 b6 M9 ]' t1 Q. J; Z1 J+ y6 v& ^
         # user 参数默认root" s" t( T% P" @! I* f3 _
         # password 参数必填,必须正确1 {% d4 Z; n) S4 N1 @8 N# r; o
         # db 参数为即将存入的数据库名,若不存在自动创建2 L7 L0 K' e9 n6 a7 p# B8 P( M
         # table 参数为即将存入的数据表名,若不存在自动创建
    9 W. G# K9 c' w: l% A4 V' Y$ g5 @     write_SQL={
    / e9 r( S& x* s6 Z         'host':'localhost',
    3 H5 u) \! J( |" F9 j" f         'post':'3306',
    : M: m$ q3 x5 X         'user':'root',. J9 m* l. f' w7 H  t
             'password':'123456',
    $ h( }) O7 B) o+ x8 A1 n" p         'db':'example',. K3 {: f" h# r6 t
             'table':'example'
    9 c/ d: w& {$ q      }
    2 M3 e% F3 g  d; d8 m! o8 S7 b).run()% e/ n) M* N, g9 m$ Q/ L6 h, I

    # C. X9 e8 q" s) f* I; E. U' Y介绍一下crawl参数设置:2 B5 _8 V0 K+ d8 {3 P1 L5 L

    + f, ]0 X! }" k'''
    , V& x2 W( T( n, u2 m7 r+ C单行代码爬虫程序执行
    # u5 b  P; u, q! [:param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档
    5 c/ t5 j5 S4 K$ i3 I4 o8 B! P:param url:即将请求的url地址,仅支持get请求
    , ^+ }9 M' v& x" L. ^1 n% R$ M, M1 O:param type_url:请求url后返回格式,支持text和json格式返回
    & |6 N1 _: t6 K1 E  E! P2 v3 r7 C: v:param Thread_num:即将启动多线程个数,默认为1单线程
    / T6 c: v) ^- j3 s$ d:param sem:协程信号量,控制协程数,防止爬的过快,默认为5
    , @( k2 k) |: r- ~; [; p; g& b:param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半: M% }4 G. |& V/ U. a1 j  F4 Y
    :param login:模拟网站登陆,保存登陆信息) m- o( x* u8 N( ~
    :param Parsing:爬虫方式,支持re、xpath以及bs4方法& ~9 O8 \) V% {# @) U
    :param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,+ E1 ]6 F7 F, }( ]* l
                           多次报错结束程序,默认否% c6 d/ o7 t& n$ [6 m) B
    :param label:选择器内容,字典格式保存,6 h1 H- t& @4 \: r( m- o
                         字典值为列表格式,第一个参数为选择器,第二个参数为转换类型2 y# ]4 w9 E& O8 L
                         第一个参数必填,第二个参数默认str类型
    - T6 P# i! Z* Y% ~& t:param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否* F0 P( _+ ?. o: [3 J. x
    :param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫
    , Y/ J# K5 G/ @) Q6 m:param page:是否选择断续笔记接手下次爬虫处理,默认否, J* g# Y3 ~, V* j% D9 o( I1 T% |# B
    :param clean:是否进行简单类型数据清洗,默认否
    8 Z" S- h4 }' J" d6 j2 R:param write_sql:是否写入数据库,默认否
    2 U5 k- k; r0 a8 Y2 T2 R( i/ L; T, s                         'host'默认为'localhost','post'默认'3306','user'默认'root',3 Q. Y# s# i& H/ O
                             'password':'密码','db':'数据库','table':'数据表',
    5 P, i5 c; L1 ~5 ~3 }( z6 J& f                         检测库是否存在,若不存在则创建,若存在则直接插入,2 K; `4 t) I( F1 O. s- v
                             检测表是否存在,若不存在则创建,若存在则直接插入2 z( D; g' ^& y5 W0 n
    :return True8 L. w  m* d4 \/ |' ?+ g+ W; h
    '''
      o5 g0 [4 d1 b& F- G介绍玩法) }- q8 n- u2 V" w. M
    接下来介绍的均为调用第三方库的情况下运行:8 [. a! C# O# Q1 q, R# d

    2 D0 b. d& F  J- A0 j: g  C/ D3 T. Ufrom simple_crawl import request
    5 ]/ \# |5 J& j' U  n第一种玩法:输出源代码
    ! ?( N- c# }: X9 [, J! ?+ b. l调用requests库进行源代码请求。
    3 E7 s. e: S- d4 Y7 B/ N( t0 [& W/ v1 P
    特点:
    7 P& t  M% A+ P# k' t+ Z+ N2 m; G请求失败则调用ip池处理重新请求访问,6 U- @+ h) q" J1 ?( C7 W6 H, p, V
    出现五次失败默认网址输入错误。
    & T; ~! x+ Q. r支持text以及json字符串返回。默认text。* Q0 J; ?  D7 |  _/ ?4 b. P
    ) k, o/ W. v4 y8 F
    缺点:7 b6 O) x& T. C4 Q7 [/ W: w) `$ D
    暂时只能进行get请求,不支持post访问( ~. ]% k& G7 ?6 J1 Y
    ( [4 }9 O8 L& `) x; x1 E+ k
    :return text or json0 z* m$ r% H$ r/ e! q6 f, y0 ?# O
    9 `1 M+ ?: X7 a, \
    request.parse(
    % F" o) D' V3 L# a4 z2 N( {) [        url = "https://www.douban.com/group/explore",
    : B/ @$ o5 y, [( A* {+ G  w+ ~        type_url = "text"
    4 I* T  o3 h9 J+ N- Z- Z).run()& I3 v! A. R8 [
    # return text
    2 t6 N& ?# ^/ y% o4 }$ |  m
    " Y! |3 d, I1 \7 j6 j; S7 K0 n4 v第二种玩法:模拟网站登陆并保存信息
    7 M% C; D' @/ H% c调用DecryptLogin库请求登陆访问。0 I- x2 k, z3 d: A
    4 J2 I% K" J% N& @8 K) E) S
    ps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源
    6 a# |( M' u! d- O! c5 z* Y在此放出文档地址5 W$ r; }0 k; l
    DecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/0 `; V8 s4 L9 l6 ~
    5 t1 u3 D: [( Q: J
    特点:
    ; X8 J8 R# H5 j- W$ ~- ~& s5 _将DecryptLogin库中二维码继承到此库(非二次开发)7 o2 t0 @! i  z+ M: Y8 J3 i
    支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆)
    / v* Y3 e, |+ W保存session.pkl信息到本地方便下次登陆运行4 V8 p' f. ^6 u+ ^9 c  D. o( F

    . t; D  Q) J% }  s6 h) _缺点:
    ' |. M' [! E9 w; _session.pkl登陆信息过时无法自动删除。
    2 X0 [- |6 r2 g8 v导致下次登陆疑似cookie无法正常登陆。1 u  U8 k# o1 a0 N

    ) ]8 w, p4 Z" v' g- S:return session
    # V' L, n" {( ]: p6 N3 g7 ~2 }, R& C' Y0 K+ f; q
    request.parse(% J/ h& ?/ l3 J9 _) f0 |
            # 臭不要脸的推广一下我的店铺
    . ?: h6 ?3 @, c/ U        url="https://shop574805287.taobao.com/",
    0 q# y5 @7 {+ F3 ^# ?' i! M! j        login="taobao": [! q, b8 B* |7 h% Q4 Q( `
    ).run()( }1 q( T9 A. M  B
    # return text
    1 o8 P* c1 ~! U8 d# P- _# `
    # K, S( U! _5 k! D第三种玩法:爬取网站信息
    5 ?+ y/ p, T4 |$ i) N爬虫库自然少不了爬虫的过程$ f/ `1 Z* [" Q& h  C
    . S, J: X& `+ ?( P% K
    特点:/ b* {4 n6 v" p+ s5 r, O# W
    支持re库,xpath解析以及bs4选择器。
    2 l. |3 b' a, z$ o爬取方法为字典格式。单方面输出。
    ; V/ i/ F7 r4 }1 f+ `0 C字典键为保存的字段名称。
    ; _$ Q6 J9 J& `. T( Z字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。% k" E4 S+ @- `% u7 P  |
      x2 U' C1 D, X$ _5 [
    缺点:暂无(等待小伙伴们发现)
    . Z: S" ]; m$ u1 P  I
    " g; k* C% |9 c6 J:return reptile_results, b0 F5 `& |+ D8 ]" U6 m
    9 z( b4 [* K4 f3 R
    request.parse(8 K* D2 O# v. X6 O  o* r
            url='https://www.douban.com/group/explore',
    6 h( U+ `$ @9 ^" C& C        # 字符串格式,选择器方法。
    # I+ W! S: `$ a$ M- l9 P( p    Parsing = 'xpath',6 r% t: ~8 |# S' M2 S( ~
        # 字典格式,参数如上。- W3 \: }7 o' b; e; A0 s
        label = {
    3 H3 i$ y; y' q2 K        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    - W5 c$ t0 I+ o- x( T" k        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],) j+ r7 X- Z; B
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]/ o/ J" u2 I  t% a1 j6 T% ]
            }
    + z3 }* r' G! `2 U/ g).run()* c6 Q% E! l7 V+ J4 p
    # return reptile_results(list)
    ; `/ M, c8 R: T( j; A2 s9 F4 W
    5 G' m, K7 f! J* ?第四种玩法:自由保存信息0 l5 V7 L% k* n. L% U. Q8 m
    目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。0 h0 h% c+ M/ v( y( T
    & T6 R- Z5 g3 X' V
    特点:
    : C, K5 [/ Q% Y9 E) N* s$ H写入文件均为数据格式传入文件。; _# p2 [1 |0 y, S/ L
    且输入格式规范方便阅读and省事。) F8 w/ Y/ q( V- p, m
    3 g- S* s  I5 H# ]+ k  O% _5 |
    缺点:
    ) T; `: s1 j: z) S# |: o7 p- m保存格式仅四种,
    & u8 w0 d1 I# f% i不方便用户之后读写操作。
    ( a  M# L$ [) E  ?9 \% S$ ]: g
    $ }, Q( q  B, z! U# [- [9 U:return file$ Q. m% }/ D. y+ O

    : ^. q0 F5 |9 _8 orequest.parse(
    6 p& Z6 w+ I+ J6 t8 J5 G# Z% C& d3 r        url='https://www.douban.com/group/explore',
    * ^9 k- c" L, N3 A9 s    Parsing = 'xpath',
    - |+ w4 V  a* Y' O- R1 Y    label = {
    4 b0 j2 m; F8 G5 a        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],' L  ]" e$ I# m5 U
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],* z& T8 \0 s' ]$ i& g4 l5 u4 T
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    7 X0 j, X5 H0 l. |! K% m        },# C1 f  j) x! D3 N' g- r, V
        # 字符串格式,具体保存位置填写
    7 ^: b% ], j, u( s! U+ u& t$ ^    write='result.pkl'
      K# D( y+ C+ R. [7 f).run()0 Y, x" d$ ]3 N4 P- c
    # return file' M" E( u% @( |1 N, y
    " R9 d; B! q% N$ s
    第五种玩法:读取下一页 url 地址继续爬虫) H$ `/ o8 h  l9 a. k
    这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~  D% ^4 p3 U: z  d4 O7 @
    5 H( l" h5 w1 S( X) W9 O- S0 i
    特点:
    4 L% R. Y, |( s$ T& i) c1 x继承之前的Parsing参数选择器选择方法。" o, d3 G8 f& M+ j
    在这里可读取到解析后的下一页 url 网址。# O2 x  H1 X3 b% J" f" R8 w
    方可继续进行爬虫处理。方便用户使用。9 c* w3 ^% p4 F0 v

    , L. X3 C* }# U4 q# u缺点:
    8 j. F* @' y. l! H若爬虫时下一页 url 地址改变,便结束爬虫。3 S5 U& B8 @" J  ]. |+ W2 n( U6 W
    只能爬取所给 url 地址中的信息。& D2 D  s# [1 c. i5 r7 l+ {1 {
    无法进行某一界面的多个网页爬取返回。% L/ p% @2 z; |: n* Z
    造成访问页面单一流失。8 ~) L6 k7 y; R$ u2 I

    + E  q$ o: j2 S: `% |:return None
    1 C0 \+ E: s5 t  y5 K( q* }( ?( Y8 b( t* P: S# a5 `2 D
    request.parse(
    $ U! y5 S/ U$ A" I2 U        url='https://www.douban.com/group/explore',8 q: }% ?/ I& h# Q7 z
        Parsing = 'xpath',
    - u, k3 E8 ^% P* g* O5 `    label = {% o& D% o( c" w  }
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    ( W4 H1 [$ D) v7 G0 G- V" o) k# n        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    ) x) D- u) s$ c' |3 H5 N- F7 _        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]+ Y/ p; a8 K- ~" ^9 x
            },0 F3 Y$ G* l: \, f/ B$ H
        write='result.pkl',4 B: c. G2 w+ }( K1 k
        # 字符串格式,根据Parsing方法继续请求下一页a中href$ Z$ J/ S& X6 N8 H+ o7 N. n
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',* c9 B! g1 O3 `+ X/ f; d4 s5 i
    ).run()5 N7 }2 @3 b8 V. F# Z8 d6 {
    # return None + U3 K  p5 R' M6 n+ N

    2 F/ W) l/ ^. v4 ]第六种玩法:爬虫网页保存5 W& A3 k, v$ x6 I# f8 ?5 k' P* _
    听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!
    ( w, W# H2 E7 `7 L$ w& C
    5 `  R& M) j/ ?3 ~& L: p! {$ d特点:3 @, c& c) }; H+ ^7 L/ k7 a* Y
    持续输出断续笔记。
    8 M6 ]2 G, {$ ^8 C. T) C8 B( B6 C将此次爬虫的 url 地址保存到一个文本文档内部。
    2 k& @' E* N% _4 G) s2 a0 w5 N% D下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。  q8 |& |+ ], l/ ^1 U$ X; ?

    - b- Z  v! @. f4 d6 S1 f+ m, u$ q缺点:" K0 o) Q. U/ p3 g3 s. r5 B
    读取内容不单一。7 s1 \! k' l) w
    导致下次爬虫无法正确读取上次爬虫留下的痕迹。
    . G1 R# z2 e4 h$ b; X+ D8 d& n7 w% o
    :return url_file# o4 F; y$ P7 {2 [/ k! m

    3 I- ]. o% J5 n: T* d& r0 n- L, S5 Yrequest.parse(* Y  t9 u$ m/ c
        url='https://www.douban.com/group/explore',
    8 H# d/ I* R  @# o    type_url='text',
    2 c$ @" n# v* a  ~# W4 P    #login='taobao',- }5 K( Q  D. O& K' F  Q
        Parsing = 'xpath',
    * n7 c7 ~) _' t3 V    label = {
    * E0 n. v' }. P# x        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str]," |+ ~" ]* T# A; C. ^) m
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    + c" m/ i, g0 F0 o# |9 r0 `9 _, y2 `        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    : C% y, o& E, a! X3 m! E6 A        },
    ( z  Z7 W3 @) p- {    write='result.pkl',/ V" z- ~) H$ f& o# l
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    % l" f# R2 N8 q    # 第一个参数为是否需要断续笔记。+ x0 B& F/ o" ^$ ^9 J' ]
        # 第二个参数为断续笔记保存位置。
    $ e! I% l0 ], A7 |) r. U6 m+ @. }    page=[True,'url_page.txt']. w. y8 \  ?6 M* V+ m7 k' H
    ).run()
    ! H7 Y* z5 u3 U8 [/ ]9 |* ^8 o8 p6 b9 X# return url_file/ p" [, ^* s! m
    4 P5 u/ [+ ]) ]) N  W; }
    第七种玩法:简单数据清洗, ]- V$ R2 h: A
    数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。! S/ f* X& g. G. ]6 g! D  |

    ; |7 A+ F1 s& i% Q( u( a特点:
    ) p) F. q4 g3 c本人曾写过一个底层数据清洗。
    3 ^. q5 T, `) W9 |5 [* H- \9 f9 L7 [能将列表格式数据进行归分清洗。2 ^) m% e3 P. ^) _/ u
    主要内容请参考另一篇文章' D, M/ \" @, f5 B/ f, n
    如下连接:数据清洗
    : F) I' X2 V1 G8 J" I% F  U- O
    9 R1 [5 L' e; B2 [) g$ L1 S4 ^3 E缺点:2 H2 c, P) v' z  U! W) j) J' Y" U
    数据清洗格式简单。
    $ \( A1 r* u) S! N" `% c数据清洗内容单一。
    ; R5 T) d: L; n, \无法完全做到绝对清洗。# X) U* c" W1 a; S$ S( M; ?
    有待改善。
    , B0 \4 k6 s2 R3 t: p0 G2 B6 x) O. D7 u" O* b* l& K( H! G
    :return keyword_list, value_list/ x5 X/ g1 c; Y! j

    8 C* E1 T5 b% irequest.parse(
    + v& d1 ^' V  B' L; r8 \  |    url='https://www.douban.com/group/explore',
    / C. n2 K3 r5 }    Parsing = 'xpath',' @4 Q3 K( R% ~7 I% M
        label = {
    3 e6 k- s! n, f- K# q, J        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],, x; D" r' q4 z# }
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],2 B" ]+ E$ M6 L+ n$ A1 p7 ^2 g
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]8 ]) [& V0 K% v5 q
            },
    6 [: h: m$ b$ |* r/ T2 g; T) {    write='result.pkl',
    9 `; C  O- P/ N    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
      i& ^9 N; ]# o7 k' J2 ~+ X. y$ Y" o    page=[True,'url_page.txt'],( e+ n' Y0 b0 }. q$ H" C8 [
        # bool类型,默认不清洗
    * c5 I/ b: T2 B" ^    clean=True! z' I* b2 Y: j. w: E
    ).run()
    & e, m$ s% b+ e3 w  T% f
    $ N( j! e1 q: \/ }8 V5 ^& N第八种玩法:爬虫存入数据库
    1 l+ L$ t6 o" c& f* X+ @$ j8 ?8 `存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。
    6 o2 r! F4 d  y( E. t1 H: |* a. o8 C/ Z9 Q5 @
    特点:) h) k1 |: G- I  J/ R% s; W  `+ F
    信息存入MySQL数据库。
    ; f' `" l5 N4 \" V可连接docker远程数据库。
    5 L7 ?% ]* i6 G% h; w0 c数据库的库名可以不存在。
    8 p4 |& Y- i2 Z, X' O  a4 ^$ {( j数据库的表名可以不存在。
    ( S4 i' U! q0 E3 C" f0 d根据之前传入字典键与值参数判断表类型。
    " r& {6 _( A  Y' T. l3 J5 R3 S# c自由建立数据表传入信息。
    ! d$ U/ R' ^0 B; i9 U& |' s0 J. q# s
    缺点:
    2 v% r: Q8 \& L. |6 h- @( [% v仅支持MySQL数据库。. _! W) ?/ f" n
    - o! T7 j6 t* \! I! }6 P1 X
    :return SQL
    ; s: T7 U1 v# {0 ?, G% t
    8 C+ r* I1 V# q$ G% ?7 l6 e  |1 Orequest.parse(
    . `2 J) R. J5 V9 B) h    url='https://www.douban.com/group/explore',6 G2 [# S' U3 t4 g9 w0 k7 Q
        Parsing = 'xpath',% }% g( H; P5 ~) U8 x
        label = {0 O) A% O9 E% k' t$ Z
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],& u# V& h3 L: N6 S* }$ n) \2 K
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    4 z9 Q6 y" O1 v( H        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    1 A! g5 A# k/ n5 h: D6 _        },, k& p9 y7 l6 A( q
        write='result.pkl',6 Q; l; Y, i  ^' U% I
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    1 K, B7 b) ]. m* y/ x) P0 `' V$ v    page=[True,'url_page.txt'],
    - Z7 b- M: v) z    clean=True,
    ; Q% B7 H/ e  T: c8 D; n& A/ S# J    # 字典格式,4 m8 P; a/ K/ ?
        # host可有可无,默认localhost5 s  y6 G9 M: b
        # post可有可无,默认33065 c# t2 P4 d. w& T1 G' Y1 _
        # user可有可无,默认root; F0 |- a) G) A* S" C" j. y2 \
        # password必要参数,数据库连接密码4 M- @7 E1 Q' {8 N# [9 c
        # db必要参数,数据库即将存入的库名  i: v3 f+ Y# ^- n
        # table必要参数,数据库即将存入的表名
    1 e# f% y1 m  |# m9 r7 D* ]" E    write_SQL={
    ! f+ D+ ~* A& h; ?        'host':'localhost',& z! b5 N  k4 ]6 u1 Y/ h; o' k
            'post':'3306',+ o" F1 A1 s4 M5 v* \" s
            'user':'root',
    ( e) t9 `. J/ G8 m; L9 F" f9 H        'password':'123456',
    ! R; e) K, S2 N' i- i! }8 M        'db':'example',9 Q' r: e% _; m9 E0 c; U6 Q
            'table':'example'8 ]% o8 `" G! |3 }
            }
    7 }! i  m# K$ G$ ?    ).run()
    , K2 _3 z* e/ l2 i. A- K" D
    ( a0 R# k0 h" T0 D第九种玩法:重新启动爬虫
    7 B" Z5 B9 L8 i' `; q4 W: ]1 }2 G爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。
    : p' x8 G( h4 K$ w* k9 d! F" i" n2 ]9 T8 X7 g0 \+ u1 k9 ~( Y
    特点:
    $ P$ x1 l+ R/ k( T( _& j* R9 [检测报错重新启动爬虫( k& U& Z) y9 L! K2 R
    无需手动处理错误信息7 g7 `% \& S; m
    $ c2 b" S) z# V  w# g% O% u
    缺点:
    6 D+ c" l3 M8 s! p, P% }无法收集子线程错误。
    ! L# a% K/ |1 e3 e2 h5 c5 b8 P; t4 o+ G8 ]3 E
    :return None4 {2 @' |' k. t( b

    8 C( `/ J: ]( X2 c& nrequest.parse(
    $ k( ~" _* v. Q% n& J3 Z3 \        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    , l  _1 d7 z# ?" R+ B; }. X8 y        #login="taobao",+ c% v5 t2 C5 a$ m- T0 {$ y
            type_url = "text",
    / U# H8 {' |" n& W: @* X# O        Parsing = 'xpath',' I7 W/ R9 v4 r" g; J
            label = {
    * e1 K1 j) g2 L3 \4 i# n. e            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],9 I4 t' n. @3 |( s0 \
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    % a9 l0 Y/ N( _0 P  S$ P3 k            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    9 w. s9 {) e2 b5 F* m* l3 M  p0 V            },
    & S: l. O. ?7 Q* ]" w* Q3 n        write='result.txt',* P0 D! v' s1 J5 [1 ]
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    " Y; P9 k/ v" ?! `- y4 }        page=[True,"now_url.txt"],
    & K& u. T: m- n" X4 {3 p7 x- a  D        # texting 参数为是否启用连续爬虫- P6 @% q5 a0 _
            # 爬虫程序异常报错后重新启动爬虫, y0 _3 e. @0 @: P$ P' b
            texting=True," P& v& v9 k& r
            ###) N& ]* Z7 X$ H/ A3 I  m0 f! X
            write_SQL={5 h5 A/ X: k7 r! ~. g
                'host':'localhost',! V: T4 e0 ~0 V  S& [( Q, b4 y( A  _
                'post':'3306',6 F/ S% Y4 M. y6 e
                'user':'root',* y" q7 ^" J" Y% G% `$ P
                'password':'123456',% \4 _5 }$ Q. c5 T2 Y
                'db':'example',
    2 Y- w7 P! A. S* o            'table':'example'9 T. o3 h8 \% Q! e0 i# n: e* g
                }8 w5 d/ M4 s/ S% ?" }
    ).run()! x, ~( n3 Y! r1 G: N; e
    ) D. A' G' }' S- z  \; f
    第十种玩法:多线程爬虫' L- v8 R0 f# r( {$ a
    特点:7 i4 F& d4 N+ [5 j, Q" ^
    爬虫速度加快,
    4 H! ^5 _  i3 \; e更好的利用了线程。
    3 E- I4 G/ L' b% d. f  [9 Q0 _# {  f0 x9 r2 [7 c
    缺点:暂无
    5 d% D! @, a  p0 ~0 |3 x  h4 P9 [2 f
    :return None
    0 `4 H8 _& x$ _+ v$ B  o3 I: ]
    - ]) d# W6 C3 a: ]: Prequest.parse(
    ( [! J( V8 J3 C4 i: @, B        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],7 c4 p1 X  e- r/ L) d1 Z
            #login="taobao",. a* D' q4 v% W( {* f1 N
            type_url = "text",) L9 r& [/ c) G* }8 {$ G" M8 R
            Parsing = 'xpath',5 R  F" v+ r8 X7 s" l. X/ N
            label = {7 b6 ~) ~" k( O7 V" N/ ^+ s3 w
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],7 Y$ i! b9 f! k$ H
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    2 Y, g' p- a* v" J            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
      D* F4 x; O7 b1 k* w5 Z0 ~            },
      L0 y5 g$ b) P- y% {8 F* h" O0 i        write='result.txt',
    : Y- G- O6 F, _        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    ; S* m) V9 n# Z7 A% L2 K2 B        page=[True,"now_url.txt"],
    ( K; x7 {# d; [) [' y        #clean=True,
    : D1 y8 v# [2 r        texting=True,
    , r6 H. B7 \! j: R; d' S        # status="threads" 启用多线程爬虫, @% G+ D3 o- @
            # Thread_num 为线程数目,默认为1 单线程
    5 e" R) |8 a; l1 l$ y. A- a        status="threads",
    7 K0 s/ k  e' Y7 r. m7 R        Thread_num=3,( ]" W/ q) V* t/ t7 |% ]
            ###
    ; _5 b( H( D9 Y4 f& s3 @1 j" i- Z2 |: B        write_SQL={% r0 K5 H7 [9 W0 \: I* h
                'host':'localhost',5 S$ G$ v; d" _( w! ?" M" ^" y
                'post':'3306',3 E+ A# h% Q3 M# m% k
                'user':'root',
    9 r4 E3 w1 @: ~& O            'password':'123456',
      p$ u; }$ p5 d. o( W            'db':'example',# m- v7 R3 N  h: T! _# l
                'table':'example'7 R" `8 W# F  I1 J
                }- S  e2 a. M: [+ a0 y$ S" J$ f0 V
    ).run()
    ; B; T5 L2 @& D4 J
    3 R5 G  U4 Q. R4 h. \/ A第十一种玩法:多进程爬虫
    9 s8 R( m, n4 s9 K特点:
    8 H7 n. K7 d! V& w7 C4 T" ^爬虫速度加快,: l0 i! D& c! I. T
    更好的利用了进程。
    + O2 w) s$ V0 c/ I: t% l% G& f; f" c% J$ ~0 q5 P$ ~
    缺点:暂无& c& Z% M/ P6 t6 o) f0 S9 i" r

    5 W( c" e2 j& f& N2 T+ F:return None
    ( ^) h7 p3 d  r0 n/ L7 z0 t
    ! o) }' a# q3 o! F' u) }from simple_crawl import request7 S! b0 E7 [$ A- \* {1 C, Q' I
    request.parse(
    - J7 G/ j6 U$ u        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],! _! U3 s5 u9 U% y. [7 Y
            #login="taobao",, E; B7 L5 L- ?) }# c% G7 l: D
            type_url = "text",7 ]3 K- O" f3 p4 Y/ I# s0 H( n0 z
            Parsing = 'xpath',& o# L& h# i6 p3 e7 z7 k
            label = {
    2 _0 y4 n4 \7 D# p/ e$ n            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],, i' `- ~- W. U9 o
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    * z2 F" P. G0 K1 }- v            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]% ?* B* U" c4 k0 E  W
                },
    ) h3 x1 D* J6 Y) C        write='result.txt',$ Z7 t! ]6 v( u( p' x  Z
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href'," C, k  m4 }5 X5 ]% L  E
            page=[True,"now_url.txt"],
    # T% z5 `/ `5 B4 b5 j8 ~        #clean=True,
    ! ~" n' M; _( I( s- G7 n        texting=True,
      @4 a/ [" z" U) M( c        # status="multiprocessing" 启用多进程爬虫
    8 Y' z& G7 S) k; e: b3 e3 Q3 b5 j        # cpu_count 为启动代码核心数,默认为系统核数一半$ `9 n6 x9 H1 R3 G
            status="multiprocessing",! w% d+ P* Y, V. c/ ]( g  \
            cpu_count=2,3 H4 H+ z* Q1 x$ P# [, i4 j3 h
            ###2 t1 h$ B4 ]. s% C5 _9 E# x: m9 S
            write_SQL={; U5 `' G0 i- @- \4 [" z% w
                'host':'localhost',
    5 a2 w( I1 l" M( _% k) R            'post':'3306',. D8 K/ P) Y& W3 K% J
                'user':'root',
    $ |2 V3 s3 F- p% l2 J% B4 ~            'password':'123456',
    / `8 t7 P! ?0 u" M- A+ A            'db':'example',
    6 Q9 P) c8 N/ E4 G1 r            'table':'example'% d, ~+ ~% ~! J- N3 y- h
                }7 L1 w$ V: J% q2 k9 t8 w
    ).run()% J. C% ]7 ]5 [! R

    : N5 d  j8 }/ [! J$ W第十二种玩法:异步多线程爬虫/ A. v4 j8 u& O
    特点:* a4 u$ ~0 f$ W# f& k9 h& c6 H, M
    爬虫速度加快,
    * C0 U) c$ |+ M/ U) N异步使得爬虫无等待时间,4 q7 v, B! V$ P8 {% u/ g# M
    同时使用多线程速度明显加快。4 N0 }0 a: j, Z: P1 X5 |
      z( A" [9 `- J0 j
    缺点:暂无
    # a6 ^3 X% l1 O  [4 [) D. v1 q; s! F8 @, _  m) [1 L
    :return None- X2 j6 k2 L7 h4 E; x7 i3 ?

    1 z7 I: a. }1 R$ z9 A- O# ffrom simple_crawl import request4 g! J% `, @9 [' P1 m
    request.parse(( t6 Q3 I8 g/ m+ o0 T* z
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],! K; ?" I( g% i
            #login="taobao",
    8 e  `$ s$ r4 M5 ]        type_url = "text",: J  A) o0 a4 `6 u4 u% L* d1 s# S
            Parsing = 'xpath',0 u. v& E0 [7 u: F4 z  I
            label = {
    . [/ b7 Y, ?2 V            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],' {1 W0 h2 e, o# \7 t
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],$ m2 \5 h4 W6 X/ z8 c" ]- i4 J! Y5 I
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]: D! l0 m1 H7 p4 `, [* G
                },
    $ g" U6 a4 L3 m6 i+ ^( d+ }        write='result.txt',
    8 G( |0 O, B  \( V8 j. K. \        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',9 Z. ]; x) A2 Y1 X3 z
            page=[True,"now_url.txt"],
    ! m, V" ]5 q3 m' q; h1 W7 S        #clean=True,
    + M, P. c/ P% F3 |8 j& {2 j: Z        texting=True,$ r$ N5 f3 e; a6 j3 d$ N4 f
            # sem 参数为异步引擎数目,默认为5
    / P4 \' p0 h# ?        # 其他参数同上$ n6 \( N* }+ t" ~" n; F* F! U
            status="aiohttp",/ }5 k: d6 A" i9 V* `  q8 O
            Thread_num=3,
    $ f% T$ C- D6 e* j* n, h        sem=5,, \1 a/ l- |- e9 d9 c
            ###- z0 p, _1 m; k0 U6 C
            write_SQL={
    - {4 b% D* s& L$ V  s% L. ^7 u; A) E            'host':'localhost',1 c5 y: k! X9 Q* i9 @
                'post':'3306',' Q; i! K; p8 B; z/ `1 E" @
                'user':'root',/ b# ]) h: `# {% m
                'password':'123456',  g* |8 O3 Y+ S# P+ u1 X+ F
                'db':'example',
    % \% G6 p  h3 x+ z            'table':'example'
    5 U% f2 E# ]+ x8 S0 N            }
    ( D' ^+ e$ E2 C).run()
    % j# |+ H  ?+ P9 n8 `  |8 L! k$ f7 w9 W9 P
    第十三种玩法:异步多进程爬虫
    $ F6 Z' R( Q- Z9 m特点:
    + }- O# E$ J: |. W. H爬虫速度加快,+ C, F& Y. R. @
    异步使得爬虫无等待时间,
    " {4 x: B  n( q5 E* Q% \同时使用多进程速度明显加快。
      u4 Z' L! q2 D, d) K. z
    $ E/ k9 n/ y6 p" \. z5 @9 O缺点:暂无
    ; M* X4 D2 y/ H* ]" D7 w4 A7 u' t( h1 `* D1 O
    :return None  j, Y6 N0 k" O, @$ T
    5 V8 f# O! j. i8 ~
    from simple_crawl import request+ ?# i* L" k2 E  w
    request.parse(* c* s1 r! F9 A: b# _* [& h
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],, u! D$ {* y  W2 Z0 K
            #login="taobao",5 x, s/ P. b& Z1 _4 {: Z% E5 T$ J! {
            type_url = "text",
    $ P/ ^1 L$ ?4 \% J$ b        Parsing = 'xpath',
    : F! z+ M/ A; Z  A6 z, W0 n        label = {8 ?4 H' w. p2 W& y- i( P$ U
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
      g* m8 C# Y% `; C8 C: I) A            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],5 G$ q2 W6 E# y! X& K
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    + x2 I, k" ?" {6 w! K+ [0 p) R3 R. q            },
    . A- i- G0 m* E- v/ b; \        write='result.txt',
    ! n% }2 W3 {, t0 h% `% E, w        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',' K/ D( i3 f+ Q! o7 v8 b
            page=[True,"now_url.txt"],
    : ^/ K0 |+ Y. r1 P$ H% M  P        #clean=True,
    , T9 O: H8 m$ ]* t! V        texting=True,
    ) F, o- h0 U0 E( t        # 参数如上
    ) l5 q. G( S& j: _9 W$ D        status="between",
      B6 p0 d& z! v/ ?0 i2 o0 m" ^        cpu_count=1,
    5 A" @: M/ H. E3 N' n- S        sem=5,
    8 d  L, v! u+ _5 q! l; r4 F) }        ###
      K% @- v" R+ `! x6 W7 n# v. w        write_SQL={* c2 x, c" S9 S; t0 o
                'host':'localhost',
    4 N/ c) e, h! D- T: D            'post':'3306',  M- u% K' ]: K# P: N2 O
                'user':'root',
    / Z# c, o5 N, Q$ G            'password':'123456',3 k. ?+ e4 J. ^0 \7 |/ I
                'db':'example',/ E( U+ x# T5 d9 {1 M: ]
                'table':'example'
    " {7 K# @( T( |9 Y: F            }9 Q9 ~2 d/ w2 Y1 X4 Z
    ).run()
    ( q3 ^  z' B  L+ x# R7 b: B9 _( N  B) e' e, \) U) k! v3 B

    . s# a- V0 U4 ]3 l4 \* f$ U功能介绍完毕🤞8 X1 R; A8 }& Z( e8 M7 z2 R
    最后还是希望你们能给我点一波小小的关注。% a7 J/ |7 a/ i
    奉上自己诚挚的爱心💖
    * ~( t- X( C5 i" R————————————————& ^, G' U* x+ X& K- G# Q
    版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。( g5 F, k' S" X1 o3 j2 D# I, t
    原文链接:https://blog.csdn.net/qq_45414559/article/details/1060056844 [' p0 m& ?# k/ k* L
    % r8 I2 f, B" x$ q$ ^

    2 e: @* j: H8 B. Q6 J- A$ Q
    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-7-28 16:30 , Processed in 0.680265 second(s), 55 queries .

    回顶部