QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5407|回复: 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& Z9 Z, v/ ?9 t2 U6 x+ a
    simple_crawl
    3 A. J) n7 P+ O$ }仅需一行代码即可达到爬虫效果" S0 o2 m5 q5 g  ]6 Y# i
    项目地址(欢迎star):https://github.com/Amiee-well/crawl
    1 c; c0 T8 y$ m" o6 U$ C使用方法9 {( \, m# `+ z4 g8 t( g5 _& Q
    pip install simple_crawl
    ; b+ Q4 F; Y* N) ^& E$ Q0 r
    4 q0 v$ B6 h0 m5 {### 以下源代码为简单介绍,详细功能介绍再源代码之下9 B" m& }0 r5 Q7 Y% y6 \* J
    from simple_crawl import request
    * {: Q+ n2 q9 z' S. \request.parse(" P( `5 [8 e1 C3 u" x
            # status 参数为运行状态,支持单线程多线程多进程协程以及联合
    & E% l( D$ t& h  \3 X$ U- B8 s        status="aiohttp",
    + h5 f; D4 h6 l, p8 C& h0 o, J        # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式; N$ l3 }; q3 k' O
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    7 |( N: s" v$ c0 k% ~+ y$ O        # login 参数为获取登陆信息,如淘宝等网址需要登陆信息
    , I) q1 Q/ H7 R! ]8 g    #login="taobao",
    4 v/ o% P1 d# U    # type_url 参数为返回源代码格式,支持text和json,默认返回text, |! N/ C* z# f4 D7 ]0 b# a, ]  |* V
        type_url = "text",
    3 v7 Y$ A& F+ G+ n, E1 v3 r- s    # Parsing 参数为解析方法,支持re、xpath和beautifulsoup& {' ]$ R0 a. x. m; c
        Parsing = 'xpath',( m# ]# h1 _4 d! I
        # label 参数为爬虫解析过程,字典格式,详情见下方
    & o: t9 u6 l% ^; ~% l& C/ V5 m    label = {
    % U! O+ n9 J0 k/ W5 ^8 f) A8 b            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    $ ^% V+ D2 w1 D2 b4 ^( A            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],! q' Y9 U; J/ w3 v6 \
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]0 p! j5 s9 X8 y+ |
         },( C  w# g4 ~6 V+ {# f; O
         # write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱. H. j# Q+ T( s4 |7 |, v1 t
         write='result.txt',2 m( l* h$ w1 f( N" R+ ^2 e
         # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫
    . Q3 N/ Y9 E- `7 G4 \/ m0 P     next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',1 J- p5 E- J+ ~0 A! V
         # page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫/ S7 F5 A9 c9 i. V: A: R3 i
         page=[True,"now_url.txt"],
    ! S  w0 w$ `% o, Q     # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息
      N1 C. r3 a5 N& c7 s- [     #clean=True,2 G5 |7 d4 L$ D
         # texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序3 y; B5 }( A6 u
         texting=True,; V+ }0 d4 P6 u5 v
         # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态) b' ]: b4 \1 t: `
         Thread_num=3,
    # i- y( v$ M7 }- J- P     # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态
    5 ]8 |6 M; p; {  T     cpu_count=1,
      O+ }2 ]4 M" e- |3 d     # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态
    2 J: ~. V8 a# m3 O2 J     sem=5,! L+ T1 Z8 ?# [5 e' ~
         # write_SQL 为是否写入数据库,默认否8 v+ U1 }" c% Y* m2 \( e$ s- ~7 @
         # host 参数默认localhost
    7 Z1 j. U/ y3 @/ a) B     # post 参数默认3306
      M0 b4 {2 o: {9 B$ F& X: ~     # user 参数默认root
    ! M0 S% H6 b5 T5 |     # password 参数必填,必须正确7 {, t+ h1 t( t- L; o5 s
         # db 参数为即将存入的数据库名,若不存在自动创建# d6 j8 x9 G& X% s* [! k
         # table 参数为即将存入的数据表名,若不存在自动创建+ j, l+ A/ E) |) S
         write_SQL={9 R' F' Q% a. A- I! v) u$ `
             'host':'localhost',1 y8 l9 L! r6 d/ c6 q
             'post':'3306',: f4 }' ?. i" P2 o, i
             'user':'root',' N" P- O5 D% n; o5 ]; G9 @! K# ~
             'password':'123456',
    % B9 Z, C% Y5 E- N         'db':'example',
    & S4 d8 ^9 e$ Z         'table':'example'
    0 _8 R* m; j- s* J8 K( O      }
    0 e; X" G# L: D. F9 U).run()
    ! h# ?( |, s8 Z5 C. Q4 l+ o- M! B- v8 r- \2 C4 o5 G/ t
    介绍一下crawl参数设置:8 }  C) j, N  _" P
    : y+ E: F3 F+ A! U+ v, v; F* c
    '''4 R5 F: g# M% i) M4 q7 S
    单行代码爬虫程序执行
    + ^7 b" A6 P! l:param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档- t6 o- n  C7 D3 A! J4 D
    :param url:即将请求的url地址,仅支持get请求# G8 ^' n4 x. }/ t8 h. }. C
    :param type_url:请求url后返回格式,支持text和json格式返回+ z( l1 A; G# f' c+ e' _
    :param Thread_num:即将启动多线程个数,默认为1单线程; A; C, A2 g  M5 F! O6 B
    :param sem:协程信号量,控制协程数,防止爬的过快,默认为54 \1 i! @. @/ ^$ W8 a
    :param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半% w$ L+ q7 w" U) a1 n+ f5 I- G
    :param login:模拟网站登陆,保存登陆信息: x2 M. _0 x3 m* \
    :param Parsing:爬虫方式,支持re、xpath以及bs4方法$ a. \% D& K. u
    :param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,
    ' X( n* Q# Y; p  L5 `                       多次报错结束程序,默认否
    ) C# j+ Z3 _% q( t6 P% e: D0 N( Q8 H:param label:选择器内容,字典格式保存,6 H$ ]  _0 |6 q# U! Q, p& X
                         字典值为列表格式,第一个参数为选择器,第二个参数为转换类型
    " t& q' f! C  O. {# W                     第一个参数必填,第二个参数默认str类型) s0 o* T1 s5 g$ v( y
    :param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否
    2 l, s5 ^0 X" s* X:param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫: |: \8 q2 p' \: l- F8 |
    :param page:是否选择断续笔记接手下次爬虫处理,默认否* |; @0 B' G! o7 g: y& v8 l( v; c
    :param clean:是否进行简单类型数据清洗,默认否+ e, f* j( z+ x2 o5 P, \
    :param write_sql:是否写入数据库,默认否
      l4 Z" U4 I; J# @+ T8 y$ L                         'host'默认为'localhost','post'默认'3306','user'默认'root',* e0 y- \. }* Z3 L& M6 \
                             'password':'密码','db':'数据库','table':'数据表',
    3 R/ p  v% M" G. k, U7 b# p                         检测库是否存在,若不存在则创建,若存在则直接插入,% [+ y3 h' D* O! g
                             检测表是否存在,若不存在则创建,若存在则直接插入% d" ], Y) B+ w/ ^) Z9 ~$ |( h! @. ?
    :return True
    ( O% w) ~) Z3 H. n'''
    & a- {6 K* V% U; D- Z: p/ G; i介绍玩法* x' N0 s0 O5 r! ~, m% @1 L
    接下来介绍的均为调用第三方库的情况下运行:
    0 ^$ o9 O6 [1 t. B5 j, ]" \, [3 |
    from simple_crawl import request
    & E' E% w5 k$ T% H9 W- S第一种玩法:输出源代码
    0 i: k" u1 D% W  l+ R调用requests库进行源代码请求。4 |7 T4 B! V8 `7 P
    2 y4 D7 A; m0 z7 n2 ^
    特点:: F( E( ]$ U- B5 x/ H( l4 l+ z
    请求失败则调用ip池处理重新请求访问,: N& _! ], w& J9 K) x5 H5 b
    出现五次失败默认网址输入错误。
    ) i/ q! B6 u$ S4 d$ e0 ^支持text以及json字符串返回。默认text。6 `; s8 B! X3 v( y2 V

    3 c9 [8 R9 X$ m4 }+ G缺点:( a9 i. R) w9 M  n/ F
    暂时只能进行get请求,不支持post访问, y$ d# B' j7 H, m  {  v

    ( q$ s9 N$ ?% i# H:return text or json+ g# R/ ^# x$ F0 q3 E9 ^

    6 b5 i$ E7 F- ~$ J$ G+ I* c% H4 {5 prequest.parse(
    ( H" B8 H3 _/ o7 J) ^4 L" j        url = "https://www.douban.com/group/explore",
    & j* g% m0 N5 B* N        type_url = "text"
    / @8 n, _/ W3 G+ Q).run()
    . g% k& ?7 |7 a6 w6 |7 b  s/ C# return text
    " \6 e6 l) v8 y2 Z6 p) t
    6 r* P7 b, C( A4 u2 @' d第二种玩法:模拟网站登陆并保存信息
    - a! U* |5 N: g6 q8 ^0 Y; o$ m调用DecryptLogin库请求登陆访问。
    * K2 i1 z$ Z( q" O" Q
    ) |3 I+ T. o) T. j* G! Jps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源
    - O6 P% D2 [: R) c在此放出文档地址
    0 z$ z2 A+ N: ~9 \- F3 y3 Q. FDecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/
    & b- u* y5 c/ @4 K0 g' X& N. R
    5 i+ K$ J) L9 z1 {+ L5 H+ x特点:
    % z* N! }* i- y2 u  A) z将DecryptLogin库中二维码继承到此库(非二次开发)
    ; Z( e) x- M9 N/ B( o支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆)
    , \2 B) G: j+ {保存session.pkl信息到本地方便下次登陆运行
    . V- d7 v8 k% q
    ' f( u' T- |/ I4 K7 L- }/ ?+ x缺点:
    7 {" I, o9 C% r& f. D' K0 vsession.pkl登陆信息过时无法自动删除。% I3 ]) p7 h, J( p$ ^! u: D! x/ D3 \
    导致下次登陆疑似cookie无法正常登陆。
    3 q* R* L/ ]* @0 T' w/ ^
    & v! Z; u: Q; w7 n7 N. d:return session
    * `' N4 I  i. p2 F0 u
    . c" G9 t* j# w( ]0 Wrequest.parse(
    4 D- N5 I$ Z3 x0 g: C5 T6 \        # 臭不要脸的推广一下我的店铺
    . s' a/ c# y& W' N        url="https://shop574805287.taobao.com/",
    8 \1 ^$ x( I/ U1 f4 P3 e0 W, [        login="taobao", `/ O3 ~, \/ [6 l9 b1 G/ l; y
    ).run()
    % R, F8 j" Z8 e6 g4 W# return text
    ! N2 r3 H; m, P( Z' r
    * R! U0 V  @0 P. [第三种玩法:爬取网站信息
    + ]4 |' y7 D; Z, X  e* K6 |爬虫库自然少不了爬虫的过程
    + ~! Q7 f7 N3 u6 P( [' b( Y. ^, y8 `* @4 r! k
    特点:# a% P9 G" K8 e5 w$ K$ R% y2 B
    支持re库,xpath解析以及bs4选择器。
    5 z0 Y+ \- }1 N+ H6 y9 r. Z9 |- t3 I  l爬取方法为字典格式。单方面输出。
    . E( D6 ~1 U6 E' ?( S* y字典键为保存的字段名称。
    # }$ e# A  o* Z. r8 Y8 t; \字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。
    3 W1 O; u8 s9 _% I2 x2 a* p- c9 E4 N. }4 _! ^
    缺点:暂无(等待小伙伴们发现)2 M+ m; U+ P- Q9 L. c# n
    ) e( N1 m3 q: S8 X0 t1 i
    :return reptile_results
    6 {) y% S: X+ Y9 i4 m+ ?
    6 u$ l5 E7 l0 F+ M$ D2 z- o& N" Hrequest.parse(6 `2 y) Z, r; C
            url='https://www.douban.com/group/explore',! O: O' A9 P( D1 L
            # 字符串格式,选择器方法。
    6 X1 ^% y8 J" v& z    Parsing = 'xpath',
    7 n- o1 K0 @% ^7 \    # 字典格式,参数如上。
    . n6 u7 O/ K1 y4 H, P4 b    label = {
    - j8 A8 i+ j+ T        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],. ^6 O9 b1 k4 }' s5 a  b6 Z/ x
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    ! p( v! ~' T9 V        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    , [& _+ m" Z) X! Z+ e) M2 ?$ _        }8 H4 P, P5 j, r; C) Y
    ).run()
    $ A$ u0 \- ]! o, i5 ?# return reptile_results(list)
    " f% S; @2 i4 ]- T; @) ~* C5 z: r) y/ Q9 a
    第四种玩法:自由保存信息' {9 d. o7 o& m' ?
    目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。' `$ D% ^: I6 T( Q& t. `

    9 i* i+ d/ I2 c特点:: Q$ S* Y, k# l& |& Z3 E
    写入文件均为数据格式传入文件。9 X. e9 e; X( E, V8 c/ n; V
    且输入格式规范方便阅读and省事。! C2 `% E5 I% R, h

    7 y( B/ g% d8 E& Q) X& q5 |* P缺点:( ^. P8 T2 ^7 f
    保存格式仅四种,- j! j, u7 L# _8 i
    不方便用户之后读写操作。% g$ r2 i9 U. |8 P* k6 z  M
    6 O1 P! Z0 i% E* b% T) ^" B
    :return file# e  M, q1 Q3 @( A6 ?/ Z

    ! X1 A8 i8 u& D( H- [request.parse(
    . h4 R, V8 A* u5 ^* e$ o        url='https://www.douban.com/group/explore',
    ! U7 D, T# I' g! f  z: D: i! F; g    Parsing = 'xpath',
    . M7 a# T+ K% ^+ k6 U8 D    label = {
    & [, R5 J$ h; g* }) w/ f        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],' U7 b, g; L, }% F, q) b& Q
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],6 B& y) p" m: K  E/ D! G9 G
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]7 d, \! G+ B  v4 s& N5 v7 V1 P
            },2 l" a+ @0 D1 c
        # 字符串格式,具体保存位置填写
    7 t5 R+ _* j7 @. @    write='result.pkl'
    + |/ i2 C7 X: G. w- b).run()
    8 x8 X8 B$ N  G# return file
    $ N2 U* Q2 ?( J# H3 J( v( e7 M  M- u. X& d8 n
    第五种玩法:读取下一页 url 地址继续爬虫
    4 T* ~/ p4 [6 P这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~
    % _" D: l+ J6 R. O$ c/ p( }% J3 U$ r1 h: v" k6 l) \4 }' h6 i
    特点:3 @9 t( ]: @4 E* r# K6 R5 I8 W# }
    继承之前的Parsing参数选择器选择方法。/ Y7 t6 V+ X( [# v1 V. B) b! G# b
    在这里可读取到解析后的下一页 url 网址。
    ' V' _, i+ z7 t2 w4 K: _方可继续进行爬虫处理。方便用户使用。' }0 J1 E( l4 ^* U

    9 U$ A# x4 F( }2 U' k3 K缺点:
    ! |- Y9 K3 ?, B* n/ H若爬虫时下一页 url 地址改变,便结束爬虫。
    $ S, `& y- G) Z只能爬取所给 url 地址中的信息。
    5 `7 j, M5 |& E9 O' g7 e! f, A无法进行某一界面的多个网页爬取返回。$ K4 k) Y0 o, f2 X6 [
    造成访问页面单一流失。
    7 L7 T2 F2 |  r( O* ?/ |4 g! `  R. g! q0 i+ Q2 e9 o% |
    :return None" o* P8 k) [, ]0 c

    8 x3 Z& y; \+ N% Rrequest.parse(
    0 n2 I9 r3 d$ p5 S        url='https://www.douban.com/group/explore',' f; r7 K+ t2 N9 U" j" h8 D' q
        Parsing = 'xpath',
    0 |) c0 W8 a& A$ q" r    label = {7 i% ?7 n# |" B
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str]," w9 ^! @/ n/ [' Y$ z" O4 |( K7 K
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    ' x' a9 W1 E8 t; j6 D  q        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    2 j! z5 J" m; O. M        },
    + k" b6 v* L5 i) R7 X    write='result.pkl',
    4 B& \/ [) P" Y+ }, H    # 字符串格式,根据Parsing方法继续请求下一页a中href( q3 f( H$ s  U( p
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    . O/ M) P6 {. M% w; r  ]).run(): C  F6 ?4 J) e- c
    # return None # y) H( u3 g0 A' W
      b6 F4 g, p- L
    第六种玩法:爬虫网页保存
    ( G* u- k' S" z0 P4 L% O. i: ?听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!
    * ^) L) O/ ?! K# N; B
    , |6 g0 x( O# A5 P! i0 g2 i特点:
    5 W: E  [( Z* a; j9 y* v持续输出断续笔记。, J- I- s( |/ f' x# @
    将此次爬虫的 url 地址保存到一个文本文档内部。
    $ \/ _- z- K0 }' h+ F* C/ _# b下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。1 @! y' ]' u6 C1 Q

    / w; e; {5 K) r7 T2 [缺点:6 G. J% d1 Z9 \. S! @
    读取内容不单一。* l8 u5 ^- \9 b3 [6 J; ~
    导致下次爬虫无法正确读取上次爬虫留下的痕迹。
      x. d9 n) i4 }* c1 k* T& f! i2 ^# C* f( m4 W: a- ]0 p
    :return url_file
    . k4 @0 P0 H( y/ z, g
    % K8 x. T9 B4 f' E2 a) Q0 x/ l' Nrequest.parse(
    2 Z. X: f6 m+ R    url='https://www.douban.com/group/explore',
    # r/ O% a7 a5 F  A& j. I    type_url='text',6 |8 Z% ^+ e! s/ y2 A9 e: S8 G
        #login='taobao',
    9 v0 q. o) E) C. b/ c: |5 D" u6 \    Parsing = 'xpath',' q9 R' x4 W; P' |1 z- W3 ]
        label = {' P4 O3 p' q3 {, H* g
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    " d/ ]9 Z; S* j2 A; }4 M% c        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],. r! m& A# T% M* O4 z! X
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]8 C  }5 v' W, g+ ]/ c4 Q3 t
            },
    ! v7 ~0 @' |; G/ c5 m. ~    write='result.pkl',8 l1 c3 B  }0 Q: o# x3 h. ?
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',6 r: }0 W7 e3 ?$ }
        # 第一个参数为是否需要断续笔记。) q( a2 X# F  E5 p2 ]
        # 第二个参数为断续笔记保存位置。8 A# U, ?) K; s! j8 ]2 ?/ G9 ]& [& e2 M
        page=[True,'url_page.txt']4 E. w7 M$ `/ k+ [2 b7 B- _' K
    ).run(); H! U) I- F  I& n
    # return url_file
    . L: r) M$ f2 t% n- H& E" }% ]) p/ H! m3 z5 Q5 L
    第七种玩法:简单数据清洗
    0 D  v8 Q3 ]$ T( V0 R1 _数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。$ B$ _& Q4 B) [5 o
    * X3 l3 T$ N" o& \4 A* ]: Y8 R: v6 _
    特点:
    % b" j7 |9 e/ g" S0 @: z本人曾写过一个底层数据清洗。
    , Z' F2 r+ O: ~0 e" g- O6 i能将列表格式数据进行归分清洗。
    ; J+ E7 ^/ H: I2 `( J主要内容请参考另一篇文章
    ! G) @( ?. [0 e! U如下连接:数据清洗4 p! _3 k5 n' \4 i3 ]. q  J

    - p& d4 W& m, k  w- _! n( S3 X缺点:4 U. i+ T# F! h9 B& {
    数据清洗格式简单。9 L! |, w# c, o
    数据清洗内容单一。
    # o) x/ G/ W& {9 n无法完全做到绝对清洗。. g5 l! y; i* L
    有待改善。
    ; _& x' I- z2 B: V! \# }
    # A6 |' A$ f4 Z8 n:return keyword_list, value_list
    : ?+ C2 C+ }( m& o
    8 v  i% r3 B( r5 C6 C( X- s4 Orequest.parse(3 t2 F! A6 B" w1 E6 t& R
        url='https://www.douban.com/group/explore',
    , _; d! i7 L3 l. g7 i    Parsing = 'xpath',
    % [# s% h# u* T1 r/ m! w    label = {
    0 ?$ q0 R7 b! w9 b9 A1 O# `        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    5 U) K) B0 q* i6 @4 Y7 a# p        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],$ D. V6 _8 v8 C
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]$ ~8 l, L9 |% j& Z
            },( s" [$ R' z! L- h" F
        write='result.pkl',
    ) H( N0 r3 K7 n: n- T) V: ~0 l    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',8 A. y' g+ Q, N& N$ Z* ]
        page=[True,'url_page.txt'],
    $ |7 z: M2 }5 _/ W    # bool类型,默认不清洗5 b& c) Q* f' `2 V* c; r, W( Z
        clean=True
    * O- _8 b8 L7 Q; g! t; _).run()& @/ T2 R( R; |. B
    6 W8 K' `  v0 t( p
    第八种玩法:爬虫存入数据库+ I* t- \9 U0 W7 W- J( ~9 j+ K$ b! _
    存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。) g  _% b) s+ _3 c( ^4 w
    ' E: v: k" F; b
    特点:0 R  v, x6 X3 k9 \% q; r( s9 f
    信息存入MySQL数据库。( O0 c' F, F& e: p
    可连接docker远程数据库。- A+ U+ D7 @3 P. X# M
    数据库的库名可以不存在。
    + X* ^& s% o" `# {% w( }; c7 T) e数据库的表名可以不存在。9 O) m/ T; ^- ^% f4 s* I# {
    根据之前传入字典键与值参数判断表类型。& ], R( e3 A, n" C3 V# k1 \! j  v$ G9 \
    自由建立数据表传入信息。
    # a7 Z- b. W  K: A! `) Z4 f# D% O1 M/ C( O0 w# h5 E
    缺点:
    ( S7 e# U: t  d) O4 ?" _7 t仅支持MySQL数据库。
    * ^5 M: l- G! i+ C. X; ]9 v  Q
    2 D& B9 u8 l& f" M( P/ Q8 }) b4 m+ Z:return SQL
    ! q0 ?2 I1 ?% Z" ~& R- b/ ]8 V9 h1 {% W* c
    request.parse(2 u0 c# V  B+ V8 i/ H9 N
        url='https://www.douban.com/group/explore',
    0 D* z% m( p  e/ R, j$ e    Parsing = 'xpath',
    % z( E# n# i7 h1 X2 N6 W    label = {
    , }. }% c& {  _1 T; x, y        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    / a" o/ B* E6 N3 l  l3 j+ G; Y        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],6 q4 {/ }$ c5 L) d" m! t
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]. I1 X& {; V  s$ H: D
            },! O7 n/ Z. g8 X3 b; S2 R
        write='result.pkl',) q, s, y: X' J  B2 T. y
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    + |+ J0 N  @& V' j5 G    page=[True,'url_page.txt'],
    " c8 J" f. ]: Q" D1 D    clean=True,% x. j- ^) N5 B( C
        # 字典格式,
    3 s. m8 m( P$ g% L( B    # host可有可无,默认localhost
    " Z* K; [0 \, j( E: n& r! c    # post可有可无,默认3306
    1 @9 j1 F/ r6 i8 y( v    # user可有可无,默认root* D3 i2 d5 H+ n
        # password必要参数,数据库连接密码
    3 P3 |9 i6 }3 H    # db必要参数,数据库即将存入的库名
    ; Z* [: C7 w$ `; s* B5 S    # table必要参数,数据库即将存入的表名+ Z0 l0 `- E+ ~0 f3 v3 Z& h: G( B' B
        write_SQL={# z' O6 @# |  \" _  M' l8 P. W( Q
            'host':'localhost',% k0 |1 l/ ~4 }! k5 @3 o( O* a: M
            'post':'3306',
    - n& j" Z9 E9 \8 [        'user':'root',: }2 k. Y3 v4 F/ ~4 l+ j; [
            'password':'123456',1 N$ t) d, X; U# Y3 X7 m1 s" Q
            'db':'example',& S1 a. o2 C7 {/ t% N
            'table':'example'
    5 x" G% ^$ w& X        }" ~+ ~$ e5 u2 ?+ \, ]- c
        ).run()
      b0 }6 e) Z4 \1 P! W) D! K/ o3 z2 U+ y( _& @* |
    第九种玩法:重新启动爬虫
    5 h9 B$ b9 E, e2 ]爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。7 Y( T6 \5 ~+ w6 x1 r. N# |( C

    7 W" i5 _$ @8 J特点:
    % ], F* n8 M" Z7 d# x% {) G检测报错重新启动爬虫! Q5 w$ |  {+ I; |
    无需手动处理错误信息
    * Y+ J, ]& G. u7 j( ]
    4 B- X+ }* ]: Q, G缺点:
    ) `: j2 v1 z$ A6 w6 N0 w" x( x无法收集子线程错误。. g: X" F/ K8 h2 |

    5 }4 E" H% W$ Y' N. d$ [/ w:return None! R/ n' Y: l. m

    % U- }- I* T, Nrequest.parse(
    " a/ N: u6 j3 }$ X# ]        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],0 E9 n$ B8 Z7 m" e9 j' ]6 P9 r
            #login="taobao",
    & L. `( _" G+ ^        type_url = "text",
    ! G! [0 {& D% w# x        Parsing = 'xpath',8 R  R) {3 f. J0 a" C
            label = {2 j1 j! k! [9 ~! G1 F1 K$ s
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str]," R6 ]- B) a9 J' a$ A" N2 d6 ?
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],; ]$ a; A  `, U8 s( X- D, p7 F, [" D
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]$ `* b9 i* C4 y& v& {) _4 @
                },
    " i) d" f) A; h2 P' I        write='result.txt',9 k% c# u, o1 ]8 w4 R
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',3 N- R4 d5 F9 q2 [$ W* Q
            page=[True,"now_url.txt"],' e/ k8 Q1 s# z8 ^7 Q
            # texting 参数为是否启用连续爬虫
      h; i+ E, m& j2 W        # 爬虫程序异常报错后重新启动爬虫2 V6 Y* d6 S2 z1 X
            texting=True,2 ]' R7 ~/ o- n  a- |1 w5 Y( z
            ###7 H( ]! w$ C, K3 h7 i7 Z- L; \9 Y0 k
            write_SQL={
    9 j+ }0 [: H/ {  K7 Z3 q% g& J            'host':'localhost',
    + O& R" v6 k1 T; i; k" I            'post':'3306',
    : |5 Q: p0 \. z9 g" z            'user':'root',& q, w5 G, |0 O. l/ @" d% J
                'password':'123456',
    , ^- d7 B" Z0 c! a: _  U& E            'db':'example',
    % {% f* ^; E: I7 V            'table':'example'
    8 V3 x" E9 ?. B1 u. B8 V8 E% f# H            }; t2 ^9 U' {6 o8 v  h
    ).run()
    , r  g& I# J  O7 _8 |+ y9 g* A& z1 O+ r- C. n. F( Y! O" D2 o
    第十种玩法:多线程爬虫
    $ T; X9 _4 `3 H( D$ J' n; g特点:
    , x) O3 H- W( B' |$ b爬虫速度加快,
    0 _' c! [7 }; H) d; N6 {% J6 Y更好的利用了线程。
    + K6 ]+ U0 @; ]2 Z& Y6 D
    ' p* j" ~& x& |. q( S缺点:暂无
    , e, Y* E' g( z5 Z* A& p" G" z
    7 x; S2 R6 u/ m3 ~:return None
    " T$ y9 [2 }) }' G0 M
    1 z* \! \- e" K% L) V$ @' E/ Arequest.parse(
      e5 n* l$ W) b, u: g, e) j        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    $ y: k5 W: `' n8 P; z        #login="taobao",
    ( {5 C& X. n+ Z; H; F" b) g        type_url = "text",' d1 g5 H8 O5 \! J4 @
            Parsing = 'xpath',
    % }) n. a) G: Q" l3 y$ n        label = {, a4 M( G% B7 N0 ?8 P
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    9 J3 d, Z! N/ X. }            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],' Z9 \0 D, x: [& ^9 E: L
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]( m0 ]. q9 R$ Q/ j
                },
    $ ?) D( Q- O! ?$ b        write='result.txt',
    7 D% c% {8 ~% p        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    ' c0 I/ B( T) b9 Y8 m5 H9 \        page=[True,"now_url.txt"],
      P! ^+ X: W* `4 e- u* l        #clean=True,' ~+ V% W5 z8 k- }9 _+ r
            texting=True,
    / Y/ y  Z- K9 S0 e        # status="threads" 启用多线程爬虫
    - J4 a7 L0 R# h( [# d! U        # Thread_num 为线程数目,默认为1 单线程: ?& ^, w7 [) n, k8 B
            status="threads",* \: l4 q! I7 u9 ~" K* ]+ K  I+ y
            Thread_num=3,! d/ V  `, k( f! @5 Z
            ###
    1 `- G' g' m5 T        write_SQL={8 s; x3 A9 i- x" f4 g, X
                'host':'localhost',: z6 W& N6 N& S+ V+ l/ g
                'post':'3306',
    8 y) O0 C2 X8 H# O            'user':'root',
    0 l: \& ^- O) e$ f# O4 k            'password':'123456',0 [5 ^( D6 a- w- s( e. B# Z# S
                'db':'example',
    0 z; D( }( X/ a! y1 c            'table':'example'& y: O2 X# K* L: [
                }' o5 c8 z* {2 x7 G* S- d- Q
    ).run()
    3 c  B- u% e" ]: N/ h5 c
    : C# X0 o% n8 Y; o  n3 M第十一种玩法:多进程爬虫% `- R# z  S" l& g8 H( B- J
    特点:
    3 s& d  `4 o/ D爬虫速度加快,7 p  q0 B+ n- G0 h( ~, ]
    更好的利用了进程。
    : I7 d, [! y' Q4 B, K7 R0 @6 L
    6 [8 s0 b1 J2 c3 N: K/ L) a缺点:暂无
    " V, Z5 A: E* M! ^" V
    # F8 Y" z( A3 y5 l5 W3 o:return None
    3 f3 U; j- H; u# g" ]3 U/ j! X4 ~2 M, d2 Z3 K& V( K" k
    from simple_crawl import request
    " c' R  v* k) U9 d3 k! z' Wrequest.parse(
    0 u* I% T; x) d5 C7 N        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],2 L1 A2 V! r. i
            #login="taobao",
    ) j( P' h1 X0 _1 E8 ]5 P        type_url = "text",
    7 H$ r8 V; D6 }5 [9 ]+ ]+ F        Parsing = 'xpath',1 w* {$ J3 t) \: ]
            label = {! P8 ?# \5 P* a' c
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
      ]8 h- ?2 h8 `# {) q! L' \            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],1 Y: S$ A/ J0 s3 |0 l
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]$ |( E0 ]; @1 V# a6 b
                },
    * w# b& K$ _- k6 B; {% P        write='result.txt',- ~. m" Q6 l" ]: n  {9 p
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    2 D1 d! e/ j9 ]2 G% O        page=[True,"now_url.txt"],
    % d7 K  T" G1 f7 R" K* X        #clean=True,
    % E/ Y2 _9 w. Q$ E8 e7 q) \        texting=True,' `; [- i3 {5 }' w4 K( t4 n
            # status="multiprocessing" 启用多进程爬虫# i9 q, [3 o! Z8 o5 b
            # cpu_count 为启动代码核心数,默认为系统核数一半
    4 R7 K/ u  A: p# L% I- n; z- b# m        status="multiprocessing",
    2 t) M, @& H* M/ W& S8 z        cpu_count=2,
    1 P. }9 _- e; E5 j+ ]& m        ###
    ) E7 x2 ?+ M6 x5 x) }8 R1 c) x        write_SQL={7 l% ]. `3 ]5 g3 s, V3 f
                'host':'localhost',9 Q: ^- q+ s- H
                'post':'3306',4 z  R5 o  e- k0 g: h
                'user':'root',
    - l% X+ P3 N% z' J7 G3 U9 A            'password':'123456',. o3 _7 j8 [* w2 g8 ^/ s4 V
                'db':'example',+ y- i1 O# a8 L' s) g
                'table':'example'
    8 Z0 t8 g$ H0 t& {1 I3 \/ t            }: T' q% j4 L+ [$ V; x# r5 [
    ).run()
    $ F) J2 G( W( [1 H: u; Q% \; Q: o  e7 m$ S/ a) g+ v
    第十二种玩法:异步多线程爬虫, s+ ^9 T( o# Z6 k0 Y
    特点:
    ; s3 F! H' Z. M爬虫速度加快,; @8 J9 {0 P2 s0 z2 ~* |5 i& L5 x
    异步使得爬虫无等待时间,1 Z) t) [- [5 ?( [; D0 Z  p
    同时使用多线程速度明显加快。  H6 c# H3 f4 N5 D$ n) ]
    8 J  G$ o! K5 f% t' d( D4 k
    缺点:暂无
    4 l) [8 F# c) a% v: q4 G
    8 O; Y" L; a7 S  x:return None: \1 @  R) I* g3 R
    ; V6 v7 O. C+ V( x# o) w' b8 B' w
    from simple_crawl import request
    . K- Y; t, x7 K1 M0 t3 E, ~request.parse(9 J) I9 }/ Y3 Q4 G! n4 \
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    5 D7 n, w! F* k  d        #login="taobao",6 {/ R* o) c  u9 x
            type_url = "text",) b1 z1 m( B  b3 U: Y/ V7 U' J
            Parsing = 'xpath',$ ]$ Y5 b& O8 w  E% R, l( T* @
            label = {* Y2 }  e/ Z$ `( [9 A( a5 x* S8 |- D
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    0 p* @) q4 x% n+ b& ]% L% Z3 z            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    ( R+ F$ T: j) P1 z# m            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]( M: A7 P3 b# A! w8 C! ], z
                },  R% C( l/ X( q1 C2 W$ f* W- `
            write='result.txt',4 d! ^, K+ Y) |7 P& G
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',% Y: k" {- _) z& u3 k1 M, F3 U
            page=[True,"now_url.txt"],
    3 U3 ]6 N, A6 N* Q2 H1 f! b+ Z        #clean=True,( m" A  R4 p1 K( j# x! B; P6 V
            texting=True,
    5 ]3 W$ P' w( n" \( }        # sem 参数为异步引擎数目,默认为5/ o8 ?& ]# s( g. l# k& B
            # 其他参数同上
    " A7 ]. \9 }# U, H, @, Q        status="aiohttp",
    1 w# D. \0 u7 s        Thread_num=3,7 w: [/ U; f3 c/ P0 X1 ]' P
            sem=5,
    $ A, L7 u4 v0 n! c5 ^" Z+ ~        ###! a' {" P) d+ `5 }% _, n2 T
            write_SQL={9 i. E: ]/ S, w* [
                'host':'localhost',
    8 X5 v; C# P. r- z% k5 ~            'post':'3306',
    * \9 Y$ U0 A- @# s( P            'user':'root',, |2 b% f' q1 C- h
                'password':'123456',
    - H4 ?; l6 H* q7 W            'db':'example',5 ~8 m: [1 R9 H" ]! l" n
                'table':'example'- h+ u; y9 }( t5 f& A7 M) D
                }
    6 z( D4 ^/ k0 Q3 p2 z# g).run()8 [% h; g8 V# s$ S- V. D" G8 Z5 k

    5 h, ~; h( c0 h2 z2 V  ~" g第十三种玩法:异步多进程爬虫
    . K* b4 l! }# U0 q, G' r特点:$ Q2 f) g4 D4 V) i) t9 O* k
    爬虫速度加快,
    8 k! U3 M# M, {5 _" [8 _; U0 I异步使得爬虫无等待时间,
    6 C  i7 v1 |" B- u. A* u9 J- z同时使用多进程速度明显加快。
    ) {' {1 j$ h- m& n* C9 y
    + i, O0 E9 v3 s; f2 k- v( e$ m缺点:暂无% p% \9 L* Y. z4 C- B# u  Z; m
    2 z( ~" g/ V- g' s+ B
    :return None- B. ~' |2 B, d9 D- L- ]* x! X% m8 ?+ ?# e
    ; P7 s$ S+ c9 |
    from simple_crawl import request0 M8 {: ~+ X! e, \+ `6 `& |
    request.parse(: D) n" w: Z/ |$ O) C6 A
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],( ?/ f. q) ]* G
            #login="taobao",
    $ c' J4 Y6 O$ x; D+ M        type_url = "text",
    8 X! L6 b5 ~5 c7 O7 j/ }        Parsing = 'xpath',
    3 v& q& V  ], b+ [7 j        label = {
    0 Y! ?) `6 M8 a4 w- E& g, A$ H            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    ! f+ X2 i/ J/ w% P5 ]7 g+ @* a            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
      [. r3 D" X  E. ]            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]4 E& W: x7 D/ ^7 d2 d1 ~8 B1 F( C7 O
                },& ]) r3 }: H' U9 a6 i; Y
            write='result.txt',
    0 ~1 L* b' R% N. s7 Q' a3 _        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',) C9 N( U) @( q9 r
            page=[True,"now_url.txt"],
    # K6 r1 y/ e% d  J- Y3 ?        #clean=True,
    + }- r" d) P7 u3 w* q9 t  P9 @5 w6 C& [        texting=True,  e& N  S8 H9 l( d2 R8 d" M8 v
            # 参数如上0 {/ _' l8 ?  |" `
            status="between",
    . f8 V( R6 U; Y) I8 h! E        cpu_count=1,1 r) m$ m- @  q0 j# Q6 e
            sem=5,
    * {4 p, A; b  w        ###
    9 y  b4 h4 X5 R1 o: e! T        write_SQL={  X% Z* d9 Q; `8 V
                'host':'localhost',
    ) J; U( ^7 t$ ?1 B; g) L! R            'post':'3306',) _( m8 \0 a' E! n3 d/ y+ _' ~
                'user':'root',
    6 \! D. j. K* ?            'password':'123456',- ~2 Z! L( L2 t0 e5 n' H( f9 }
                'db':'example',' j. ^0 t) b$ u' W. M2 H, o
                'table':'example'. W! P# v3 q/ Z& k0 t' W
                }  V  u# s6 [  n1 b. H6 n
    ).run()1 b* q# I: Q6 C' h

    $ o! ~5 m. U0 `# }- k- i  Q& }
    " f' j! A4 O/ |3 @功能介绍完毕🤞
    4 l+ D& o% N4 k2 l最后还是希望你们能给我点一波小小的关注。
    / X9 }+ `: s, N  x奉上自己诚挚的爱心💖
    ( H/ {% u3 s/ V* t5 W0 t————————————————
    / r6 T( B+ w1 b1 [' l. b/ u版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。5 U$ b2 y7 W" B; E& I& K: [; ^
    原文链接:https://blog.csdn.net/qq_45414559/article/details/1060056844 {2 ]3 }( Q+ ?) d0 l' k  H. C5 r

    9 S. _* J" n3 `" M# I, Z# y, y4 Z8 m! m1 J
    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-4-19 16:07 , Processed in 0.465952 second(s), 56 queries .

    回顶部