QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5417|回复: 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% e) p2 Y- F* O. G  S
    simple_crawl
    + L7 E4 E: K. Y1 E仅需一行代码即可达到爬虫效果
    7 o# m" M+ b4 Z  L! }! ?项目地址(欢迎star):https://github.com/Amiee-well/crawl
    7 z9 x# }, C$ o: _7 N% L使用方法
    ( u& N' b+ M$ ~  N5 G0 Mpip install simple_crawl2 O* o- b8 W  u9 E# ]
    ; C: U8 Q3 B) }" Q- ]& y' H
    ### 以下源代码为简单介绍,详细功能介绍再源代码之下9 h2 X1 s- b/ ]5 |8 r
    from simple_crawl import request* y/ \7 u& D) i' X
    request.parse(
    ! ~4 y9 M- S' O4 [        # status 参数为运行状态,支持单线程多线程多进程协程以及联合: k5 A2 F5 [) u: R+ X
            status="aiohttp",  D( e. l2 I1 v- ^0 q( L; \& P  [
            # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式
    0 c6 t. ^/ D/ r7 j6 `        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)]," P7 K( A! m1 ~: f7 V
            # login 参数为获取登陆信息,如淘宝等网址需要登陆信息
    2 n5 B* E% P* @) m2 C2 m1 A' B    #login="taobao",4 I7 U6 L& Y" a8 R
        # type_url 参数为返回源代码格式,支持text和json,默认返回text' j5 k$ l8 ^5 m5 o. g
        type_url = "text",
    - L% z5 b( _% V7 y    # Parsing 参数为解析方法,支持re、xpath和beautifulsoup& F, `3 N& I5 @0 m3 Z2 Z. ~
        Parsing = 'xpath'," E# Q) l: @" [/ g+ X7 Q
        # label 参数为爬虫解析过程,字典格式,详情见下方
    4 T9 `/ I, A8 H) i& U! S# `    label = {
    4 K3 x& y1 j0 G, ^            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],/ f9 B6 f9 o8 _- U8 a) C- j
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],( v  i- ^/ |. B2 I9 ?# z  n" V
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    * ?4 j# e' R6 P0 O2 K     },# k1 I" }1 p5 k$ W; ?. x
         # write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱2 D, q' P- S2 F+ P& Z
         write='result.txt',- }. o( {: w, Y& {
         # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫
    , Z3 g6 ]7 }, S0 H) y     next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',% B5 Y% M) F5 O% G, S' P" F( q  j
         # page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫
    + M- ~9 W$ c4 C( r$ D$ c, v) W     page=[True,"now_url.txt"],
    : l5 E) h* [3 f  o4 X6 T1 c     # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息% |; @: q& [3 w9 i- Q) v
         #clean=True,
    1 W0 N2 d% s& k5 f$ h     # texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序
    4 q# u  D3 P6 J0 j9 z     texting=True,( m" {' e$ b  U
         # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态
    8 o7 F: e5 V/ u% V  n7 f7 m3 l9 A     Thread_num=3,8 U6 N' l) h5 }# m+ {" R5 v9 d
         # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态$ v/ h" z( p6 C( ~4 s4 X
         cpu_count=1,! O6 p5 X' o+ T& G+ _4 o
         # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态2 b$ J3 g, O" D' x6 T" f( m: g6 N! [
         sem=5,% K0 [- h: H: i4 W( x
         # write_SQL 为是否写入数据库,默认否( h7 Z; u- t6 v( A$ f6 O, H
         # host 参数默认localhost" _' v) m; }5 c0 ]: i, R1 I
         # post 参数默认3306( [! ]! N; g+ |1 c
         # user 参数默认root" z1 O; Q( a7 \
         # password 参数必填,必须正确# g1 o- {: X1 b7 F* h, D* T
         # db 参数为即将存入的数据库名,若不存在自动创建
    & h) _$ h) h" j* a) P) {     # table 参数为即将存入的数据表名,若不存在自动创建
    4 ?% B- X1 q* t+ J- F     write_SQL={
    ) z8 {6 a; u4 ?9 B8 G         'host':'localhost',8 H$ T' t. O. b2 @5 R  ^. O& ]6 N
             'post':'3306',3 a' ^0 @+ i9 y* d
             'user':'root',
    % X9 P3 T3 l5 I% O1 l" H0 D         'password':'123456',, `6 R0 J/ Z2 _# k1 k/ ?
             'db':'example',
    4 x" {9 z7 I* ~) B1 Z         'table':'example'% U( W0 b, Z( u/ c& {0 |
          }
    2 ~) W, o% z7 p% _1 d" @4 D+ y6 [).run(); Y* U4 Q; w$ O0 P9 v  }- Q; v

    7 l; v( A1 w: }介绍一下crawl参数设置:
    % F4 H  Q' \! j# C  a, ^, [/ Y, P
    '''7 Z1 r" v' J4 ?7 z
    单行代码爬虫程序执行9 `5 s- c9 R9 j, x/ R
    :param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档7 n5 Y( W+ x* F: O" g
    :param url:即将请求的url地址,仅支持get请求
    3 y7 [2 K( r) X$ k, j( d$ \:param type_url:请求url后返回格式,支持text和json格式返回& C9 }" B( O2 t; c, |( E9 [* ~
    :param Thread_num:即将启动多线程个数,默认为1单线程3 d& p' w0 J  N; o- p: g% c
    :param sem:协程信号量,控制协程数,防止爬的过快,默认为5
    ! H5 o: n/ h( Y; I:param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半
    1 x+ G; y5 u6 X:param login:模拟网站登陆,保存登陆信息
    1 G1 a9 L7 T: q; S" q:param Parsing:爬虫方式,支持re、xpath以及bs4方法
    0 [" o6 g; T- _# f2 o, X+ X:param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,
    , W) @* \9 t. b5 n/ W6 w2 v+ H  \                       多次报错结束程序,默认否6 ^# v) i8 z) C% b/ r7 \0 n
    :param label:选择器内容,字典格式保存,
    : T& \) [& N9 C                     字典值为列表格式,第一个参数为选择器,第二个参数为转换类型
    8 Y  ]7 D1 Q1 q! Q, l7 i                     第一个参数必填,第二个参数默认str类型$ M- r( x# N; Z8 ~) a
    :param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否4 W2 |' ?8 m3 u9 |" i" K3 N
    :param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫
    ) |; b$ F& l  |& K:param page:是否选择断续笔记接手下次爬虫处理,默认否$ g0 w- L  ?4 m, j6 L9 w! f
    :param clean:是否进行简单类型数据清洗,默认否' m1 K' u6 m4 R' r+ t0 a2 Y
    :param write_sql:是否写入数据库,默认否
    ' b8 L. c6 i( E$ f                         'host'默认为'localhost','post'默认'3306','user'默认'root',
    # q3 Z" L+ [0 U                         'password':'密码','db':'数据库','table':'数据表',& A& e2 _4 [3 `3 g8 L
                             检测库是否存在,若不存在则创建,若存在则直接插入,, V, \) M4 l9 H- k& ]6 e; o; K
                             检测表是否存在,若不存在则创建,若存在则直接插入+ h1 s1 }  c! Y  a" _
    :return True
    * ~  ~+ a2 Z# ^'''* P% D" v  A5 l  K
    介绍玩法3 Y% V1 d. o/ e- s  R1 S
    接下来介绍的均为调用第三方库的情况下运行:/ e/ o, @  n, f/ j

    8 H: M# k. M0 @( d# Dfrom simple_crawl import request4 @7 f4 ^" `7 I6 y
    第一种玩法:输出源代码
    4 `  |" t# B* P; p- X7 W  l, r调用requests库进行源代码请求。
    4 }' i) d) X+ o& N5 l8 B
    ; H% r( ^$ U/ l9 s# g特点:
    & P; p& T7 E) x3 H) U9 _7 y6 w2 o请求失败则调用ip池处理重新请求访问,
    6 w) s  G& f& y' u6 ?出现五次失败默认网址输入错误。' }: m3 L/ R3 |3 G6 |
    支持text以及json字符串返回。默认text。
    : r. z5 V5 O1 v4 U- }. G: H2 r# J+ N0 c$ D
    缺点:! m( f/ E0 p0 Q
    暂时只能进行get请求,不支持post访问
    / X, L& |( }! W
    & S5 |0 N0 J! H8 s) Y:return text or json9 s1 Z$ n( }" x5 E

    7 `  x* R2 U) k) F# Q3 }6 Drequest.parse(# Z# F; [* E; O3 K6 B: U
            url = "https://www.douban.com/group/explore",1 }* O" |" k% J& n' v5 t$ x
            type_url = "text"/ {& q0 v9 v/ I& }9 h
    ).run()
    * h. ~6 `+ s5 B% B, n/ f# return text, y: l9 Z# Q5 {

    . p8 ~' }- ~" G: R0 J4 o1 {: m第二种玩法:模拟网站登陆并保存信息
    7 Y8 _0 W! R2 i调用DecryptLogin库请求登陆访问。+ ]: Q- X$ R; H( {

    8 X3 D: K4 o6 U! Y" d2 A$ B- s* lps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源/ E# N! z" ^" \9 Q
    在此放出文档地址+ m' B9 f# D% S5 y) B, J
    DecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/1 y0 f! r. a# y2 ^3 B. J4 \
    : ~' e" q' n( H, z" o
    特点:7 W* a+ V. @2 n
    将DecryptLogin库中二维码继承到此库(非二次开发)
      U/ s, V' |3 N, b, M4 x支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆)0 C! [! F/ ^+ v0 w9 N; ?% d$ c
    保存session.pkl信息到本地方便下次登陆运行
    4 N+ {3 ?5 F' P4 q& q9 R! d6 ]& S! N" a5 r0 Q
    缺点:
    4 E( l! E( ?1 ?1 B- jsession.pkl登陆信息过时无法自动删除。/ b- W5 C" ]0 o1 q/ A4 @2 m
    导致下次登陆疑似cookie无法正常登陆。
    ) O) b+ K7 F4 U$ g0 q. P" p( J, J& Z$ `% U$ `5 L
    :return session
    ( n. ]7 k9 m( Q7 C5 x- v& Q7 ?- g/ P# {- M" }7 L6 o5 J; E
    request.parse(* A; B+ I) T. }: {
            # 臭不要脸的推广一下我的店铺9 B2 X% _2 u7 {% t! F
            url="https://shop574805287.taobao.com/",6 @* T+ L4 i, j8 C- P$ s0 i0 A
            login="taobao"( p, z! y: p+ X; T. o* x( E0 ]7 R
    ).run()
    - p& P* _- y9 H! ?+ H0 P& G# return text
    4 i8 w. {# B! }1 x0 ]
    + d# k+ _$ L2 z3 l- W第三种玩法:爬取网站信息
    5 ?1 P! U: I6 q6 H- i爬虫库自然少不了爬虫的过程
    - e' N3 t. c7 i; \3 Y
    . Z* n$ S- I8 Y1 \* I# Q特点:
    * {3 o% F6 l4 F支持re库,xpath解析以及bs4选择器。* _0 C7 P1 Y/ o( D
    爬取方法为字典格式。单方面输出。
    4 D: \# E) a; _* J' f字典键为保存的字段名称。
    0 @) e7 y( |. \3 C8 N字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。
    : T& w* k7 {! m. W1 }+ f+ h0 K
    9 U7 n/ h" e5 f5 [5 q7 a. Y缺点:暂无(等待小伙伴们发现)
    / J9 j# y- ?- O  F: E: I
    & S# R4 [8 B& l$ E+ R# t6 Q& k:return reptile_results3 Z9 R, ~8 D0 N3 n5 [" R5 u% B

    $ x- Q5 a" Y3 e' u' L, R. g  M2 `request.parse(- X$ H6 X' d* e& R
            url='https://www.douban.com/group/explore',
    # J1 J5 g* H% a  ?        # 字符串格式,选择器方法。
    * c6 `; V8 g$ ~* h. N; p: ~    Parsing = 'xpath',
    ; O8 U( T# |$ g5 E" l    # 字典格式,参数如上。
    2 I2 t0 F1 L" ^# |7 e% h4 q: }/ g    label = {+ C- t( U( j0 d1 Y" P1 i4 C
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    9 o) L) p' K8 T+ K, C; ^        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    # W. w0 C0 i- ]        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    5 Q1 m* O' [0 ]2 h: d) |        }% S+ D4 b1 V7 T' C! C5 q
    ).run(); S9 s' c! q  ]4 ]% O, O7 ~9 ~) d! p
    # return reptile_results(list)4 `; ]+ K* U7 S$ A: b3 |7 `
      z3 g, S' H2 _8 @0 d/ {# a, g
    第四种玩法:自由保存信息
    + U9 ]) r+ t7 o6 R( d: x* R目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。& u1 g! V0 Q$ U! W* e0 F% V# u, ~
    8 S% ], B, c) c/ ?- d  Y
    特点:
    / \( f1 r! o+ o# H7 j7 i( L写入文件均为数据格式传入文件。
    2 j( `% I% b: C9 C' ]4 j! V% K! e且输入格式规范方便阅读and省事。/ x5 W3 X* f/ h7 W& r* b) u" {

    , H) q, O) t7 r( o; `% ]缺点:
    3 k& V/ b8 J5 l. u  g8 a保存格式仅四种,
    ) b! _; ]  y* ?不方便用户之后读写操作。& E0 `- }5 Y& @  Q; b" i3 f+ F

    + [8 N4 V/ f5 l7 {1 l; |+ I, ^. J:return file% s7 F2 ]# Z0 T
    3 t+ I# T* N' y
    request.parse(, [/ j. e( @6 ]7 P; u% g
            url='https://www.douban.com/group/explore',) C; Z: u6 A- g5 q
        Parsing = 'xpath',1 w& E. {9 }  X6 x/ k
        label = {/ [$ _" _* a! \# e; D& c" K  k0 X
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    & D& Z& z' Q& X! P        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],5 m2 z* C6 ~/ [5 l$ v
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    $ Y% X$ J+ e1 V        },& z: q! |( H% ?3 q& Q1 U% |. Z8 |
        # 字符串格式,具体保存位置填写
    ! a; C$ J7 k( d, S. L3 J4 N) S    write='result.pkl'$ }/ Q, ^) b1 a; R1 c. [* w
    ).run(), ]4 t$ z: B' \' R% e. ~! C
    # return file: Q* u) O% C: D) x% F7 ]$ B& @# |% |
    % }: r& T. S# P3 F( N( \
    第五种玩法:读取下一页 url 地址继续爬虫  a& J3 @2 R, f/ o: `) w- [0 f
    这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~
    0 S/ v# ^6 K  {! Z& B0 c7 h
    , Y: @# e# L& i) z特点:9 g/ r( x4 }/ W- k1 R4 a1 G! |
    继承之前的Parsing参数选择器选择方法。; d$ l* f, \; [" `% f. g
    在这里可读取到解析后的下一页 url 网址。
    , e+ O+ o5 ?" l方可继续进行爬虫处理。方便用户使用。7 I8 p  K6 w2 v' w

    $ k: F& R- B/ X+ b$ E# c/ T缺点:! B5 L' O0 O8 F, \8 x) \4 P
    若爬虫时下一页 url 地址改变,便结束爬虫。( F' Q: o8 f6 A& t. k6 }/ `
    只能爬取所给 url 地址中的信息。
    $ A9 N3 O9 r% }8 A无法进行某一界面的多个网页爬取返回。$ [# g* y8 @& ~; e/ P, N4 v
    造成访问页面单一流失。! c, C2 G. X# x

    7 ~  j9 |) |0 k5 |) q3 u. ~:return None; j* N. z3 h1 O
    ; X; }4 c) e) S, n6 A
    request.parse(
    ; H& e+ A2 u6 v  Z$ A" m        url='https://www.douban.com/group/explore',
    , M6 x& R+ R; @9 X    Parsing = 'xpath',
    ' R' Q  T6 h9 d    label = {
    : O# v  B$ N) m9 f0 V        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],' o2 g" T* t; I9 ^7 g0 Z
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    ; F! o* t% o  j5 ^: I8 Y* Q9 Q        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]: a5 z: e' Z' e7 e) O/ \+ `
            },
    ) L# {' X! z3 S5 `' Z8 k    write='result.pkl',
    6 U3 p8 `' d3 v    # 字符串格式,根据Parsing方法继续请求下一页a中href
    - f6 H3 C( `, l& l% W% @& S7 @: J( @    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',7 e$ O0 |) \6 I' [
    ).run()6 I* l# T& D* P3 E! e% e
    # return None
    # A! e3 \7 i& I6 Y
    ( O3 g: M1 t$ m/ ^6 c第六种玩法:爬虫网页保存( ~2 @2 \1 s5 G
    听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!
    ( m0 Y& b( ~# @$ ^4 C+ o( i- h4 S! @8 X) S
    特点:5 N" c3 j) Y: W+ t' }& G
    持续输出断续笔记。& B' e& ]* S( u' B' u. S% H) S
    将此次爬虫的 url 地址保存到一个文本文档内部。
    1 U+ r# I  v0 z1 H( ^+ s* v* @下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。
    ) R& E! }9 G4 o) y3 y) d8 ]0 R' D( r
    缺点:% D3 w, [0 H# M4 h- V4 A/ C% h
    读取内容不单一。
    ( u) V( u, K! f9 Z& A6 t导致下次爬虫无法正确读取上次爬虫留下的痕迹。9 c8 u1 U& Y9 A! E. i; L

    0 F3 H: I3 R3 S  E6 r:return url_file5 G4 E" n( ^1 r$ H: C# M8 @: q8 \, q

    2 \# I9 z  l5 j& Brequest.parse(
    0 b% s* E9 \$ S. |7 Z$ }7 F    url='https://www.douban.com/group/explore',
    7 T! w4 x! J3 o" U, x' ^1 F    type_url='text',
      d; n$ x8 w4 _6 V/ l3 y0 ]8 T8 Z    #login='taobao',( }- x' L+ B, Y: ~! v6 S8 L
        Parsing = 'xpath',9 G4 z# s1 C& P0 u# T
        label = {
    - r5 l5 d% X5 D0 i& c. v( E  T7 K        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    ; G; q  N( _' s3 |        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],  `, a9 K- f2 _+ ^$ F
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]+ K' l" P: B+ j2 V$ r( B
            },
    % k: q8 [# k! Z3 t0 |4 T' U    write='result.pkl',, Z$ Q0 X9 X0 ]6 N9 y
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    ; {. }. c7 f2 z" A* }) i& `3 ?. ~    # 第一个参数为是否需要断续笔记。
    2 E' E$ T8 k# j. H  `1 [4 l0 ?/ T    # 第二个参数为断续笔记保存位置。% D' ~* ~1 \( D. `  x
        page=[True,'url_page.txt']2 U! m! G; T( H) B5 p% o
    ).run()
    1 C5 a2 J- X" s/ }. L7 ]# return url_file7 H2 h. w4 ~( u/ ?  s- z' }; W% }

    " g& s$ m( i' j. _$ a( Y( [7 a第七种玩法:简单数据清洗, r1 A1 T# e  S7 k( w* R6 g
    数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。* W, c  `1 ]5 q! o( D
    1 A: W% G- t0 B; E( e# U
    特点:
    / k! q! t7 Q* s3 I; @# c$ _本人曾写过一个底层数据清洗。% v5 D+ L% a. Z' f2 Q7 @* |+ }
    能将列表格式数据进行归分清洗。
    , J9 f/ f  \# a; R: a" \/ B主要内容请参考另一篇文章3 c+ P. Y2 T: ?/ W5 [
    如下连接:数据清洗
    7 Q' i: a# e. i1 W) @( i
    * G$ S6 J! Q8 C缺点:4 K. H9 i2 {8 W9 i3 l1 ?
    数据清洗格式简单。
    * }+ e. ]3 A( a. I数据清洗内容单一。
    * O0 w  g& Z, o" C) R无法完全做到绝对清洗。/ h/ U  r6 Z- f) o6 R  O
    有待改善。  R- X' L- }" C4 T2 \4 q9 Q4 r
    & M, M- i2 D8 e
    :return keyword_list, value_list
    ( ~) _# ~6 w" e; @3 ~$ o( V& |& u: ]
    * m; `% B( H: B: trequest.parse(& ^7 e" G. Y4 L! L! r! _+ j( w
        url='https://www.douban.com/group/explore',
    - n6 i) u8 q6 E" R" h8 ]    Parsing = 'xpath',
    & \. M% g3 V2 Q$ [    label = {
    - |6 b. P% T) [/ d. h" t        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],* ~9 R* r- }' S) q3 r6 s3 B. {
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    " O/ h( l# w9 c+ X: L0 g; f- P7 A        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    ; K2 r, R% G. h9 ^! s  ~' j* k8 n4 g        },5 L! |$ j+ F0 `! [- n
        write='result.pkl',2 Z! G  R  I9 m+ p2 r, n
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    5 Y3 Y5 p4 Y9 O! ^9 C+ k( Q    page=[True,'url_page.txt'],2 r! K. U6 e# g
        # bool类型,默认不清洗. `3 l- W3 E  v  F; l/ t* s% g
        clean=True, v2 l# L9 \9 J) H% K- m
    ).run()
      m5 r+ l& H* q' f0 C; e; H7 G1 w' F; n7 D( t) p$ i
    第八种玩法:爬虫存入数据库" W& B( k5 |0 d/ k+ m9 J& Q
    存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。9 @4 t/ P$ H3 Q8 e
    # N) `2 ~, ]; N, J, j% T
    特点:5 D' U& W. A: w# w
    信息存入MySQL数据库。
    3 K; j% p$ ~& {7 o8 v可连接docker远程数据库。
    1 m, ?& d3 X7 `! e) Y! s数据库的库名可以不存在。* S. T# E6 v' O4 O
    数据库的表名可以不存在。
    : U3 L2 {9 ^, m& w根据之前传入字典键与值参数判断表类型。  z8 P, r3 `7 u' @: R& m
    自由建立数据表传入信息。* M1 g( i' f0 I/ X

    0 D, Y4 G9 e% F/ k4 ~缺点:
    6 V# m! X# I' E1 S6 U. A6 T仅支持MySQL数据库。
    8 i! j. E6 c0 ^5 f9 v1 _6 [! O% _
    :return SQL
    7 }! i* G! J& t+ J* w; ^  ^6 q- q7 G3 A2 B  f" U/ g
    request.parse(2 P' m' E! w, Y% ?; e5 H8 x
        url='https://www.douban.com/group/explore',  P) A; U8 [7 y" b
        Parsing = 'xpath',1 `  ~0 I' q- Z) p
        label = {) x, {% f3 S1 y
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],. L: E' E, H" m9 d. Q- R
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],* R7 d4 C, `* U1 |1 h2 A. ]
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
      X) L1 W- |9 c        },
    8 J7 l. i9 q" v3 R, v. q) ~4 f    write='result.pkl',' D/ G3 _$ G8 k4 c% P
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',  M- U) M0 @- M- _3 j; M$ M
        page=[True,'url_page.txt'],! s0 r% L' ?" j
        clean=True,
    $ f3 j% Y) P% g& W. u4 W    # 字典格式,
    ) ^! }( I7 V6 R  C% Y# Y    # host可有可无,默认localhost  G( L- r/ [: k& F" Q& m9 W6 W
        # post可有可无,默认3306
    1 V7 W8 S7 a) O; R7 y0 ?4 d    # user可有可无,默认root
    6 A1 e' @& ]+ z2 v$ o. S    # password必要参数,数据库连接密码1 S+ e4 H' F- W$ L
        # db必要参数,数据库即将存入的库名$ o, b3 @2 m% t; C
        # table必要参数,数据库即将存入的表名' f( f: ?/ C; y5 N
        write_SQL={
    ( j, u0 T- S! c( @2 U2 Z) X        'host':'localhost',
    ( G0 @& o' I4 N+ c        'post':'3306',
    9 y2 A( C- s8 L8 p8 G        'user':'root'," ^: n. Y: q1 O1 j3 V# o2 y) _
            'password':'123456',
    # i' V% F7 b7 y  w        'db':'example',7 m6 w* a2 R$ m: z# `' V  v/ M
            'table':'example'8 |& @3 y; r) q9 {2 z4 `
            }9 l3 C! r* ?; n2 E& q2 ~* l; N# j; U
        ).run(), Z) A% L$ q/ \! z' i5 _
    $ o; l: W* l5 f/ j# A5 }7 Z  [$ P
    第九种玩法:重新启动爬虫
    9 A, G8 d" b3 C2 \5 S爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。2 _+ t& z! e; m2 K
    $ g: _9 \0 D9 |3 n& N' y
    特点:8 d) {7 |* v/ M+ [, T7 E
    检测报错重新启动爬虫5 [: `4 ]+ D7 A
    无需手动处理错误信息
    ) Z$ E5 ~" O4 u8 P; C* B/ o0 L  ?& M: v, \! i
    缺点:' s3 l$ z+ x+ S. v; |
    无法收集子线程错误。  ~" {8 ?  f& W
    & i7 Q# D4 k, C7 O8 L: a
    :return None3 A1 V3 H$ ~/ F2 ], W. H) A% O

    ' Q- K# m6 T1 zrequest.parse(
    / E$ K2 L$ b& v+ T4 K4 L        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    1 O( i9 z" {& c, v0 C2 g        #login="taobao",; P# I0 H- }1 ^$ ^
            type_url = "text",
    6 @5 M2 n- P0 P9 l' {+ b        Parsing = 'xpath',- k; A& Q) f  ~. s
            label = {
    $ N: u& r; S. f7 n            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    - V' Q9 M! v1 \4 j) |" d- `            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str]," H+ h& M% D6 S& f
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    % x% L, J$ X6 ^' _( q* ~            },+ |' }: Y$ ]) {6 s+ [: z( p
            write='result.txt',
    * `; O: \- n) j( E4 v% S2 g        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',! R1 V# [* T, d4 v/ x+ E, S! G
            page=[True,"now_url.txt"]," N6 e* ~2 B$ s8 B: j( W3 @
            # texting 参数为是否启用连续爬虫5 a( F9 W5 n2 M5 K0 A: H
            # 爬虫程序异常报错后重新启动爬虫
    2 u. z  S5 Z5 |- k        texting=True,0 \- g( o, i7 B4 z8 ~3 @0 {
            ###
    7 a+ L# C5 g/ m' n% n3 t/ m        write_SQL={6 E/ [) t9 @: [5 Z$ B
                'host':'localhost',/ O% `$ B- }! h
                'post':'3306',
    3 v! H0 x& s+ E( U- E            'user':'root',
    . l' [3 k# ~* n* q8 ~  R            'password':'123456',
    * f: }& O0 q; r            'db':'example',) D) B; t+ Z. K: h) \
                'table':'example'$ P8 l# u% ~6 D6 l( p1 F
                }
    4 o% p! Q' A/ g0 E2 J3 Q- ]).run()
    7 G2 v1 |1 x0 v4 d# o; F% z
    0 _8 K5 G  F8 b4 I第十种玩法:多线程爬虫
    5 i7 @, q2 K, j( J9 O4 v特点:
    3 e+ \$ b% \7 I1 s爬虫速度加快,* Q! x& u3 D2 p0 Y4 R3 L
    更好的利用了线程。
    ! L7 U' I$ @$ E6 a- O. v: _
    ' g' c9 T* ]( K$ p; a- h, o缺点:暂无
      f4 d) G3 O. Y! n: Z! m8 b" ], s# Y$ T# G" G& K6 k
    :return None7 Z' ?  K! ?' G) |- [* q
    , }# R( h  l  z9 p# J( x1 V5 v
    request.parse(1 L3 I, O* ]$ e7 U
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],  t" T- a% R+ [# x! D
            #login="taobao",+ @+ L- R% s; \. J+ _% K6 i
            type_url = "text",4 c; f. t* b3 \" I7 }5 h: i2 s+ T
            Parsing = 'xpath',2 [2 G/ \- D  a. n; C2 R) A
            label = {
    ' J9 W& V2 f1 h# h5 J            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],+ F9 a* I: @+ Y6 G% J1 r
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    ! E( N/ A- F2 ^- f            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]  Y) {$ E4 ^  @( H! I& M% G
                },
    ( ^3 s8 W% M/ N9 R% P        write='result.txt',
    1 Q* h& J0 n" y: d, r/ _        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    6 j/ g0 H5 A; f* G6 B9 B  J6 R        page=[True,"now_url.txt"],3 F# m, K) B% A  }# D
            #clean=True,
    1 o* \9 }# Q! f- N6 B        texting=True,
    7 E2 |. V( D) q9 ~& ?2 z        # status="threads" 启用多线程爬虫$ w. `$ M- u; ~( N: k, _* r  ]
            # Thread_num 为线程数目,默认为1 单线程
    0 {3 K% a! g- x" c1 x2 I) P( I& F' G6 ~8 t        status="threads",
    & f  E8 Q& h+ J        Thread_num=3," I" ]2 {4 t2 l" ^/ B
            ###2 `, q0 y9 ?0 k8 B* v) h: U5 M" y
            write_SQL={+ N. }* `- t- Y
                'host':'localhost',
    3 l* V3 k" e4 ?( H            'post':'3306'," c, x$ y) H" m* Z% `  F
                'user':'root',' f. x- r3 }+ @& U1 e2 M  ^" j
                'password':'123456',
    * d! X/ _* [- Q! u6 }; F            'db':'example',
    . S9 {0 {5 G$ p) X& c9 a            'table':'example'
    % z( V0 g) p( y4 m* z/ b1 Z- H' U            }9 {. u9 ~& ~2 N9 \/ ~% r0 l
    ).run()
    4 S& O3 v: M' g  V
    ! _; u1 @1 I8 N% ~2 c0 ?第十一种玩法:多进程爬虫
    8 R8 F; T0 y: j& u6 t8 W% D特点:
    / ~+ G# P# `5 A2 |爬虫速度加快,9 n% w# n# L4 G' b- H3 H) B1 S, r
    更好的利用了进程。0 P) M4 s8 k' S4 e" v9 W' J
    ; d' ?2 w  j% w# @& [3 o0 ^
    缺点:暂无/ }+ o: v+ [, |: D
    / [5 }6 \4 n6 J: V9 ^& V; Q
    :return None
    ! ~' N5 G7 j) t9 ^+ e' d8 N" I- [# X- f# X8 n! W* Y( r+ C
    from simple_crawl import request
    ; }0 e7 N4 D8 e1 _# l6 v- ]request.parse(( R1 V. t) D- [4 f$ ^* b  X
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    * [5 ~! k5 D, z8 a  V  J        #login="taobao",: J" M9 Y4 @) u5 H
            type_url = "text",; S* ~+ E" j1 g
            Parsing = 'xpath',! E8 Y/ g- k" ?. b& A
            label = {1 G% \6 \2 s6 @8 J, M" m
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    " I& R3 D& a8 }            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    7 b( i4 p0 T4 z8 d6 ~: N+ t            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]: Y# G* P' ~+ I5 ~- c9 p. l
                },
    ' D8 _/ w7 J$ Q        write='result.txt',2 S" E& k2 Y/ q/ V
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    ' [/ P& [' a, `4 r2 I+ [; b        page=[True,"now_url.txt"],9 b- Y* m) [5 v7 w8 Q7 C
            #clean=True,- D7 |/ S1 _# C! K& G6 R% a
            texting=True,; @% p3 X& b* E% t, [7 W( Y# I
            # status="multiprocessing" 启用多进程爬虫
    2 N! n; v' h3 h4 b6 v/ H8 u, r        # cpu_count 为启动代码核心数,默认为系统核数一半& ]. ]7 u. P# E7 S# i1 S5 [/ _
            status="multiprocessing",/ R( o! o5 B) p+ P' q# _( f' Y
            cpu_count=2,
    1 Q8 S/ @9 O, X; i        ###
    $ D6 n- c. A- ~        write_SQL={1 O# ^# _5 |: v( ?' \# F
                'host':'localhost',9 z. Z; r0 n& b+ k* o" L
                'post':'3306',
    2 _' \7 I: r# q$ D* [            'user':'root',3 r* f, V5 x- `
                'password':'123456',% z9 G5 L- f9 X- ~, o
                'db':'example',, r( E6 G5 [: {" W
                'table':'example'0 Z* r' p6 x* f9 J
                }
    . l9 T+ @' O' A! X9 Q/ T).run()
    5 p4 i- [" ~/ z9 k" D, Q8 m+ K: W/ z) w
    第十二种玩法:异步多线程爬虫
    ) K3 V8 V) q* u9 N; D特点:
    + b% a/ P6 \- T' O5 n' t% l爬虫速度加快,+ d8 @2 ~2 }$ L3 Q
    异步使得爬虫无等待时间,1 p6 F# |- @% R+ j- D2 I  z8 y3 ?- w2 y
    同时使用多线程速度明显加快。
    $ L+ j% i9 e) j7 r- A2 g- [) X- W: i) z% D
    缺点:暂无
    + r% Z6 M, \4 v5 i' |; s4 A8 h: r& Q6 u
    :return None  U2 x6 i0 P( k
    5 G- i. B  Y( h& X
    from simple_crawl import request
    ' u0 o2 V* I( t9 @) ^3 s0 O2 wrequest.parse(; U  G& Y+ Y4 A! R! h+ ~$ t6 Y# T
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    / {3 O1 I$ k6 O+ h, Y/ H5 d        #login="taobao",/ I1 d8 o# U; q# `% w3 S
            type_url = "text",
    1 x* k% [: }! C7 v3 Q        Parsing = 'xpath',
    4 f2 j9 F5 q0 D        label = {4 I3 d" j) g) _
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],; y! B$ A% f. [2 N% p4 V1 b
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],; O9 x* G5 D" Y+ ]4 ^
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    9 U. r+ T9 D" E  ~6 }; c            },
    1 Y8 J% F2 f+ O        write='result.txt',, s6 t9 r9 }+ A' S8 y0 {4 G/ E
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    + e5 \6 F$ z0 s, W        page=[True,"now_url.txt"],
    7 M4 O/ r) J' V  V        #clean=True,
    . [" U+ B5 |# c+ k        texting=True,  W" `7 ]! {% X, W2 f) I
            # sem 参数为异步引擎数目,默认为59 y: K1 {! {. X1 M1 m; f9 t
            # 其他参数同上
    1 q4 f+ I2 f" |; K4 P- W        status="aiohttp",6 @5 t3 m" P1 |5 Z, q, h, @
            Thread_num=3,5 d; [: n' p3 Y# E  w; z2 F
            sem=5,
    + z5 v! x5 M8 q; S: B% y        ###
    7 q, l" s+ i( j- b- K8 I" z        write_SQL={
      I+ t& n/ w. u            'host':'localhost',
    8 M/ F, u" k9 h# v+ ]+ V            'post':'3306',
    : Q& t$ S: \6 D7 t7 v2 C9 g            'user':'root',; R- g/ T' x! e+ g. [) L
                'password':'123456',
    / A5 R1 J: ?. Q. F            'db':'example',
    ( W: O/ V; g8 h            'table':'example'
    9 |; s% i( v/ ^            }. v1 p; L7 X7 s% m+ n3 L5 P
    ).run()
    7 m# V2 [$ d* O1 e1 A$ f: {. D. m
    第十三种玩法:异步多进程爬虫/ `( K  n( l" e8 p+ B6 g& y+ y
    特点:1 L) j& x/ H9 _# _6 }4 @: g
    爬虫速度加快,
    8 Z7 c8 O. E. z  Y异步使得爬虫无等待时间,
    $ V3 R2 |" u: X; X, D# \同时使用多进程速度明显加快。
    9 Z1 L  o* Q3 }- z, p* t5 ~( u: X# W# P
    缺点:暂无1 L! `+ d0 x% B# L
    3 p( C8 K3 A4 }: A- L
    :return None
    0 A4 t4 P8 ^7 a( Q+ n
    # s, X& I% j! ]9 D# R2 @3 Dfrom simple_crawl import request6 C3 A9 b' _& K
    request.parse(
    ! ~2 C2 p/ Y' d9 I5 D4 H' ?3 G! \7 ]        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],5 i* ~" I* w8 G5 ^0 n% k3 F, c
            #login="taobao",  X; H, t2 A$ n* P& ~! l; W) d! d
            type_url = "text",& D, H; F9 e7 ?$ x
            Parsing = 'xpath',. v6 G- h- X# F
            label = {
    6 `' `# H+ u$ `5 [" u  ]            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],7 M$ f& O  E- L" \$ |/ Q
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    , L; F/ C/ b) n" r3 A; F/ _) v            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    9 ], |$ a3 x: _1 Y' i) r, H* K            },
    7 V0 k3 W. s( o        write='result.txt',
      M- R% Q8 a* C, Q        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',, A$ s& m2 G& d7 x
            page=[True,"now_url.txt"],
      F0 y; o& V8 X        #clean=True,
    ( ?: o" E/ I* [& o# O        texting=True,3 F# l/ z" Z  \7 |+ d, t! F
            # 参数如上
    . u% k* A4 P! {        status="between",
    " L+ d! i, W- P+ @5 R: {( I        cpu_count=1,, T, l: _7 w5 Y, X2 y& N! V7 W& n/ E
            sem=5,) A+ q9 S7 C, |6 a2 Q
            ###0 `- I* v& v9 {) I4 ]; l7 j
            write_SQL={
    0 A' r) H) ^$ v  b% A            'host':'localhost',) U# `, T* O( y' S7 {
                'post':'3306',& P' @/ B: l( F, Q. K3 ^6 y1 B
                'user':'root',
    7 t+ E6 i% w$ q# D1 b            'password':'123456',
    2 t& L& ^' w$ q' J5 t1 H2 o            'db':'example',
    6 d* a  x. d  L; A; x+ t7 I            'table':'example': \: c- b( R6 l
                }% K" h7 V1 L% A2 E3 }
    ).run()
    $ q, i' M( G% z( i: S5 g+ O5 ~% C4 O9 ^  w/ O
    - j7 I, b, f9 {% w# Q! u2 y
    功能介绍完毕🤞( P5 i+ b" _! c6 x$ J( T
    最后还是希望你们能给我点一波小小的关注。. c. M1 |. u6 t9 R& G4 E
    奉上自己诚挚的爱心💖
    ! C" a9 V; J8 e: G, A————————————————
    ( f5 M, L  b) F! ^/ |- W版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    4 x  p1 B4 p( A. l( ]6 a! C原文链接:https://blog.csdn.net/qq_45414559/article/details/1060056845 N0 t& z+ \0 }! O. g( Z
    6 v7 {9 s& w! v9 O9 f, c: T

    & h5 u2 c# X% @$ b* N
    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-5-8 02:30 , Processed in 1.131525 second(s), 55 queries .

    回顶部