QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5623|回复: 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& J/ d$ E! E2 R# ~) b/ L
    simple_crawl1 |# H- O/ b0 k6 u" C, B3 O# r
    仅需一行代码即可达到爬虫效果
    2 @% q, Q# ?( F5 M7 @5 H项目地址(欢迎star):https://github.com/Amiee-well/crawl
    5 D) `8 H) O' B! Z6 h9 ]) o5 j使用方法
    8 u* U, b: G  Y$ n4 ~; Rpip install simple_crawl0 I) P: I8 n: m3 w- Q

      U; P2 F, i. q1 ~, q### 以下源代码为简单介绍,详细功能介绍再源代码之下
    0 K* T; j9 ]" I- o$ G$ Vfrom simple_crawl import request
    - V5 {# }- t1 Nrequest.parse(
    . o( ?9 V) v- V* R( N2 n. k2 o, p# ~        # status 参数为运行状态,支持单线程多线程多进程协程以及联合. x$ V, C! h- z) W# r2 V
            status="aiohttp",: `8 x/ Z' b- K5 R- O5 j
            # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式
    ) u! n9 s) V0 u6 @        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    ; j$ f8 m+ _# z& H6 n! X9 s& S        # login 参数为获取登陆信息,如淘宝等网址需要登陆信息+ ^  D$ I. A5 S5 ?; }
        #login="taobao",
    8 g+ S- l5 v& y6 J5 M; [0 E    # type_url 参数为返回源代码格式,支持text和json,默认返回text
    + M& y3 W4 K: k7 j& F! N1 G    type_url = "text",1 z1 R% n; P. l7 b1 y7 @
        # Parsing 参数为解析方法,支持re、xpath和beautifulsoup
    & p5 C  D  S  c; U; P( d    Parsing = 'xpath',
    ( x: q' ]7 U/ v1 \: G    # label 参数为爬虫解析过程,字典格式,详情见下方
    8 i1 j' H: S- }) l& W' {    label = {( F. k# \4 c' F! K$ }
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],, I  e4 c2 q( M0 o4 q+ c
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],8 t# \2 o4 }: _7 w
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]5 k; V' G. y! J7 {  f
         },
    ( O7 y: Q- n0 P  B; x) `     # write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱
    ( r4 b( S/ `1 l& E- w$ d$ E     write='result.txt',+ x* V3 Z/ @7 G! s# f
         # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫$ ~/ p! v/ }& w  M2 H  I
         next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    ) ^. m7 Y% C  C8 q& L     # page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫
    3 U) {2 L# |! |) u& V" M7 T     page=[True,"now_url.txt"],1 i- R! Z1 N) ~, i, M3 A0 J
         # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息
    - z1 k/ V4 z6 Q1 M+ `: O" C8 _     #clean=True,) O* K1 N0 t) ?$ e% t
         # texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序
    ; a( `; h: o' _) i) J  k( n     texting=True,
    3 V. `5 r2 ?! ?4 _     # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态
    7 ?3 ^" Y* W$ A& K! z9 x0 W     Thread_num=3,/ w0 z9 q" S- T& ]
         # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态
    : o7 e/ o- Z, Y     cpu_count=1,
    ! V7 G: f( y( Y5 \8 H6 {/ |! ]     # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态
    1 X5 K' D" T& e$ d2 N# J% J     sem=5,
    ( n  ]- `; v5 X* Y5 z     # write_SQL 为是否写入数据库,默认否
    ( \) v4 @' x, L) Y* }     # host 参数默认localhost) d$ _# ]2 k2 {! d) D
         # post 参数默认3306$ o4 w: N; e% U
         # user 参数默认root
    3 K4 L2 r+ B: u# d) L2 @     # password 参数必填,必须正确2 a$ \! g, V# ^5 [. C# t
         # db 参数为即将存入的数据库名,若不存在自动创建" u6 q! T4 x8 _* |% H$ m) O( p
         # table 参数为即将存入的数据表名,若不存在自动创建3 U! R4 s5 u( D- n* R
         write_SQL={8 T: G! J5 w  `7 L& h
             'host':'localhost',
    * J- F& W, K- I         'post':'3306',
    ; {% O# p5 ~# k- j% _! [         'user':'root',
    / X# Q: Z0 u* {- e1 s! @& l( b         'password':'123456',3 C4 t  x6 I. s" |
             'db':'example',) `0 d/ _+ Z; S
             'table':'example'  q& o  H" x# ~
          }
    " ?0 H& c! [! A; @: g, q% Y1 f).run()
    3 p- `' D8 L1 p' z
    ! x+ Z5 X  A! b  }9 u) a+ K. {2 b介绍一下crawl参数设置:8 y& Q" s3 b) `
    ) ~' N( Z; Z/ W0 ^: p" X
    '''
    & \6 y9 a7 q4 f; k$ j单行代码爬虫程序执行; t* E1 G7 k0 Y# o" ~- b, I
    :param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档
    * ~  Z- D# |8 L9 b' _:param url:即将请求的url地址,仅支持get请求
    2 J; t' K0 h) H& K* L:param type_url:请求url后返回格式,支持text和json格式返回
    + P$ n' P6 B- t- E6 d:param Thread_num:即将启动多线程个数,默认为1单线程
    4 U6 z  o" E( y2 q:param sem:协程信号量,控制协程数,防止爬的过快,默认为5, |9 B) k9 r' r4 A' ]
    :param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半- X' D3 V( }5 l- ]" r; A: U2 j9 J
    :param login:模拟网站登陆,保存登陆信息
    5 W, f. G  p) f:param Parsing:爬虫方式,支持re、xpath以及bs4方法
    ; v$ I4 [5 k& Z5 H) g2 n! X6 O:param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,% U1 J* |$ k& ^
                           多次报错结束程序,默认否
    " \) I% h  o0 f8 Q" v:param label:选择器内容,字典格式保存,9 i$ Z, V, W# y+ q
                         字典值为列表格式,第一个参数为选择器,第二个参数为转换类型9 a2 n9 d. G% M! l
                         第一个参数必填,第二个参数默认str类型- E0 i; h7 d" Z5 e; O& ~
    :param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否
    % F! C* u! T* B6 _:param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫8 E' j5 ]8 _  E# @3 K
    :param page:是否选择断续笔记接手下次爬虫处理,默认否
    4 n* C& r4 l* ^/ X$ w:param clean:是否进行简单类型数据清洗,默认否
    " i$ R& G* _# i5 s. s  S+ E3 U:param write_sql:是否写入数据库,默认否
    9 `% Y' G4 d+ ^' A                         'host'默认为'localhost','post'默认'3306','user'默认'root',7 O: T, y; V2 q" r9 E+ t) }
                             'password':'密码','db':'数据库','table':'数据表',
    4 x7 E2 s$ I7 z/ l8 v* G                         检测库是否存在,若不存在则创建,若存在则直接插入,$ q% ?; K# \* d3 E! v
                             检测表是否存在,若不存在则创建,若存在则直接插入
    0 y( r5 T% e, G, J% W: o:return True+ j$ R" b! f7 P2 w+ @
    '''
    0 X2 Z5 x8 {* u- t& R介绍玩法
    ) V6 i5 ^+ K5 O# I+ y接下来介绍的均为调用第三方库的情况下运行:  s" t/ ^- h, ?. x" R1 A

    6 X0 d- C. |" B9 _from simple_crawl import request
    : l/ b! q- A5 j2 w第一种玩法:输出源代码
    $ X, H) m# y2 r9 G+ ]5 H4 C调用requests库进行源代码请求。: k+ v: w: g8 A. j: L# G+ `
    7 _9 C1 I! I* z% O
    特点:- k. V; |' W) {+ M( a6 o
    请求失败则调用ip池处理重新请求访问,; M% e3 r3 O) i2 |' a1 \8 l
    出现五次失败默认网址输入错误。
    ' C3 m9 s0 k. q1 q- m% `4 V支持text以及json字符串返回。默认text。2 k) e; ~4 D- ^/ ~- D& w# f" V* y) }

      i& J' B! l9 t& v缺点:
    / ], C# |& z  Z% b7 N/ x5 s+ Z暂时只能进行get请求,不支持post访问1 b' H) I* r7 N4 G# j
    " z6 A0 m! [+ D/ g  ]  g
    :return text or json/ a4 @; L6 F/ S1 _% w  w

    8 e% [1 I9 h# w1 brequest.parse(
    3 T' r3 [, l% w. H( [        url = "https://www.douban.com/group/explore",
    $ K2 H; |1 L5 B- `        type_url = "text"5 ~# D! C  b/ a, _+ U  Y4 g4 \
    ).run()
    % j; l5 V' K2 _# return text
      C; f$ h, }& e( r& D6 p7 x; ^2 Y. Q& k8 V3 z) k
    第二种玩法:模拟网站登陆并保存信息
    0 P# J2 p. m! C  T% c( ^8 m$ B调用DecryptLogin库请求登陆访问。
    ( B  O7 j; C) [/ a
    " u$ J/ X' ^7 m  Nps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源4 q5 v9 c& b3 E, v$ F! {
    在此放出文档地址+ O6 P+ U7 B) m4 K# u# [$ I' L5 F
    DecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/
    + t+ H- k3 y3 r6 P
    $ m5 q8 K+ Q2 W( X) A特点:
    / O2 |+ G" I1 d, K将DecryptLogin库中二维码继承到此库(非二次开发)
    " P2 \( |1 u3 @$ F支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆)# A. |4 S& ?3 Q( K* D
    保存session.pkl信息到本地方便下次登陆运行% G- O( b& u) p1 o& t* e& @* M

    5 V5 a9 l8 ^6 |2 e: q缺点:
    : F2 n4 `: ~  \9 l( ?7 [' Ksession.pkl登陆信息过时无法自动删除。
    2 @" p' r/ L9 f9 F导致下次登陆疑似cookie无法正常登陆。5 q( Q6 B" \* ]* c- c

    5 T7 Z# p) N) g& E+ o:return session9 K8 u. ~- Q. ]
    % u1 c, n! m( u5 w3 D$ R" R; [
    request.parse(
    & ], C' X1 ]' j1 r: R- j* j' X        # 臭不要脸的推广一下我的店铺. y+ c- k- ~# }! |1 O
            url="https://shop574805287.taobao.com/",; K7 H4 L9 |, B7 j/ ~& h
            login="taobao"
    4 ~2 ^! d4 g/ q5 H3 x1 C- O).run()
    & {; }0 D+ D6 E! v' l* I# return text/ p+ @* Y$ q" K1 s4 \, Q4 `
    ) D3 J4 e$ o, E2 w
    第三种玩法:爬取网站信息
    . X" E% I# d0 i爬虫库自然少不了爬虫的过程
    & `" D6 |. i( a7 ?! o5 B
    & W! Y8 b) g( {; h1 I特点:
    3 j/ W4 q" q2 x' a; K/ o3 a支持re库,xpath解析以及bs4选择器。
    # f/ z: A! p3 F. u7 Q  c爬取方法为字典格式。单方面输出。
    # W/ ?5 j! ~0 T7 O% C+ ~字典键为保存的字段名称。# v+ k' M* K; T: n6 b# G
    字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。- _% Z$ U9 P$ Q& q% L

    ; d" [& y! g' U/ g缺点:暂无(等待小伙伴们发现)7 C) Y8 p3 N6 l% M

    1 x6 s9 n. ^' @:return reptile_results
    9 E! `2 f! P5 F! o* ]
    + l0 J# b2 t2 g7 srequest.parse(2 v+ S5 w/ _4 V8 F$ f9 ~
            url='https://www.douban.com/group/explore',4 W/ k% c& f4 U
            # 字符串格式,选择器方法。
    1 }8 X8 I4 v+ Q    Parsing = 'xpath',
    ' X+ f4 N2 `& R: ?8 \- x" t- B8 Z    # 字典格式,参数如上。% g5 q3 b% a3 p
        label = {. C. Q7 m0 n# W
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],) M0 c: w4 Z' H3 x
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],- }& k) L- F) X+ |( ]% C  ]+ v
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    1 x: A- ~5 _7 S4 h9 W8 W/ z# u% Z- y        }
    , ]* J/ W! f/ G" N* C" Z# I).run()0 V: x  ]; D9 }; {
    # return reptile_results(list)
    $ o! H3 E3 U" r0 r* \2 S! ?
    - i1 ~* i# k+ G0 \3 S第四种玩法:自由保存信息2 h/ M% G3 |. ]0 V3 r, e
    目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。
    1 s0 E# I9 M0 H2 ?3 S/ o7 A
    7 _+ c! `$ D8 e7 C2 F; B2 X. Y特点:
    % X4 `3 ]' r- ~1 d& m& ?, k5 u写入文件均为数据格式传入文件。
    ; v$ k9 G3 O! `+ n) b0 Q$ c* N% X9 N且输入格式规范方便阅读and省事。
    6 C, ~( e5 B% x2 R8 Y" j( I* ^$ J  Y; t& l( N
    缺点:9 m, F9 N3 \1 y: Z1 }& L
    保存格式仅四种,% J* h$ Q% ]7 ?4 U' g" _( F7 X0 r
    不方便用户之后读写操作。
    + I, Z; `. ~  ]* ?% o; O# T/ {
    5 ?; m+ y* P% D5 g9 G0 N+ X" T:return file
    & R' Y+ p: l( K* }& w
    & B' u5 b' T0 R. J. {0 R$ Q, prequest.parse(
      a, s" B# x" [. V5 x8 @% u        url='https://www.douban.com/group/explore',
    ' H- a  [! S' J3 V) m5 L' J$ i    Parsing = 'xpath',+ G/ R, G  I1 d/ F& H, E* C- V
        label = {
    3 T  l6 e/ x9 _9 E* ?6 _        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],* h3 a) h( V7 U5 E& q5 w8 K. _
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    . s, p7 o* a! U        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]4 f! Y& P; ]( K
            },% U1 {5 S" t/ G1 k
        # 字符串格式,具体保存位置填写
    ' h+ X7 N4 W. \8 f2 |    write='result.pkl': g) X. q3 p- \0 u# B. Y0 t! u+ _
    ).run()
    : I7 g. p. c. `( H# return file4 u/ v  I5 |. J- M/ H# I1 c
    ! c+ k3 D5 t; o
    第五种玩法:读取下一页 url 地址继续爬虫
    6 i8 j/ N$ {  j" D这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~! A2 s! {* M4 p! D8 ~- t$ e/ Z
    3 Q* m) d2 {& n% q
    特点:3 H" x' x* g. m, Z* e# Y$ Q
    继承之前的Parsing参数选择器选择方法。
    . S! ?' C# p9 g3 z" _3 ^在这里可读取到解析后的下一页 url 网址。
    ) n" H, C% u6 x9 a$ e) {6 x0 Q方可继续进行爬虫处理。方便用户使用。
    2 w/ [( c) ~4 u9 l, v3 [& m( S/ y1 ?1 d- K% C3 H. Q  h
    缺点:# M  s- t+ s3 f$ P' X
    若爬虫时下一页 url 地址改变,便结束爬虫。
    2 ~, n( V4 }/ u- O+ U0 j只能爬取所给 url 地址中的信息。
    $ e% b+ b4 L* F5 [) s6 Z2 c无法进行某一界面的多个网页爬取返回。
    8 w0 T& `. g2 o2 Q; K8 x造成访问页面单一流失。# }2 n8 x  J: Z8 ]- C* Q

    2 c( K, s% @$ W:return None; ]7 t8 l3 [- i& M* o4 o

    * Z; V; c# h2 c1 T2 Qrequest.parse($ j$ B+ T: j' S
            url='https://www.douban.com/group/explore',
      y9 x6 W& F9 T6 k2 `    Parsing = 'xpath',
    2 y2 ]& K5 w% ^* |    label = {- c& H) L  s1 V
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],' l1 Z& B, ~2 f! M9 o- W
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],0 J" f" L- @4 q4 k
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    5 V2 Q# p/ U7 y1 ?9 R* }4 A# V% T        },0 z& O( `/ x& c$ d# ~
        write='result.pkl',
    + h3 |9 j# C6 }: L& t/ Q    # 字符串格式,根据Parsing方法继续请求下一页a中href
    2 O  m+ K! A4 l' z) x! K. C* x/ Y    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',1 N" P0 z3 B! G' c! N
    ).run()# q; }. a5 d. U; @2 ^
    # return None
    8 }' v% P. ]8 a( Q. H% _" s
    , q6 F2 Q! D# ]- h2 j8 a& ^第六种玩法:爬虫网页保存
    + f" J: ~) K$ x! o8 X9 O听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!) Y; I" Y  T: L. H" \+ o
    # w% a$ c9 {1 f
    特点:/ c5 V5 {7 `! }2 J
    持续输出断续笔记。
    ; Z  `- X4 [5 Z4 Y3 Q将此次爬虫的 url 地址保存到一个文本文档内部。
    + D1 t  \2 A" D* ^' q8 h0 N1 Z% p下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。/ X% `, h+ V3 F8 o
    0 a. \" N% Z0 ~) Q* d- J$ `
    缺点:0 {0 ^; A7 }7 W6 q0 i; }( ^
    读取内容不单一。
    9 t* R4 {1 `$ s4 k# n5 u导致下次爬虫无法正确读取上次爬虫留下的痕迹。
    . l0 i8 h/ Y) N2 P' w! r  p! J6 E* X# m  x$ _
    :return url_file
    ) q  A' @1 S! t. W- a) t
    $ V- f7 C; ^/ V/ Drequest.parse(
    # ]- g8 |" o7 I' W5 ^& H5 I    url='https://www.douban.com/group/explore',0 z2 `8 M% e! h% K
        type_url='text',
    3 ?: e. h! b: O/ Z! o    #login='taobao',0 ?$ ~5 Z% g. ~  P
        Parsing = 'xpath',( l& W7 ]( E! L
        label = {' H* F2 A/ t6 E3 k
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],2 k9 g6 n7 i# o# w% N9 _; e
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],$ y) l, G4 ?- c( Y7 q* q8 [/ \
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    - i" A! ]  k3 n: k. v2 X7 m; a2 R        },9 s* |' H5 z7 n
        write='result.pkl',8 R& o9 g+ q$ D# I; _( s
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',. a1 I1 K/ s' W1 }( z8 _9 w
        # 第一个参数为是否需要断续笔记。
    " r( b, w# @' ^- @, m    # 第二个参数为断续笔记保存位置。
    ; _. m. {" F( e( |2 b6 ~; b4 a* M    page=[True,'url_page.txt']2 W) y5 P( Q6 ]
    ).run()
    , u8 P1 {9 x) c6 s  t# return url_file
    # a8 u, h) d' I1 v& k  W& E, L) U) H  o: V/ k# ]. y
    第七种玩法:简单数据清洗( Z- e% z& H: B9 b7 O7 o2 j
    数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。# J; D' R- A0 k+ F" _, q" R
    5 M# V) S7 j+ j( w$ Z+ i8 R) @
    特点:) W; j, ]/ S; r. W9 }6 m3 m
    本人曾写过一个底层数据清洗。* y: G5 Z- y/ Z* }+ J
    能将列表格式数据进行归分清洗。3 L4 h6 u! }' A3 R% G+ A
    主要内容请参考另一篇文章
    5 E) W; T! O/ E; O+ V如下连接:数据清洗- N* p! l% F6 ]4 ]
    1 h) M! C4 x8 _8 C- c
    缺点:% Z! S' F! n) a7 U3 k
    数据清洗格式简单。4 n- c1 [. ?  s1 p0 N+ e! u7 X
    数据清洗内容单一。
    ' C  f. b+ u4 J8 i无法完全做到绝对清洗。
    3 o9 w) I; }3 n5 Y# y$ S% m9 c有待改善。
    & V  ]2 f* e' l# M5 `3 i
    ) m* ?1 A  g1 R+ {* m, a) \:return keyword_list, value_list% j' ], P6 t$ ?! l& @$ I

    9 q% T0 k8 R+ X2 s- Rrequest.parse($ ~/ L9 |  E4 e, {
        url='https://www.douban.com/group/explore',
    " j, L, K7 ~: `' ~    Parsing = 'xpath',' r) E- ?9 \* d7 K2 J% O
        label = {7 n9 m1 {3 `" n3 g% H" f
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],9 w" B/ g& y* h
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    8 u: W* P6 O; \6 J7 c3 _/ l6 f1 A        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]6 H6 @! ?9 |( U( v7 ]
            },
    7 g! r. n/ g& S7 Z    write='result.pkl',
    4 Y, c3 B! u; [0 R$ y2 X. S    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',  t/ @) d( T' h$ k" U- u8 E$ ^0 H1 r
        page=[True,'url_page.txt'],
    " G8 B- L1 v2 N0 E' k, N4 h, k$ ~    # bool类型,默认不清洗
    ) Y2 v6 f/ y1 ~8 ~2 `* g" p    clean=True4 m1 a/ r. `- H4 y- n% a2 A# V
    ).run()3 V. w+ R0 K# H

    7 f" i' _8 I6 k( M, j第八种玩法:爬虫存入数据库
    1 I/ I9 q5 b3 J7 W  l存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。
    5 [. h9 }0 |7 K  c% W6 C- ?* U% X' d& g8 U
    特点:5 C  ^7 f5 v" n1 _
    信息存入MySQL数据库。. `5 R, B: c0 B  d8 m5 a
    可连接docker远程数据库。3 l# _  f- d# a4 ~( l1 }# A& v
    数据库的库名可以不存在。! g) {( Z! V0 [  I7 i8 m2 n
    数据库的表名可以不存在。
    7 ]7 i$ A/ y8 L5 i2 b/ `6 t9 r根据之前传入字典键与值参数判断表类型。+ Z& j$ Y1 I/ b% z7 t' Q
    自由建立数据表传入信息。
    . }9 x% p" v. \; h6 K7 n2 [4 Y. p
    缺点:6 t% d" z& P* x7 A
    仅支持MySQL数据库。
    7 t# u1 U: L! T" Q* c/ H. z- N3 k
    4 n6 R8 C! Z& n7 I:return SQL
    # i% y+ P$ b/ i7 m( i7 L4 F5 E" k( A0 E
    request.parse(7 W, m, Y1 v4 ]; b4 P) u) ?  k9 B' a
        url='https://www.douban.com/group/explore',
    $ w3 @: W' }6 m' L% b* F# G$ o    Parsing = 'xpath',) [% ?* U2 ^6 V
        label = {
      Z3 l5 D. N8 A0 \) W        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    * @3 b& m7 T  S2 n        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],+ k0 v9 [# m8 J2 \; Z6 I! S3 z
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]# M5 u& z1 k5 u( W' N
            },( x$ u6 w, [7 _7 U3 d' L6 T- `1 A. N
        write='result.pkl',, ]) `+ ~* i9 d7 _6 z
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',0 u/ f/ ^2 @; R) r& e! l; |
        page=[True,'url_page.txt'],) s, Z  I7 [' L
        clean=True,
    0 l* B$ l3 c/ l! ]: |' ^5 m  T    # 字典格式,
    1 A7 w0 J3 `% E/ M4 Q8 q    # host可有可无,默认localhost
    & }+ a4 t% d; P9 \    # post可有可无,默认3306
    % K' b9 Z- |+ J8 d    # user可有可无,默认root! m% ~- {" _  B- U5 U
        # password必要参数,数据库连接密码: S; W" G! B" q5 s8 c8 T
        # db必要参数,数据库即将存入的库名
    / [5 }: `5 O7 T- w    # table必要参数,数据库即将存入的表名
    - O4 ~) b8 e5 a( U, @    write_SQL={) T; x0 m9 O7 }) D0 D! T
            'host':'localhost',
    ) t- w0 ^8 i* r  A, s+ g" X: J        'post':'3306',
    6 D5 D7 ~% x0 |+ @" [$ ?        'user':'root',
    : S  p" D  v0 R, y, J1 @! u        'password':'123456',5 Z/ c- D* B0 V' u
            'db':'example',
    1 t# ]2 C6 ~( z' D& t' u        'table':'example'7 o- `3 v6 ~5 N/ x" J7 f
            }
    , U0 H8 P+ s! R0 m( K    ).run()
    9 H6 B# r5 _: U  U$ R+ y' f/ U: v) P; Q9 _  ?" w* o0 c  i
    第九种玩法:重新启动爬虫$ H/ V8 D/ _- `9 j7 b
    爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。5 y& T5 _  v1 w% X! v2 U# u
    * j+ [0 j* r" @! `4 Q
    特点:
    7 z% f$ t/ I/ }检测报错重新启动爬虫
    / I) F% \9 w9 n' {. A无需手动处理错误信息' R4 D/ R8 U% z8 `: p
    $ X- X- {+ B7 J3 _- I* W
    缺点:* C, b9 K$ D- D& L  R$ E# d; R! u
    无法收集子线程错误。
    / z" ^% S6 [0 c/ \* N6 v
      `, I! o) n3 b) c$ ~5 h2 e:return None
    & R- ?: ?: G- v4 M/ w2 [2 E' i! r" _
    request.parse(
    7 G8 X, |3 x% Q9 O        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],3 q! E% p5 F0 V
            #login="taobao",
    # x' q% ^% L! m6 }. p" T; o        type_url = "text"," F$ \7 `3 K9 R5 n/ m! \
            Parsing = 'xpath',
    ' {- W8 \" k; y( @+ J0 q4 P        label = {
    ! o! y9 V, O! q$ L' i9 Q! R            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],+ R3 v$ r2 s( s! j7 P5 S
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],1 \; H; p* L5 f( z1 t9 N
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    " W4 x6 j. j; z/ O" D5 Y            },
    9 L  J  R! `6 u' \& f8 G0 n, B        write='result.txt',* K, t7 y! C# a1 ]$ [: B
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',# i2 \; G# L9 }/ ]7 L
            page=[True,"now_url.txt"],
    / o! O& w" J. r+ J1 t        # texting 参数为是否启用连续爬虫
    ) U2 X) I" J0 ]" o        # 爬虫程序异常报错后重新启动爬虫
    + H5 p0 A! R% L        texting=True,
    9 p7 K3 T4 G( \        ###1 b5 @3 D7 b# D4 A8 F8 P- o
            write_SQL={
    9 r( O& G; q. \& ^0 Z+ o' R) a            'host':'localhost',& Z8 P9 L8 H  a( u
                'post':'3306',
    - J+ T1 i  y  ?- ]! K            'user':'root',
    ( E9 _4 t7 `; w. r; e+ |* t, S9 [            'password':'123456',
    ) S0 w) @+ j9 w7 R; n% t( {            'db':'example',
    ' t8 N0 O4 H) B: G            'table':'example'% J1 }  h9 p; @& t3 [$ E
                }
    . u5 @- f4 ]* L5 L. Z0 @+ G+ l6 o; ^).run()
    & ]+ K# T% Q3 S/ t, r; K8 c7 K# {& C' ]  Z' K% T
    第十种玩法:多线程爬虫4 i6 Y( Y; k( v5 q- e1 d6 d( H9 ]/ B7 I
    特点:' v4 h. g: j2 ^+ _) A
    爬虫速度加快,
    / E' ]- Y. \- J, x$ _- j% [更好的利用了线程。+ f! E/ v8 U& r8 a

    & e% l8 e( e9 ^* A* Z5 f' x缺点:暂无& Z1 A+ n3 p4 f% X$ K
    8 Z1 q5 S" }# f' ^$ h6 o( D! z
    :return None& ~: D1 w" o: k: z$ z: [
    6 a9 L+ F7 a0 b9 j
    request.parse(1 A1 q2 a0 J4 l: w3 x
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    ! ]/ w4 l1 T4 m( Q1 J        #login="taobao",
    ! }  I1 Q1 Q" N; k        type_url = "text",
    , g& G' P  z% {2 Y& W* W2 L# J        Parsing = 'xpath',' s6 c, i9 ?% D2 |) _  H
            label = {
    - K/ Y  L( i; d5 J2 Y& P            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],. d9 k5 ~. e( Q8 ?7 l  N( E/ j- U
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],* [/ ~! q" n  V' ], t1 c
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]$ b, z5 _4 l. c
                },* f9 ~) N+ D8 M4 C; z! M% w
            write='result.txt',
    8 J7 ~$ `% f8 E: e& k        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',# [2 U" Q  f5 D% J9 Y
            page=[True,"now_url.txt"],0 [6 ?) I( d- b! ~7 `# E# m
            #clean=True,
    3 `5 c6 x! O! H7 ~5 Q8 k; c        texting=True,
    & f4 D. r% b2 Z( B/ j( X        # status="threads" 启用多线程爬虫
      N. m( X1 C9 L$ m        # Thread_num 为线程数目,默认为1 单线程
    2 S; @3 D$ `& O7 X* ?        status="threads",- V- V) ]: {8 c1 [* Q
            Thread_num=3,& a( A9 K$ _, g5 G
            ###
    7 z! ^; j9 C0 T& U        write_SQL={! A/ m- K3 i! f" W+ ~9 O) ?/ f
                'host':'localhost',
    # J) q' [5 G2 ?            'post':'3306',0 [2 P/ P! ?3 M% u
                'user':'root',+ |' d7 }3 |: m  ]& g
                'password':'123456',
    : d6 m/ M) f* t- [            'db':'example',1 N1 i9 k2 n5 c5 A' ?( m6 O8 t0 l" H
                'table':'example'
    1 F/ p3 t# U; f. G; m: ~            }- D. z1 }6 B- b& `/ @
    ).run()
    ; X  ]$ X# D8 K6 o
    . f; Z: i1 }5 r( Z+ P第十一种玩法:多进程爬虫
    + V2 |" c% L8 x- ]( D6 B$ V- a特点:
    9 s# `! x/ P4 k- x+ F% I" a, `爬虫速度加快,9 i' A$ f& p) X* j! p7 i9 e# v6 o& z
    更好的利用了进程。
    % {4 x( C5 V; k  s4 p5 c6 K% Q* l3 d& p
    缺点:暂无+ W4 G5 {" g/ \/ w# r
    . W$ _+ V9 X7 J3 `7 [5 s' g
    :return None
    / ]4 o- Q. c# u
    ( }0 T0 N! d: z4 M  `from simple_crawl import request( |$ h* Q( i, r+ d8 z
    request.parse(, w% `) O9 B+ _4 t  n
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    - v4 r- k  E8 m  h4 z( ^        #login="taobao",! p' m. T: S" h2 j& g" H' T: H
            type_url = "text",
    + }9 T" I* V# ~" A9 R        Parsing = 'xpath',
    1 U: u! `' M- H) j        label = {6 z5 T1 h7 G8 k# A8 f% {% O* G
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    0 d& f5 x' n. E* p            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    . r+ [( \* a0 o% @* v$ ?. S            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    - B; v8 K; {* L$ {6 E- Y0 H            },
    3 _) o8 p" ^4 ]0 V+ p        write='result.txt',4 }7 k& b1 {2 P3 Z4 L
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',  N. [* l+ Z9 \" b
            page=[True,"now_url.txt"],
    6 b: Q2 a- T. E) m" B  n0 Y4 ?. ?$ |        #clean=True,- |4 @2 h% E7 S' T- [/ \
            texting=True,
    2 u/ {" v7 ^; s% E8 h/ g- y  n' J        # status="multiprocessing" 启用多进程爬虫
    " Q0 T) j3 ?1 y$ L5 c        # cpu_count 为启动代码核心数,默认为系统核数一半
    : P! x; w+ |+ `% U% H$ L5 t5 S4 F        status="multiprocessing",
    % P5 h" B& w5 m& s        cpu_count=2,2 `) a$ {6 e& W/ e' }9 A  c; |
            ###& ~" H/ H, s4 b# R( \! C( H/ j
            write_SQL={
    7 x, I/ S- a: _8 C. q+ v            'host':'localhost',5 M2 u9 y, p$ A9 V8 ?/ D
                'post':'3306',1 |9 h% Q( T2 l$ Y# \( R( F/ L
                'user':'root',* n) g9 n$ U+ f4 x
                'password':'123456',
    , z1 y4 x7 p8 u" p; y            'db':'example',7 d3 G8 T. o& k8 [3 ]& D! Q
                'table':'example'$ S/ e4 i. p( _: }( \0 a
                }5 Y/ c% [9 s. m$ z, e
    ).run()! Z- H* T& L+ a  ~* a  v

    3 o4 C* H* |9 _第十二种玩法:异步多线程爬虫, l4 L: S; m' j) U) C! H9 Y/ i
    特点:
    ' X. Z' X  {8 Y0 r9 h  m7 k" e) B+ E爬虫速度加快,
    6 d  m+ o; p! e, o) I异步使得爬虫无等待时间,
    * R( O, O, u4 a( b9 K; S& G4 V同时使用多线程速度明显加快。) A" R' C) @, D
    , E/ n" d( n5 G5 |
    缺点:暂无6 f9 N' z$ X) {( Z; H# t
    ) O# w/ {! X( b% x9 l
    :return None- s1 Y* V6 s( ?8 f5 Q3 h

    & A6 l9 Z2 @9 N7 L9 |+ c: Ffrom simple_crawl import request
    - U3 G; h* w9 Vrequest.parse(
    - l7 K6 @( O0 t# q4 Z2 C- N        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],+ _9 S9 f6 x; A# h
            #login="taobao",
    ! e* n# m$ D5 r  u9 [        type_url = "text",! \3 W3 F: I: e) R' E, I. Q
            Parsing = 'xpath',
    " ^2 }# n0 P( I        label = {
    / N( U$ U, q5 X  X: y            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],0 T1 ?7 V+ J7 I0 ^" X
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],5 x$ O* H4 H+ Z9 b# N+ Z% @% H
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]6 N( x! N3 J. v, l. Y) f( ?. T
                },. l2 A8 w3 n! ]9 j' y$ f/ M' Y) p, \
            write='result.txt',
    % r7 a. F/ b0 r7 ]. m) |        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    & J1 _2 \( c/ z        page=[True,"now_url.txt"],. \" i, N) M( `* B# V
            #clean=True,4 j! a- Q  |( o) _7 {( \# [5 a
            texting=True,2 s- C3 r% x$ X) D
            # sem 参数为异步引擎数目,默认为5
    $ F" l: u; x+ N2 J8 s        # 其他参数同上
    , w: w. f5 w! \; X! }        status="aiohttp",
    ) H/ D9 l5 B' Q        Thread_num=3,
    0 l: |4 ]) G8 H# b        sem=5,# j9 c. g! t( ?: v! }
            ###
    % U( D, x2 G6 J" O. {5 X) x        write_SQL={
    2 J( N& U( c( V9 I% h! H6 v& V            'host':'localhost',, b+ N8 K% }1 s5 t1 f
                'post':'3306',# ^0 o: H, G/ L0 b- l8 e3 [
                'user':'root',  @* d+ |/ z2 T9 h  g4 V: j4 Q
                'password':'123456',
    . P, g9 s- I$ t            'db':'example',8 Y) @1 }) x3 |9 g/ ?; {2 m
                'table':'example'
    8 k4 M0 Z) n% f$ k1 w& ]            }7 m- h; ]. Q  ], b2 U5 k/ o
    ).run()
    ( I( ~, Q  s( m! @" u
    + I6 @8 o6 |4 C第十三种玩法:异步多进程爬虫
    - _* }) t8 b/ C特点:9 m' u' {5 z( r6 m4 r$ ?$ R# [
    爬虫速度加快,
    7 V# g* K7 p8 ~& U9 G异步使得爬虫无等待时间,# q/ q: ]5 v- g$ ^$ U
    同时使用多进程速度明显加快。
    & f4 y/ F' N$ }. ]- ^4 p2 [! F3 i  |$ C+ j6 t! j0 {
    缺点:暂无7 F9 L8 x2 C2 _, M3 s! N

    3 o' Y/ m( @" c$ @:return None
    / x: r; o+ J7 x, B  \8 I: N# w! l9 B5 ]5 h. l$ P3 [
    from simple_crawl import request
    0 {9 e8 d. ?/ F  _% Brequest.parse(
    9 e2 W8 J8 X% K( ~8 k& O        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    ( ~( J" D( y5 r" K: |- t/ S4 h        #login="taobao",
    : z% K2 x% M# y: a        type_url = "text",
    7 t1 {1 @9 X& I        Parsing = 'xpath',
    $ \2 E3 z3 f( \% E5 ~" b" D+ J        label = {& B' {8 M* B  {+ G  @# N. w
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    2 G. k2 C, N1 k- r' _, k! C# ~- @            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    7 {# _( |" U; e1 L6 z! U            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]7 Y4 M: o  H9 \7 t. h
                },
    # ?, S" Q- W- ]        write='result.txt',
    & G& e5 l  x: t% m% O2 s        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',4 \0 }( k2 W2 ^4 _" f
            page=[True,"now_url.txt"],
    ( B7 ~" n: Z* j2 ~, s        #clean=True,, i2 S% Z+ x9 F; ?* M7 N, f
            texting=True,# G8 c: }6 b- i& ?; x- b" `2 i
            # 参数如上
    $ y3 a3 f: u/ ?4 }) H& G0 ?  b) F        status="between",
    : T& k) X9 A, X        cpu_count=1,' _- ]. N4 v5 \- U- D
            sem=5,% u+ m" C6 I7 ~
            ###
    2 M. K* J5 y: X4 H        write_SQL={1 T& l' c; ~4 u* Y: d
                'host':'localhost',
    ( p; E: L1 M$ p+ i+ M            'post':'3306'," ]3 ]- ~( y* e, B8 Y
                'user':'root',; a9 }! [' T1 s
                'password':'123456',
    * D: F1 R1 q0 k2 @! w- N* I7 j            'db':'example',5 k6 s4 w1 r$ x% v0 [
                'table':'example'
    1 h& n/ ?5 \6 [) R2 X/ J            }
    4 v0 Y% q3 X) k3 M1 m1 K).run()
    7 V; I3 T) S* m) d9 H4 K! V* q, _* H/ m
    3 g. H# y, h( u2 }
    功能介绍完毕🤞& ^/ H8 w2 j; D
    最后还是希望你们能给我点一波小小的关注。9 o: U" @1 N1 S/ f
    奉上自己诚挚的爱心💖  p# S' `2 v$ F. r2 \7 K
    ————————————————  g3 j2 U9 |' m
    版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。% I% ~0 [- P6 h; o" d
    原文链接:https://blog.csdn.net/qq_45414559/article/details/1060056846 v. d7 @) C" z& H4 M7 N6 O5 ^7 W  S

    5 m9 B, l5 D3 ~, G3 d6 C( |9 {2 z, Q
    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:31 , Processed in 0.232978 second(s), 55 queries .

    回顶部