QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2640|回复: 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( B3 s3 ~0 N0 Z  q; q5 u6 O- H
    simple_crawl
    - F5 N! y0 o& G# N7 q- H仅需一行代码即可达到爬虫效果7 c7 L& ?  C& B& A! R/ _
    项目地址(欢迎star):https://github.com/Amiee-well/crawl7 [; x  x# {+ {- V% k
    使用方法9 y3 [: R; C. o' w6 T- F
    pip install simple_crawl2 o; Z5 [' {3 }& j! ]: L: J

    / [; K6 X0 E7 ]$ @### 以下源代码为简单介绍,详细功能介绍再源代码之下
    6 |$ T7 J: x) T7 Q0 Efrom simple_crawl import request
    - w1 W9 a3 d8 `4 n0 }request.parse(
    % h2 v! l6 ]' t6 q9 d        # status 参数为运行状态,支持单线程多线程多进程协程以及联合
    7 c1 z; Y3 \8 g2 }1 g( v  {        status="aiohttp",& M# H- r+ U  Z
            # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式, _% h# ^! L5 M. f! p0 d  P9 }6 v; q
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    . m! `! H  K9 i5 q        # login 参数为获取登陆信息,如淘宝等网址需要登陆信息; M8 }# {0 f# F* z7 Z
        #login="taobao",
    ( m' O5 z% G3 G4 |, X# k8 R0 c! s    # type_url 参数为返回源代码格式,支持text和json,默认返回text
    : r; \1 C1 |  Q# A8 R5 ~% y    type_url = "text",
    8 y; S+ T" b' m* D5 A    # Parsing 参数为解析方法,支持re、xpath和beautifulsoup  j* b  N" f& T( a
        Parsing = 'xpath',7 g& J3 A2 o2 S+ C2 W
        # label 参数为爬虫解析过程,字典格式,详情见下方
    % ~* E% S7 [) o    label = {/ O. m; U6 q0 q. p
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],9 d6 a" a- v* e$ N# R
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    * v4 \% o* B* v  {! _- C            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    6 j) \, A, `+ r     },
    / l2 m: s% E, f; U6 E) o3 Z     # write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱" [& ]2 B9 B! ~! I2 [8 s$ r! }
         write='result.txt',) x( k* I; ?9 f3 c. F6 [  ^
         # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫
    3 }3 q1 g* q: s, G; b4 W$ y; C     next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    ( P7 y" m( z' K/ b! K     # page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫/ S/ _& C8 a: [
         page=[True,"now_url.txt"],
    + R- n! J- c& s/ _% v     # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息
    " H' B! W- q+ a' D0 Q     #clean=True,( y, |% z4 p9 B& \; q& t6 a  n2 ^
         # texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序
    / ^$ @; q6 P% z  V" y' @8 n     texting=True,
    8 ^1 l6 @& b; B: v; C0 l     # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态* u3 u) o. W$ e' I9 J6 j
         Thread_num=3,- a8 {9 J9 @! K9 y, s9 O* W) L
         # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态
    # j' h. a  J, S; l; N$ H     cpu_count=1,
    : m/ F! J- r6 z     # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态
    8 V$ o# C) a6 c) g! o     sem=5,
    / X4 ~& y6 b9 q' s" o     # write_SQL 为是否写入数据库,默认否
    : c2 Z: N' N! ^6 a     # host 参数默认localhost! c, |# j. ~2 D' {7 A1 ~2 O
         # post 参数默认33062 h8 W2 @: v4 i) ]& ]& v" Q
         # user 参数默认root9 i- ]4 z8 x7 _8 j3 b" O
         # password 参数必填,必须正确" q9 _$ b0 V) n) ]
         # db 参数为即将存入的数据库名,若不存在自动创建
    9 H% }/ F( p8 |: F     # table 参数为即将存入的数据表名,若不存在自动创建
    1 U! [9 Q" q0 W     write_SQL={6 R3 i. g  i0 |% _9 d0 _
             'host':'localhost',9 I2 }# B3 |" w6 [# f, h
             'post':'3306',
    % @( K, q7 h$ y         'user':'root',1 e- c& f/ M$ Z" R% A, D$ s4 W
             'password':'123456',7 U( U8 V. P- ?3 {% `9 n) k
             'db':'example',4 B& }  U( h. B
             'table':'example'
    ' j; k* v. G6 [4 n% K% `      }& B& B1 F! l" E
    ).run()
    9 [4 p) @  V3 {' E9 _% H
    / x: M/ `7 B8 `. o1 E介绍一下crawl参数设置:7 Q3 h* }4 I- \* F+ Y7 n; w
    3 _( @+ C6 {, h1 t
    '''9 G: A5 ^' n$ b( F9 l1 Q
    单行代码爬虫程序执行7 b" p. A) ~0 V8 J2 a
    :param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档
    + X  C- ]; q. R# |: }! e:param url:即将请求的url地址,仅支持get请求
    2 h0 C& ^# e% X* \) b! `:param type_url:请求url后返回格式,支持text和json格式返回
    , e5 a; w* Q/ V# f# A& ^& `:param Thread_num:即将启动多线程个数,默认为1单线程. I) h" X3 S8 h: X: z) q
    :param sem:协程信号量,控制协程数,防止爬的过快,默认为50 e8 K5 X# }. g7 A1 T. f& c
    :param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半
    # }1 y1 n# [% u0 T) {" Z7 R- i:param login:模拟网站登陆,保存登陆信息
    1 `, |6 M& y5 r5 F! _2 [. T/ g:param Parsing:爬虫方式,支持re、xpath以及bs4方法
    ! G8 N( F2 z/ ?- A2 h/ d7 s:param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,9 i* l, J! G: t
                           多次报错结束程序,默认否, h- I" e1 s3 q
    :param label:选择器内容,字典格式保存,
    / ~' i! R/ s" \& _. i                     字典值为列表格式,第一个参数为选择器,第二个参数为转换类型5 \0 B/ h- O2 I8 X
                         第一个参数必填,第二个参数默认str类型  O% ?. i# m7 A2 M3 t& b0 v$ C
    :param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否
    9 m  S* v+ T5 }* ?:param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫
    1 h& y& _- n, p1 d" _:param page:是否选择断续笔记接手下次爬虫处理,默认否
      p5 N: V8 w9 \! q) [7 q:param clean:是否进行简单类型数据清洗,默认否# L7 d/ E3 S4 c6 O, A# G- S
    :param write_sql:是否写入数据库,默认否
    9 S, g. w! ~0 z# k/ }                         'host'默认为'localhost','post'默认'3306','user'默认'root',
    * i+ \6 G: y8 `# m0 G0 |                         'password':'密码','db':'数据库','table':'数据表',. n3 j" H5 U, ?" ?# {1 y% K- `
                             检测库是否存在,若不存在则创建,若存在则直接插入,
    ' T2 B. m' S) T                         检测表是否存在,若不存在则创建,若存在则直接插入& V# @/ n. d- A4 }4 r
    :return True5 U6 j. h. d  |
    '''! U3 [0 _8 ^9 G8 R9 i
    介绍玩法2 y4 ^9 _9 w' o8 v' ~$ t" z( Z
    接下来介绍的均为调用第三方库的情况下运行:* s' X8 ?0 z- u% d) T
    ( }% d0 [: M: V! N; i: h$ |$ c
    from simple_crawl import request
    9 I" S4 |' V! X  w第一种玩法:输出源代码
    * W3 J* |7 i1 Z1 P; C8 A调用requests库进行源代码请求。
    ! L) ?+ a; B2 y1 D) N# Z9 E
    ( ?* H% z8 h4 F4 \$ C特点:
    - [% b, Q( v, ~! v请求失败则调用ip池处理重新请求访问,
    ) Y3 y5 v! z2 h; {2 Y! P出现五次失败默认网址输入错误。
    ' c' g6 H) O: J; {3 s  E" x8 ?/ n支持text以及json字符串返回。默认text。& i/ z# Z* }! K/ F5 ?0 ?1 ~
    ; p6 b) |+ d4 w! A0 H
    缺点:
    2 ~! i! ^2 B, E' [; U暂时只能进行get请求,不支持post访问
    4 h) n6 H  Q- m% I& q# H) |# z. E  T5 E
    :return text or json4 d8 y' @- [( ~2 `/ v: C

    5 |: Z' R! F1 H  x- m0 Frequest.parse(
    % i1 u3 V- ?' b. E8 s) [        url = "https://www.douban.com/group/explore",% f8 w6 d8 y# U1 {% p; d
            type_url = "text"
      y3 X) w! i1 q( F" c).run()! z1 X6 o% i5 [/ n3 t  h
    # return text1 s6 T/ @$ k& _. \3 L
    % k" t% y' P% H6 Q
    第二种玩法:模拟网站登陆并保存信息
    ! u5 C- N, u. v$ K+ e3 s1 U调用DecryptLogin库请求登陆访问。- E; w* {7 q7 }8 l$ B* _

    ) }8 j4 G3 O; G( }ps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源9 M8 e, L- y1 |# j- r0 l% W( q
    在此放出文档地址7 a2 {& B* @+ g- j& L2 O
    DecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/
    2 t. [3 Q. b# @  Z" o" q4 \
    6 ]4 E$ }" P4 c8 s特点:
    + U4 K6 ?# C, d将DecryptLogin库中二维码继承到此库(非二次开发); H( \$ F. o: y9 i. {5 j2 B3 S- _
    支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆)8 j6 Q+ T: ^: v, d
    保存session.pkl信息到本地方便下次登陆运行
    ! w3 r; B$ w5 g( {" q# M, l# w$ @, ^( u" S- K0 ?
    缺点:- b9 y, t% O' {( A) |1 S9 b
    session.pkl登陆信息过时无法自动删除。# H' ]7 L* g9 c" [8 s9 |" l. @
    导致下次登陆疑似cookie无法正常登陆。! W6 Q) L" f& @/ a
    ' ~5 _& |; y* T  e
    :return session
    0 n6 H7 l0 o) A3 R# g; _7 [
    ' Q* l( ]+ _: t8 a8 u3 @0 |" [request.parse(" u8 |+ r8 F: Y' W
            # 臭不要脸的推广一下我的店铺: G, W$ l) J6 N5 N4 E0 @
            url="https://shop574805287.taobao.com/",
    , b3 A; w6 i0 [3 W1 G" `        login="taobao"
    8 n- `9 @: D: c# e- j/ n1 b! M).run()6 w8 I+ W& e  z
    # return text
    / R* G) f4 K  v( j; }- {% S; E; i
    / o1 l( M* C6 `9 f$ T第三种玩法:爬取网站信息
    - I3 ?/ Y* y4 h8 `+ k4 a爬虫库自然少不了爬虫的过程
    - ]: r, A2 A8 f3 Q# k8 @/ A
    % ]3 D$ G3 w! S( V特点:
    # U) ~, \: a' t! |  T" i9 e/ a支持re库,xpath解析以及bs4选择器。1 X" e# o* M+ @( L, c' \0 |
    爬取方法为字典格式。单方面输出。, w9 C! E9 m6 F1 W3 d$ K
    字典键为保存的字段名称。
    # }5 N% W) y$ H  ?/ w, L( [7 o# _字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。
    1 Y* A! J& k7 Q5 ?$ z! g" \0 R  P8 h+ y& h
    缺点:暂无(等待小伙伴们发现)5 I2 f8 x1 D: E: M, o: @
    , i& K7 s" `0 S( `3 S  E
    :return reptile_results: b# b5 V, n4 w! S0 f* [, B- K

    , Y( G; P: C1 t5 X$ X# Lrequest.parse(* b- `" ]# [- F" b( f( X) M9 D
            url='https://www.douban.com/group/explore',. Y# Z& d) Z! J
            # 字符串格式,选择器方法。6 @( Z2 ?4 a7 [
        Parsing = 'xpath',6 S' o+ W( ]/ d! w4 \. K: v0 X
        # 字典格式,参数如上。
    " N: v9 z- {6 b: ?& ]$ s4 a7 w6 C    label = {
    5 W% l" _7 S, ?  d  q+ N        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    $ p+ \* {2 m0 @- E8 ?/ J        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],. `: s3 m$ p; R( a% f% O
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    0 `8 ]+ a0 S! H5 f        }4 A, d8 M+ p0 A. X
    ).run()- M# H+ F& o4 G3 L9 U6 ?& J0 k, K
    # return reptile_results(list)# {) Q* K& X, u

    $ k' b$ x" \) c2 x第四种玩法:自由保存信息
    & X, t3 u, D* L: q目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。" L7 ], ?% |7 h* ]! e+ o+ M; @
    & ^( s6 b5 |. p$ E
    特点:, L  o( Y) {0 D7 z; o; x
    写入文件均为数据格式传入文件。# E" c- v$ |4 |1 o6 S
    且输入格式规范方便阅读and省事。
    . O. N% ?% y" {& \: f9 K* z9 h* a
    缺点:
    ; W  Z# n. [( j1 L5 j! p: v保存格式仅四种,4 \" ?+ Z, p8 A9 {) x; k& p0 f
    不方便用户之后读写操作。
    8 n% K/ f' n2 ~' U- x9 z2 D6 o, Y4 ~; Z* o
    :return file
    6 G/ M" a. {* `% t/ r2 G1 w: b# a8 V9 c$ }9 u  [
    request.parse(8 o3 a* i9 @- Z+ O3 M
            url='https://www.douban.com/group/explore',2 k, _& t8 b8 y* O. q) L- X
        Parsing = 'xpath',
    ( K0 g5 P  d/ P" z    label = {
    1 _% K  K  j2 c+ j/ h' E( m  ~/ r- q        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    # P/ t& d& ]6 d        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    3 X- Y' P) b* c# u1 R$ l+ R        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    % h5 r; o5 x) n- [+ T' r3 s        },
    ( N4 Q' z/ M. ^: ^- P* y9 I' x    # 字符串格式,具体保存位置填写
    7 K( `' n$ c" i" g# v5 z1 T    write='result.pkl'2 s2 a! o7 B* k3 H& N
    ).run()/ v; D9 B" i5 U, l
    # return file
    4 R% |& Z' w8 V7 C% ^3 W, Z3 f' D- w/ f) g' [0 g. l1 W
    第五种玩法:读取下一页 url 地址继续爬虫3 P* i0 E5 O) Q# y9 h
    这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~3 c$ x* v4 O% U! }% M+ T

    6 h' m" k% e; b; q; T6 T1 C特点:4 e0 `3 k8 G5 M( R: k
    继承之前的Parsing参数选择器选择方法。
    $ \6 p. r& U5 M- o& b在这里可读取到解析后的下一页 url 网址。
    4 |. g# Y& F% e方可继续进行爬虫处理。方便用户使用。  f+ U' t# ]; D; c6 ~
    ) h+ S  ]; b+ [1 W/ W( ?0 h. q5 A6 Y
    缺点:
    " ?$ p% o% x0 o+ ^! \! Q% g若爬虫时下一页 url 地址改变,便结束爬虫。
    0 `1 `) |  n2 L- P只能爬取所给 url 地址中的信息。" V( G) g- ~3 M0 x# b; W
    无法进行某一界面的多个网页爬取返回。" }! Q0 L0 ?. `
    造成访问页面单一流失。
    $ L1 e9 e+ m8 A+ K& [  _, L& o& y
    :return None' ?- P$ C. x* t" H6 o) t
    1 E$ O# x  \6 w8 L0 `1 ?5 i
    request.parse(9 \3 M2 U& v6 N
            url='https://www.douban.com/group/explore',
    % [+ E$ J" m7 g! ^( y2 \    Parsing = 'xpath',3 B2 f5 B8 N/ E) z
        label = {; G/ v% U- ]2 D
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    ' K; \9 N" U; U2 y" r8 N7 A, |        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],2 s8 L3 e" q/ |, {
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    ; s0 q1 R8 e- V        },0 z- i" \: X- N& O, H% q/ k
        write='result.pkl',* |1 i3 N5 q% X8 }" k/ r# R3 t1 F
        # 字符串格式,根据Parsing方法继续请求下一页a中href+ U, V: A" u8 V
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',8 a; O8 }: }1 U5 o
    ).run()
    ' D7 p( R5 g+ {# Q: X% t# return None : s2 Q/ F0 e! [3 @. D* b( }
    : p* U# b/ x! B% }3 j0 p; r
    第六种玩法:爬虫网页保存- S: t& F5 H0 ~& B1 @/ B4 T
    听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!
    2 `' t. m* v& L+ V
    6 G0 I# T  Q) b1 D& o1 {, a特点:
    ( @5 l  H" y. O2 w1 P; w# Z持续输出断续笔记。
    * D  O9 v6 Z/ `2 }将此次爬虫的 url 地址保存到一个文本文档内部。2 a3 _& W" u/ U7 g( o7 j
    下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。
    ( S# z, |4 w% Y( |
    % K6 _1 f8 h! w! n& G缺点:. Q7 E: O: v6 S3 m4 e  `
    读取内容不单一。
    ; f$ W+ R  W4 N$ N导致下次爬虫无法正确读取上次爬虫留下的痕迹。, L1 W9 m4 R! i
    * G9 n5 t" U( U6 u" A1 h
    :return url_file
    ' ^/ ?0 b- Z, ?0 t( d
    4 g- e5 T8 b- O6 p. S4 E, ]request.parse(2 c# q  k! p* }9 R$ @; l% l' y
        url='https://www.douban.com/group/explore',6 s+ x( ~. E0 }# N7 n
        type_url='text',
    + o; [+ R8 w# [+ [! D( J  F. }! v4 W    #login='taobao',/ w- E' q3 k5 l' L7 n
        Parsing = 'xpath',
    $ a5 V. K7 M# v    label = {
    0 g( v' u! |3 ~) H4 c        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],4 s7 l* C: i& I4 ?
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    + T2 m) i+ b! F5 K0 x        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    " n& O6 L1 ]- ]& B' R        },# E; N4 ^: q, I7 J
        write='result.pkl',
    ) O' @  M7 m6 v4 R7 d2 U$ w4 s% y    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',& T# B7 R9 e5 u
        # 第一个参数为是否需要断续笔记。
    # w2 e- v: S1 u    # 第二个参数为断续笔记保存位置。
    6 P  a% J0 s6 O# t; S7 S4 g' ]    page=[True,'url_page.txt']
    % [& t6 i! l4 y9 T7 v).run()
    - w4 D  _0 d  z* o# return url_file3 b: C7 o1 r# K- l, l$ R& b! @$ @+ A
    * z: j6 Q: }8 I4 g, B* ]
    第七种玩法:简单数据清洗
    $ {# V& R- p1 U  r& r数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。8 s; O& ?1 i/ f& N
    & ~' _. y+ I0 n) C! K
    特点:3 \. m* {1 v: q1 Z) r: {
    本人曾写过一个底层数据清洗。
    # R1 Z: }. A# F能将列表格式数据进行归分清洗。* ^/ y! E* _( Y: \
    主要内容请参考另一篇文章
    ! ~" o+ ^1 |! A7 Z' l: ^! p如下连接:数据清洗; B  a" D4 f2 K# F9 |' Z/ V
    ! B& n+ l( \) S8 g
    缺点:+ h7 B" u+ n5 P
    数据清洗格式简单。, G% M2 g0 E0 Y
    数据清洗内容单一。
      N( J7 N" d, v: t9 L( z! b无法完全做到绝对清洗。; P8 }3 L6 {% k* r' P$ P
    有待改善。/ w1 s8 w7 I! g& h( e
    + P1 q7 x' D, M( b  r4 ^5 B1 Q
    :return keyword_list, value_list
    " S0 P0 D6 D4 [  {$ Z' w# I
    6 w% H  i5 b, U  l4 srequest.parse(
    ' I4 N! x2 W6 F. c    url='https://www.douban.com/group/explore',
    % O: n2 h* B& ^" _* O. V0 x* Q- Q    Parsing = 'xpath',9 u* Z1 P! B7 o; _
        label = {& t% ]3 y; a( t
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],( i, K  ]! v( n$ {( d: x& s
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str]," y% g% N0 O6 s# m  B8 I! h
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str], B6 K) L. g. V, V) f' F) |9 e
            },
    & S/ n. i6 X  p: N( o' m    write='result.pkl',; _; u, `1 B. d- a" s
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',, i1 s) ^: b! _1 b( D
        page=[True,'url_page.txt'],
    ( g3 W& G! }  H' C" _' _8 ^    # bool类型,默认不清洗
    1 ]6 B5 v1 `0 p( _  [    clean=True3 |, S: N  b! @0 o, B; J
    ).run()
    ; Z. ?, \, A" L; }  |$ |
    + J" }( g( |  A; i# h' `第八种玩法:爬虫存入数据库  d- C7 c# ^' I! e- Y. \
    存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。  i& P$ c& W" E1 p5 l* x
    ; @* g7 G2 y4 f! K$ d( a
    特点:$ H, C  Q/ y; B9 u' f! ~
    信息存入MySQL数据库。4 I' U# K9 z+ P/ }, Y! D- A, P
    可连接docker远程数据库。
    # }, R' W/ a2 _- X数据库的库名可以不存在。! p8 Q8 I/ v, ~2 p8 H: G
    数据库的表名可以不存在。- E" X; l% Z  }- ^. B# S4 }
    根据之前传入字典键与值参数判断表类型。" m( g6 ~" L; J5 N$ T
    自由建立数据表传入信息。( n6 B3 U( y+ X; D

    + R8 O4 l( ^7 L3 K缺点:) j4 W/ C( N" S$ f' h( V3 S+ n$ a
    仅支持MySQL数据库。
    ( N4 H. \1 N8 {0 N( M3 u  {5 J7 ?2 f1 X5 o
    :return SQL
    2 A8 i8 p# c0 `7 h
    9 L9 c& f8 \3 ?9 o1 arequest.parse(
    ) M$ p% G) s: V" o! Q1 X; }" a    url='https://www.douban.com/group/explore',
    4 [1 t' q" R, G( I: h    Parsing = 'xpath',: q6 [4 c! y6 W4 P2 `
        label = {/ z& y+ @$ p+ Q4 ?- l
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],; M' l. E: n, S$ u6 j
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],, H  r6 L+ A! i- S+ V
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]" t; x5 X* X2 J; y+ x7 V( n
            },
    9 l9 ~; D( Q+ R    write='result.pkl',
    - p3 _1 w$ P. B# Q; J    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',- D" Q3 Q! p) w/ n( R+ g- o8 J) `4 ]
        page=[True,'url_page.txt'],
    # [/ [; J% {6 p4 \. D    clean=True,% E- j) _2 `4 `6 b
        # 字典格式,
    1 Q3 ?3 Y8 r4 s4 _5 J& P+ s    # host可有可无,默认localhost! A& e/ i' ]/ u2 C
        # post可有可无,默认3306
    8 ^' S9 T! j, ?2 p8 ^( B$ h    # user可有可无,默认root
    ' ?6 I+ L( }; A9 T    # password必要参数,数据库连接密码
    . C% j: M" c1 P7 L" X    # db必要参数,数据库即将存入的库名
    & E) f4 \* B' k7 C  V    # table必要参数,数据库即将存入的表名- ]5 @2 W) r2 z/ U4 z
        write_SQL={
    ( v. [( Y1 A2 d3 q0 m  c* d# N        'host':'localhost',
    # F) J( f0 G. F4 {" e( i0 E# i        'post':'3306',
    ) P: t( i0 B& x& Y  G7 x' U0 ]- M        'user':'root',
    * i: }" z$ V' H' F        'password':'123456',
    0 \# q$ v  r  C. B        'db':'example',  _& I4 S* w, Z7 `2 }
            'table':'example'
    7 O( F0 t! X0 M        }
    2 s2 m# e8 q. b* s) M3 z    ).run()' M" U3 g5 ?# ~3 r/ {

    9 h. B: R& A4 r3 r/ h第九种玩法:重新启动爬虫
    % _+ H  @  N9 ~: n- n, k爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。
    : q5 I7 t6 l% b
    ' {9 t  j6 m! f* Q  n; |3 D特点:
    : \% T+ C& W/ g* j7 c+ U$ N$ H4 G检测报错重新启动爬虫5 y3 G+ y) s: R2 Z8 w
    无需手动处理错误信息% d; }* K6 F6 \1 W3 M1 j/ ~* A$ F9 I
    ! u- k) |( j, s
    缺点:4 v( S, ~7 ?: _" g
    无法收集子线程错误。
    1 o* s; Q$ ~& ?' O' g/ O( _4 \8 z- R9 ~4 ?
    :return None
    8 Z4 U' N  J2 o8 d7 v# ^( ]6 m; k' U4 @+ d6 k) z% K  Z- J- t7 z
    request.parse(
    ( b/ B% Z# w+ l/ D; T        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],7 Y% n2 v, q0 n' s( O$ j
            #login="taobao",
    0 ]5 R6 e# F" |' r. ?0 U+ K        type_url = "text",
    2 E5 i- ^: m% O. a, }/ @        Parsing = 'xpath',
    ) Q$ R- ^0 A# W# y- }" }3 T$ @        label = {1 P: |( X& @: {
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],/ L: O9 X7 N* |, i: I$ {
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],. e" {2 N. r0 `4 v
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    6 m; T4 U! k% i: D9 M9 n' O; }            },
    ! r, y: I# u4 A% f( ]* q        write='result.txt',$ B% q/ s* L* _/ m$ w1 G
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    5 [; x3 }+ {2 a7 L* R  \        page=[True,"now_url.txt"],0 i( ~9 K: u& e7 o4 Y4 d, p
            # texting 参数为是否启用连续爬虫
    $ X7 Q" i; ~$ R+ P4 e' s        # 爬虫程序异常报错后重新启动爬虫- ~3 E6 ]9 z" G8 u/ y
            texting=True,
    1 M. {! C! o2 E$ f2 @8 d( L2 z        ###" \: g' _7 A# g: B  l7 O0 f0 Y
            write_SQL={& o. ^6 `0 Y( A3 f, D
                'host':'localhost',
    % h# v0 Q% Z; H& S* r0 e            'post':'3306',
    + G9 y+ x5 @3 `5 e6 _+ Y" ~& s            'user':'root',
    ) g$ X& M% E7 i) R  @- F            'password':'123456',
    ' ^% J, B% t5 {3 L) X            'db':'example',
    ! t" X$ u  E& ?/ C            'table':'example'5 s# w9 ]% Z6 ?; c! g
                }
    ) t9 \  K  u. E' o).run()" ]1 @% m4 z/ F
    - ~  A. T3 z. Z& P7 w
    第十种玩法:多线程爬虫
    5 ]7 s/ W: {% I9 y* i" Z特点:6 |) b2 R% I1 u8 c* V. P
    爬虫速度加快,9 f0 M/ {' z' B* @; ?$ P
    更好的利用了线程。& T- x# I% q/ N& D
    ! `% D5 y1 t/ E
    缺点:暂无
    2 ], |3 g& {" K' n- q7 P- y
    & A: M5 k; [8 ~5 ?' ~5 _:return None$ d+ f4 p+ x2 S- r

    ( Y+ m. d! [( }, L8 Lrequest.parse(! H2 N* L& w$ i) J* p
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],3 u- h2 V1 g1 E; ?+ j
            #login="taobao",! d6 Z: K, K- v& z7 ^
            type_url = "text",/ N6 v: X- R# G
            Parsing = 'xpath',7 Z  |1 h7 t0 Z. Z: z& [
            label = {; F" a, Z' W6 N
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    " n- D9 H6 ?- d            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],( @. b+ a4 d% y4 A
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]: t, |; j  ?# {  U7 C
                },
    " i% ?1 O( o: C' G$ O        write='result.txt',$ ]0 ?2 Z& W. G- V  b+ r- E& A
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    6 w+ B/ G9 z' `$ p5 x! f3 t        page=[True,"now_url.txt"],
    $ F8 ]) T" z) d3 C5 w        #clean=True,
    $ Y3 r' h- L! B) C9 P- o* @; o        texting=True,. m( d  E# Z$ {# N3 v
            # status="threads" 启用多线程爬虫
    1 ?; ?% ^+ V7 D- ~" r& i        # Thread_num 为线程数目,默认为1 单线程) F- J" j+ a1 C5 ~1 m
            status="threads",9 {% R" F' }5 k: d/ n5 Y; b
            Thread_num=3,. E& M( t( J' G
            ###' `  s1 l) ]% z% _
            write_SQL={
    $ c! ?- W2 [  m2 j            'host':'localhost',0 {, {$ y$ q6 W8 b, V- ?% @5 @4 B) @
                'post':'3306',4 z% ?" s2 z  }( e' K
                'user':'root',- O( [# y8 i6 z; T
                'password':'123456',
    . _* S6 x9 S+ B$ G+ C4 ^- `/ q            'db':'example',
    8 d3 T, \$ }2 S4 r9 p            'table':'example'( b2 w/ Q( o- T
                }
    6 P+ P' h* m3 z2 [! I% ]).run()7 E* x1 z$ ~. {+ o2 {

    9 J7 z5 c) e) z& H/ B2 _0 f. z第十一种玩法:多进程爬虫
    5 D. g) A4 Y* Z5 ~& G! H+ ]# g特点:. D7 |+ I2 N3 U, R0 |! L
    爬虫速度加快,
    - d( G5 C" H: g% z3 q6 y更好的利用了进程。) Y4 N9 L5 M% D% Z% C2 C& T; R$ b

    4 |7 _! i( T- e5 n& h: [5 v缺点:暂无6 J+ r' [( T2 f: n+ W

    ; i* G9 Y5 l& }  X- e% R:return None
    * r+ Y' G2 ?) M% T8 ^" |% U
    " G* D# V: u, Sfrom simple_crawl import request
    4 w: w3 h( `; q  k& P7 t0 m1 frequest.parse(
    ! a; Y" b$ f: i* Z5 M        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    0 z* v( [' b8 e( E; T        #login="taobao",
    . L0 A* ~, f6 S) C( X4 ~7 f        type_url = "text",
    4 G& E9 L/ T: k( ]        Parsing = 'xpath',
    % d! ~* R9 J8 ~" |5 [        label = {/ J) W$ b6 M7 T; E- r+ j! z
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],0 _0 I) S2 I6 f" S7 n8 b* w% T
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],3 G% q; @0 D" \
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]; e' v& S0 j- C' W; ?
                },
    ! C$ a5 g2 l3 [  c        write='result.txt',' v( Z2 |4 c; ^! K5 h
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    , G- g% ]. [" Q: m2 p        page=[True,"now_url.txt"],6 }& C0 [5 |" d) K8 I
            #clean=True,& o, B( Z2 U7 `7 l  _8 p
            texting=True,% p- z# S* \6 y% p
            # status="multiprocessing" 启用多进程爬虫
    ( I' Z/ T& J. T+ K) f1 s        # cpu_count 为启动代码核心数,默认为系统核数一半
    1 B$ w3 A2 a8 }, [" w# u( H        status="multiprocessing",2 J! O% j' {' J  J. q
            cpu_count=2,1 j8 U0 N  e$ P3 T% F
            ###$ x8 u5 g" R& w6 v6 X9 E1 _( v
            write_SQL={
    . y% Y3 g( B; M7 r+ f0 u, N. F! J            'host':'localhost',9 x, m2 l8 e/ n1 \0 A. T5 p
                'post':'3306',
    : n5 X& i2 _; ^! ]            'user':'root',
    ) b0 ?) |  W! a1 k2 {            'password':'123456',
    ' U" B! @. k" v, R' K' z            'db':'example',
    " }2 p9 W3 X- e: a6 ^            'table':'example'* n/ |+ ^' ~) K' z! I( U
                }
    ' G6 l. _3 S; v3 @: M" Q1 S: {).run()
    ! A# ^2 N0 {1 K7 e" M+ F. G0 I6 p& S% c: [
    第十二种玩法:异步多线程爬虫0 w, R2 y1 `. ^
    特点:6 M/ M; [- y* n
    爬虫速度加快,
    5 {, w6 Q0 j  y4 d! s/ Z异步使得爬虫无等待时间,6 _' ?- C# Y5 _
    同时使用多线程速度明显加快。  V5 H: X4 n3 o% V

    2 m8 z! S& B0 U& v( i缺点:暂无; t( \# z5 ]) ]/ o( b. o4 T

    , O/ s! s0 R) k:return None
    + g9 `) j3 O1 C: N, T* h3 y4 y# R4 V+ D
    from simple_crawl import request  J. E) T) B2 _. u
    request.parse(
    $ g! H, l: W. @8 a% X( ~6 {        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    , d3 r2 \$ i2 f6 B0 o        #login="taobao",4 n3 F% m5 b) z, U* A, P
            type_url = "text",5 W  b  b3 x7 V. j5 q
            Parsing = 'xpath',  l4 Z5 m. Y! Z7 A  c8 ]3 r
            label = {+ t( K* |1 u" h
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    6 j- w5 e7 h. z% x+ g            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],8 ^2 Z( W1 \8 V& W9 p
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    4 @4 ?& i1 S3 c; t. L            },
    5 |* c8 O! I1 F        write='result.txt',6 j1 K  R6 i! B8 s" b" i
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',: }0 H  h( J+ D. K! `, I0 }
            page=[True,"now_url.txt"],3 [3 n% o7 a" h7 V& q9 Y
            #clean=True,
    ; _" M# `  t, B# M        texting=True,
    1 |2 ~6 ~; F3 d, j" _# a        # sem 参数为异步引擎数目,默认为52 w( x0 D! w, A3 X) Q; ]9 T
            # 其他参数同上
    5 w% o4 L# f9 L& ?2 i        status="aiohttp",
    : \* Z; r$ U( F: b        Thread_num=3,: C$ }% N7 h$ g' ~
            sem=5,
    " A1 o6 T8 n2 w3 _        ###
    5 K( B9 u: [, M9 U: z0 B" x        write_SQL={: p/ O. ]( ~9 h+ `- @' e
                'host':'localhost',
    ' C, W9 f5 e4 J4 f. M            'post':'3306',
    , _4 |# ~3 Y# B8 s            'user':'root',
    ! g' f$ }( Z+ @3 I. O            'password':'123456',0 Q6 n" i. P9 g5 ~9 X# F: Z
                'db':'example',7 F( A: s* j% ]2 p, J0 Y: q. c
                'table':'example'
    * p7 ^( u3 H0 g3 d            }& [  K, D  ]( y7 r8 y2 k
    ).run()
    * k- e8 u* g- K6 @! F1 n! J# G4 ]" \2 w  r8 Y
    第十三种玩法:异步多进程爬虫( N" j3 b$ z4 d% Q
    特点:6 D+ b' o1 R$ ~# s3 i& [
    爬虫速度加快," u1 N8 D/ w1 i* [! m
    异步使得爬虫无等待时间,
    * W# T$ M0 R9 \7 D" I3 {+ C同时使用多进程速度明显加快。
    $ h0 c0 }( B1 ]8 L8 r& T0 b/ K5 o* _4 L
    缺点:暂无
    ! l: h: W2 c7 D; a
    / i2 T+ y' O4 z:return None
    6 R. k4 [( ~& |/ f$ F) ]: K2 A& E5 E2 v) ~* w
    from simple_crawl import request
    0 A4 Q7 r5 P6 v% ]4 X, ^: @2 Lrequest.parse(/ f+ J8 p4 p8 g% Q9 G% F
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],2 e% V# X6 i5 |, h% g4 X3 y
            #login="taobao",, O2 S: j* [# z0 Q" e; I
            type_url = "text",
    : h& L: T! w2 K% D! F        Parsing = 'xpath',0 w( ~6 N! t7 s+ p6 B4 g
            label = {
    3 ^* U, f1 r6 V4 B0 O' Z. ]- m            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],3 {4 X4 K7 w  Z5 K) }
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],& |1 `% U& O1 ~2 s7 d7 F
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]0 P8 z+ |: k6 g* b
                },
    8 e! D! k: t- X& f; C        write='result.txt',
    ; H1 u  X! T, ?4 y( }% |% ~        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    - s7 F; o6 _. f: S6 K1 c        page=[True,"now_url.txt"],1 J, X+ G% `& g/ Y5 m# _) L
            #clean=True,
    1 U, Q: `8 z1 e1 k, D+ x        texting=True,
    ; K* B0 M, \3 W7 L7 w        # 参数如上
    1 n' v- k& Z$ z3 K, L- b! k        status="between",
    3 G1 L' d3 b" |5 t! Z/ O        cpu_count=1,
    " _! i* ~7 z- B' {4 B0 x        sem=5,
    ; r+ a, W5 x9 S: k: J. g, {        ###6 A9 _: N( G5 u+ r. R$ f7 d
            write_SQL={+ v4 {: q1 A2 P+ g/ t5 V
                'host':'localhost',
    + R7 v, k7 x9 r+ K            'post':'3306',
    $ U) Z% e' d6 N! V2 |2 g            'user':'root',
    ' f: i/ _" B1 W2 h8 z& N            'password':'123456',- Y$ i4 M! \9 y/ m4 q1 s8 {& V
                'db':'example',2 P) L9 k4 D1 U! q! w- v
                'table':'example'
    6 N, j  G9 V# i            }
    " S* ]$ Q* G) H5 i).run()' y' v: s% a0 a. X6 K/ r
    3 v5 O: J: {* |8 W0 D+ S

    % v8 ~* t1 \9 o2 Q功能介绍完毕🤞$ s& M" b/ j) d! U
    最后还是希望你们能给我点一波小小的关注。- J. Y5 H  c5 `9 s( h3 M9 K
    奉上自己诚挚的爱心💖- H0 g3 g/ s. G# E7 U: W! t2 h
    ————————————————
    + {. Q- X" l: T版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。  U( v% I# v4 E' ]
    原文链接:https://blog.csdn.net/qq_45414559/article/details/106005684
    6 s% R6 C% |( e" g6 l) R8 D0 b, ?: U8 R/ C( o/ Y% h
    5 e" U$ _! {" Y: E! b9 s2 ~. O$ D4 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, 2024-4-26 19:13 , Processed in 0.510241 second(s), 55 queries .

    回顶部