QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5625|回复: 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
    9 n7 T1 C2 i' B4 h; k& zsimple_crawl: a& S- I1 g5 W  e, p0 y7 a
    仅需一行代码即可达到爬虫效果) r* M/ U/ q' d8 l' V) T
    项目地址(欢迎star):https://github.com/Amiee-well/crawl0 y3 l: F: u$ q+ u
    使用方法
    , J5 j6 o0 ?# m* R, s3 Npip install simple_crawl2 Q+ ~" V, n$ E- @* m
    2 F3 d9 Z2 c8 s0 Z& v
    ### 以下源代码为简单介绍,详细功能介绍再源代码之下
    , M7 D* X. d/ i( k' a- i5 X% ffrom simple_crawl import request
    # ]5 U; B7 `+ G3 W& Xrequest.parse(
    7 x; m/ r: H& i6 t# |8 T        # status 参数为运行状态,支持单线程多线程多进程协程以及联合: t/ O4 @+ M: f1 y: C. y/ B
            status="aiohttp",$ N/ V  |6 Z! e" d3 [1 k% I
            # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式
    5 l3 ]* L. Y; R3 \7 N! f        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],* M  [7 `: _% ?0 h: i0 F& C; M! c6 P
            # login 参数为获取登陆信息,如淘宝等网址需要登陆信息
    ! V9 {3 S8 e' y% g0 o    #login="taobao",8 A4 U- ]8 M9 l# {, {$ s
        # type_url 参数为返回源代码格式,支持text和json,默认返回text
    : D/ P) t3 F5 G8 W" C9 _9 X7 D    type_url = "text",
    6 e. c* [, a* }! F" W6 {/ f$ F    # Parsing 参数为解析方法,支持re、xpath和beautifulsoup+ g4 a/ ~: U$ f9 O: ]
        Parsing = 'xpath',
    5 ]+ g6 s& _# l    # label 参数为爬虫解析过程,字典格式,详情见下方/ F! `9 i& X. V* C( }. L$ o+ ?5 O1 d
        label = {" d8 s6 w5 o. C" z
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],! L; u8 J8 `' S; G% J1 O" u
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],4 A- @+ B+ E2 X; ~# }5 B! J
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    . A5 ~% P6 B0 R$ i3 l" m% e- }$ `     },6 Z' Z. r/ R$ N8 J# a: F
         # write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱# Y# j2 W0 u0 w, D9 Y6 `
         write='result.txt',
    ' j$ |. @0 |  W9 K" W( O' Q. w4 _     # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫, D1 G7 g8 D5 g
         next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',* Q5 f) F/ |  M7 g
         # page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫' ?/ J5 W. t+ I, E1 y7 y
         page=[True,"now_url.txt"],( w4 W2 b5 {$ d" ]
         # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息
    : r" |# ]9 p% C; S, L     #clean=True,
    * k- W. s- h6 B7 d     # texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序. f# x3 ^8 u  b. ]  @( v  V0 E% ~
         texting=True,7 {/ M0 i- z1 k) s/ U' ]' P" \' l
         # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态
    + n% |3 {) D. E; q6 O: \     Thread_num=3,1 k) ^/ ^: L* H" a2 o
         # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态9 \0 [* ?1 ?$ ]! J* m1 c" v
         cpu_count=1,5 Y7 P9 i+ y5 L$ Q& c
         # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态
    1 }: u+ O( S9 k: {( G0 H% |     sem=5,
    7 f( d+ [# o) g6 E- w0 e     # write_SQL 为是否写入数据库,默认否  \& z, D' M7 `. T" s9 ^/ u2 Y8 ~
         # host 参数默认localhost
    2 b4 J4 A3 V) P9 i) r3 P7 t  `     # post 参数默认3306
    1 E) x) L8 l; v% E# |" ^" s     # user 参数默认root. y, n; Z9 F2 j8 p
         # password 参数必填,必须正确+ g. E' u) {4 ]  N4 h/ m+ V
         # db 参数为即将存入的数据库名,若不存在自动创建
    ) v' ]: \! `5 J& ~* q     # table 参数为即将存入的数据表名,若不存在自动创建
    0 a$ t$ n' @% t- ?7 v     write_SQL={
    " O7 R3 b+ F! p+ p2 H$ L2 Y7 M         'host':'localhost',' v  L4 S- _8 i# t- [: O: ~$ ^
             'post':'3306',- j# Y, ~4 _" _/ `
             'user':'root',
    3 W% R; h6 I6 }- t- t  _         'password':'123456',! n4 b4 A3 p4 V/ a3 Y* ^
             'db':'example',1 U$ v6 X- c( P& c) b
             'table':'example'
    ( K" |9 Z$ M5 V      }( a& ]- E7 a0 b3 {2 z
    ).run()
    ; S1 f  Z7 Z& S) ?0 {
    + |2 F6 G6 T9 _* u8 \介绍一下crawl参数设置:
    0 Y$ M* r, Q% O$ @8 ?1 v2 Q' I+ _6 y* ^. r
    '''
    " q# e" E+ R, {9 @单行代码爬虫程序执行
    0 m/ r5 O. k. J2 Z9 ?' L+ y5 X:param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档5 _1 o, m6 L% \$ }- s" \2 x: Y
    :param url:即将请求的url地址,仅支持get请求, R- m! g* h; G* w
    :param type_url:请求url后返回格式,支持text和json格式返回1 X  p2 ~2 ^; z. A2 |- |9 Z( o, E( n
    :param Thread_num:即将启动多线程个数,默认为1单线程
    1 C8 G; W4 b; [7 h% B:param sem:协程信号量,控制协程数,防止爬的过快,默认为5; N, B& v$ z- A
    :param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半
    8 K" _6 t- q- w1 y% w% O:param login:模拟网站登陆,保存登陆信息
    ) m* i, ^2 ^" U0 Z8 c2 d& H:param Parsing:爬虫方式,支持re、xpath以及bs4方法1 \- r& s1 ^* Q# i2 W" i: D
    :param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,* o4 A" ~' M" k. ?
                           多次报错结束程序,默认否/ Q/ L5 s- l' u9 V* Q8 G
    :param label:选择器内容,字典格式保存,) m+ s  p# {9 r  p4 e' ?8 D
                         字典值为列表格式,第一个参数为选择器,第二个参数为转换类型
    3 T  Q' O' D/ j# j" Q$ ]                     第一个参数必填,第二个参数默认str类型
    ; N/ o, b( g; o8 a5 E# k:param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否) i1 A" ^, @/ c7 ]$ ~8 y
    :param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫9 m/ s# U$ u4 t+ d* W
    :param page:是否选择断续笔记接手下次爬虫处理,默认否* Q2 O# m* V2 \$ r( B
    :param clean:是否进行简单类型数据清洗,默认否
    ' _& y$ \" j. B; W2 e; W* [. N5 I8 \:param write_sql:是否写入数据库,默认否/ ?+ U2 A2 N* w9 n! H( [
                             'host'默认为'localhost','post'默认'3306','user'默认'root',5 Q' L. Z; c/ S, I
                             'password':'密码','db':'数据库','table':'数据表',
    ; O: V. P2 {3 z2 C. a                         检测库是否存在,若不存在则创建,若存在则直接插入,- `2 N8 F" g/ j
                             检测表是否存在,若不存在则创建,若存在则直接插入
    ( n3 `% n2 j$ w6 d8 i4 ?7 A- G- a:return True/ j# r  k9 X8 L. }: }/ g! g+ `
    '''
    5 c# @7 V4 h' p9 M& n" r% P- F# ]介绍玩法
    0 @3 H1 n) d( d# u$ x6 o  ^. x接下来介绍的均为调用第三方库的情况下运行:
    1 N" |7 k, i! U, q) ~  J0 Z3 @7 w* }! C2 d, Y% Q  H
    from simple_crawl import request
    + C6 i4 P( m: ]' ~0 s第一种玩法:输出源代码  o2 K; Y# B: F/ T  M6 {
    调用requests库进行源代码请求。
    ) S& ?1 |1 c" S% o  [, K- |- O; g& ^3 k  f
    特点:
    / r, K$ T2 Y0 i6 w$ I% P& E请求失败则调用ip池处理重新请求访问,
    8 M0 I: D# M7 ^! S出现五次失败默认网址输入错误。# l! R* |- u& i: S3 }
    支持text以及json字符串返回。默认text。. V; x$ Y4 D1 o( _$ ^
    7 c) D' ?' u  T9 x8 \) e# I: h
    缺点:  W7 D! b/ G- _+ G4 x$ h
    暂时只能进行get请求,不支持post访问
      t, `3 o9 u9 \% `- [) ^
    ) O$ _4 N7 w9 B. s1 [0 v  n:return text or json
    4 a' j0 u$ a, x9 r5 ]
    9 c2 }; @, q+ S+ S% C& Drequest.parse(: T; d6 M8 |. _3 @" X* A
            url = "https://www.douban.com/group/explore",4 T+ h3 v$ m/ z) m7 @' {
            type_url = "text"* m8 i. k( j1 j
    ).run()6 k/ j  E6 ^0 ?% f. X* y
    # return text9 r0 G, K  r1 ^9 x, Q

    ; }3 C, s- H% G/ S) D# a2 }7 [第二种玩法:模拟网站登陆并保存信息
    - _- J# J) N6 k调用DecryptLogin库请求登陆访问。# _0 V) E) H& F$ y

    & r( @9 Q/ H8 ^& p( Dps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源  r+ Q) }) ~! I$ d: v" h' k0 l
    在此放出文档地址1 F8 k" r8 w- V# x. ?9 _! u0 l9 V
    DecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/  [+ \3 X; ?5 f  y' X
    . W2 T# v$ J+ j; G" \
    特点:
    * J$ q6 i2 ~& D将DecryptLogin库中二维码继承到此库(非二次开发)
    8 H6 ^' B$ B$ W" u2 M支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆)
    4 u& B4 B5 W  T$ e" x; ?$ N保存session.pkl信息到本地方便下次登陆运行! A7 P; `! p4 u, `- a4 p3 ^
    & A# f' J4 `% m) _) I+ _. c# \
    缺点:: a6 v6 t5 _# b& z* L
    session.pkl登陆信息过时无法自动删除。
    6 {6 e8 \# Q- D导致下次登陆疑似cookie无法正常登陆。7 ]$ g4 O6 s% e  y- R

    2 X6 }: u) W" w5 B3 \5 @" M:return session
    + @! V$ `8 Y  C6 A8 i) z6 x; T4 d/ L7 L3 c# @
    request.parse(& P7 Z! s/ K  g$ e3 m
            # 臭不要脸的推广一下我的店铺- L5 o( b3 U, D" }0 A: X. b
            url="https://shop574805287.taobao.com/",
    " D+ p% x8 N0 O7 z  R        login="taobao"
    " {( @. ?6 U2 R; Z* a- g7 w).run()
    / N- {$ e7 ?: e2 l3 L+ _- k# return text" T" a7 _5 Y" D8 N# D6 U& I% S

    ) Z2 B( ~( P" Y9 u8 D9 u. E第三种玩法:爬取网站信息) [- L( `* I1 U7 J
    爬虫库自然少不了爬虫的过程% N# F- n8 }, p; s2 A- l: L
    8 B3 J" a( l+ a5 y: ~6 `( g
    特点:+ B' C6 r' z$ Z% ~8 n
    支持re库,xpath解析以及bs4选择器。* v) D( t; i" q" g# w4 y
    爬取方法为字典格式。单方面输出。
    - z- q' c& k) _/ w$ S/ p' B! T字典键为保存的字段名称。
    " M! p4 ^+ [5 `, e/ I( h, T# ?. m8 B字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。
    : ]% S% n. S3 K2 I
    ( V9 N; Z$ c7 t# d0 b% f4 Q缺点:暂无(等待小伙伴们发现)) |1 b/ G% T( Y0 \+ {
    " D4 X, j) w0 ?6 s% D  M
    :return reptile_results. o% m$ K# i  |$ i! [; ?! ^
    5 `) h6 ~& Q" _
    request.parse(2 o, }, s- {. j' B. X. X5 H7 T
            url='https://www.douban.com/group/explore',
    & O- q" p4 s0 ]3 N& w" n        # 字符串格式,选择器方法。
      A7 U7 p6 j' T2 t    Parsing = 'xpath',
      z" W) S# x# U9 W5 g# I4 e3 Z+ b( P/ P    # 字典格式,参数如上。% L  w( _' i- W3 K4 o& A% q7 s
        label = {
    ( C  z% e4 f( \! Z" |        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    $ X1 f- U5 B; \+ V: [; F# c) C) U5 O        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    5 V$ X  L, O; z% I& C- W9 r        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]8 y) P$ x. T8 ?9 T, {  s
            }2 F- a0 i' \/ l% z
    ).run()6 Z0 M( n# ]: ]2 q) [' n
    # return reptile_results(list)
    ! w; P. v* i8 ^# L) F; b; Q
    . f: b, y$ K) X& ^- g第四种玩法:自由保存信息
    6 S- H) u+ N6 o目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。' {0 `/ m# z* x! e

    / A$ u1 D5 D( n2 z- C2 B特点:, p% D. I( v8 \) {$ O2 j
    写入文件均为数据格式传入文件。
      k; Y$ D) J6 S且输入格式规范方便阅读and省事。3 O5 _2 E  W4 K2 t) n
    $ T9 f+ b* @& f! |4 M) v
    缺点:9 w1 ?- M2 q, i% _' Q& u
    保存格式仅四种,# G( u- N6 f+ u# `% ]
    不方便用户之后读写操作。
    1 `6 {& |0 @6 j. T, K8 z, Z# V, f. O  D: `; G
    :return file3 M0 g. W$ D  g( f' I4 [

    & Q% s) G& ?$ qrequest.parse($ q/ U  ?6 F! D* ?
            url='https://www.douban.com/group/explore',
    $ a; \; a" \! z+ [/ G    Parsing = 'xpath',7 t3 m/ l1 ?7 |4 `: n
        label = {
    ' A/ k& h0 [! C  I- }5 I        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    ( w( |) c+ S9 r        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],# m0 a5 v# F/ R4 _3 X
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
      u# F) U+ E  M, b7 F" Y! p7 T        },
    8 i% _3 e* E4 E9 a    # 字符串格式,具体保存位置填写
    $ |7 E. Y3 v3 T  K# X3 d    write='result.pkl'5 U$ o9 q" E3 \! `9 D( m4 ?
    ).run()
    " Z$ y0 o4 `3 y1 n% O" [- [# return file
    : |  J' x) D/ s* c2 T+ w2 Q/ p7 S
    第五种玩法:读取下一页 url 地址继续爬虫( I2 i3 x* _8 T- V5 V
    这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~  q" i) z) o4 `+ J! U  ?+ l) S" r3 i

      p* I7 x- f/ \特点:
    $ [8 k5 G: _9 O6 H, g1 p' b$ O继承之前的Parsing参数选择器选择方法。( z/ N: @; \8 X5 P+ _- w# `1 {/ I
    在这里可读取到解析后的下一页 url 网址。
    , o) p% G' T- e方可继续进行爬虫处理。方便用户使用。
    . f1 O2 y! {4 b: U' Q/ D% |4 t3 o9 A9 W9 d0 k$ p
    缺点:( \' x: B* r1 I
    若爬虫时下一页 url 地址改变,便结束爬虫。4 d$ p9 X1 m5 }0 w8 o
    只能爬取所给 url 地址中的信息。
    8 c! F  o' s) j8 |无法进行某一界面的多个网页爬取返回。
    / D, x+ R& m% z1 N$ Z& A造成访问页面单一流失。2 ~) Q5 o2 E9 q6 m+ @7 j
    # a' U. T& O* _% H3 j
    :return None0 s! C) z6 u8 ~7 n$ K4 k! y! r! P
    / G( B$ ~# P/ }9 r- ?3 A
    request.parse(
    4 n+ a* w5 k: |$ R, H        url='https://www.douban.com/group/explore',2 i5 ?; y  m  `8 ?* A( u, Y7 w
        Parsing = 'xpath',! ]) f3 ^. Y; j6 L2 Z
        label = {
    ( r5 x7 k# G, [- K, d        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],, H6 I; q) m  C4 b$ U  T
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    ! Z. q( Z9 s# w) F9 W5 e# L        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]* S& v$ d0 ~( e
            },
    % d$ Y6 V( T# |. N    write='result.pkl'," \  ?, Q6 ?; T' u2 }
        # 字符串格式,根据Parsing方法继续请求下一页a中href8 K8 r. P7 p, z/ a1 l9 V
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',  ?. ^4 p& V  L$ l
    ).run()6 f2 \, c/ n2 Q' N/ @
    # return None
    0 [+ x8 ]  @9 P2 j6 z7 o4 x+ I5 r% K9 K/ U. i& e' Z8 G
    第六种玩法:爬虫网页保存
    ) t7 j# N# M- Z% P听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!# D$ J2 m/ @+ f# z

    8 y& P- U0 _( q( R6 J特点:, T0 [9 _; _& m
    持续输出断续笔记。
    4 [% e2 i) k1 Q# Y4 m- y  N) U# W" z8 I将此次爬虫的 url 地址保存到一个文本文档内部。
    # A6 |+ l( m4 Z  w- t下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。
    7 C# a& c5 t3 `# ~; s; h
    * @. ~2 r; K1 g0 b- F& {+ w缺点:
    / e0 z0 ~) r1 `7 Y7 i* U) u读取内容不单一。. V# f8 k- X; V% X
    导致下次爬虫无法正确读取上次爬虫留下的痕迹。, s6 O$ v, P, g3 x9 N
    & h! U% q9 p$ J" P- G, G
    :return url_file* u6 o# H  t4 b1 E+ M. w! E  b

    9 \6 H# y6 ~% Z/ m0 j$ E" yrequest.parse(
    : M1 [0 V: t5 H; [0 Z    url='https://www.douban.com/group/explore',9 Z( b! m% M: g1 O& s
        type_url='text',6 R+ E8 b2 K. g" L  E) J: e8 `9 {
        #login='taobao',: P$ F, [& x7 m. `# w8 {! i+ h
        Parsing = 'xpath',! F4 b0 k, b+ z# V8 J
        label = {: N5 l6 b4 a7 `# \4 _
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],5 f( C% l8 ?5 B" U0 O/ w# N% J0 Z
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    2 s. |+ m9 S  G" P. P, L  |, `/ ]        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]  _& S( [, l( {7 j6 x  u) k. c
            },& w$ G2 X& D0 s  _2 V3 u
        write='result.pkl',! b6 n2 j' ^, [- v& x
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    $ \9 ?' n$ m3 B. b    # 第一个参数为是否需要断续笔记。
    ! r& J7 O; X3 e) s5 N% }0 X" s0 l    # 第二个参数为断续笔记保存位置。/ e2 X7 U$ _6 V3 {6 A/ J
        page=[True,'url_page.txt']
    ! e7 L$ K' G9 R' C; c).run()
    5 H, u. Y! I7 N; |# return url_file8 K7 V$ x3 O5 G$ t3 h+ y2 e) ^0 n' E9 Q& G
    * O/ ]! V/ [0 J
    第七种玩法:简单数据清洗
    5 C) V9 _! t0 J7 r0 q( k2 y数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。; A4 T, T6 C! u% B' A# S6 c
    + C. a8 [% e; B# |& u! O+ I
    特点:
    , t- _8 F" [7 `; v" t4 G本人曾写过一个底层数据清洗。; u. ?, Y" P  p- A5 H1 ^
    能将列表格式数据进行归分清洗。2 ^/ |& P& U, Y. D; b
    主要内容请参考另一篇文章: p! Z7 t& \9 n/ {0 |9 B/ M
    如下连接:数据清洗+ A1 U- q5 m1 A* P+ G

    ) @# t+ I" L& z+ Q; f2 y缺点:; R3 s5 V! [, r. I) b
    数据清洗格式简单。  j8 `- ?9 r8 I* g/ H" f$ {& E
    数据清洗内容单一。8 @0 r2 Q( C. L" B$ @  b
    无法完全做到绝对清洗。/ ~7 @  s. [( T$ [6 n
    有待改善。
      j1 L/ T9 v1 H' P1 g% N+ g# `6 Y4 ]3 ^% a$ f: z1 t+ k6 G) v
    :return keyword_list, value_list& y4 f! X$ Q5 y" x" O, b, G% u: `* Z

    0 i/ S; X; o" s& Orequest.parse(' E$ H. t, C  ]. }5 A( b, v
        url='https://www.douban.com/group/explore',
    & _# k4 i: F9 Y; z. @$ ]    Parsing = 'xpath',
    : a: B2 v* n- V: Y3 r    label = {
    4 J3 g, G2 O1 E& R        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    ' A8 D# Q8 r& h6 L+ c        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],2 |# g" p# t4 Y4 X
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    9 i' f6 q" y1 x0 g4 i        },
    ( l6 d; ~1 d: Z0 a1 z9 `3 K    write='result.pkl',$ j9 S9 Q! y: i" \8 D
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    5 c: |& B7 T# h) b    page=[True,'url_page.txt'],
    + J- V' g2 x6 ?3 ^8 H; s) L    # bool类型,默认不清洗
    + D, q9 r( G3 C& V    clean=True4 n" c; x+ S- d9 a5 A
    ).run()
    5 K7 J2 M. ~) L' t- X+ N
    7 N( n( _3 u% x4 U5 b* r第八种玩法:爬虫存入数据库
    1 m0 k3 t! t7 _/ e* M4 t存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。- A7 l$ a, k  E

    9 f" e! C9 {0 K; {: t* i+ v  _特点:
    ; ^6 j, i5 A. ?( y0 _4 t信息存入MySQL数据库。
    " [& K; |0 |3 W* @可连接docker远程数据库。
    ( q0 t$ y' x3 t* h9 Q! X数据库的库名可以不存在。0 ^0 S# S& c( C+ f- h1 H% M4 [
    数据库的表名可以不存在。
    ' F  v" I! E* T0 K) z9 g根据之前传入字典键与值参数判断表类型。9 P2 s* y; j7 @. ?) d4 l+ i* h, y
    自由建立数据表传入信息。: w/ z( e' J& [
    3 m  ]# ~) w8 }9 i, A. d
    缺点:
    + h4 u8 H: Q- R+ p2 b4 f仅支持MySQL数据库。
    , U6 `/ {; S4 p6 w, ]
    $ v& J8 Y+ x1 @7 z: D; x- [; s:return SQL
    # }$ t8 t1 u; \) k- {% X$ |) i" c7 \: O4 [; J/ `
    request.parse(/ Z4 N5 N2 [3 p0 @& `9 D. ~; Z
        url='https://www.douban.com/group/explore',! b; }# z$ C- P
        Parsing = 'xpath',' D) E; V+ ~# F8 J) A) V
        label = {
    9 ~, I* [; S: p, V( m( n        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    # c0 @2 e9 T4 c! M        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],5 b: n4 q* P/ A8 k, K# u
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]+ o6 ~3 K& T- c5 h1 v
            },
    . ?$ s5 W# [& I  q  Y    write='result.pkl',: \0 K! E. @: F7 |
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',1 q* D1 n% r5 B7 F- o) T2 [2 ?
        page=[True,'url_page.txt'],# l) S9 I5 h# [# i0 t) C2 z
        clean=True,( [4 e; L+ L$ F/ E
        # 字典格式,
    3 u/ K" C5 E% D6 q4 x/ Y    # host可有可无,默认localhost2 f7 a0 o& K4 A' `( q  d
        # post可有可无,默认3306) P& F0 e7 ~9 l* a5 Q! \" m, M
        # user可有可无,默认root
    $ ]8 Z1 [4 T  t( I    # password必要参数,数据库连接密码
    : G9 v6 m# q7 j; Z    # db必要参数,数据库即将存入的库名: {/ G* e! e5 E
        # table必要参数,数据库即将存入的表名) B! r" B$ C1 h/ G% K- r
        write_SQL={
    " N# i- _4 V4 K. n9 ~! S  M        'host':'localhost',
    - I/ {* C) u. @! l* D& D; Y; [4 M        'post':'3306',
    % T# F% ]. K, Y4 }5 r" `        'user':'root',8 E" h4 e( B! K- h4 v
            'password':'123456',
    : E- g0 W: p3 ^% @5 @6 Z# C        'db':'example',
    $ q+ `, l5 Q1 H+ N5 B7 y        'table':'example'+ d! ^, ~# k- ]% L4 W7 R5 n
            }6 O9 L- ]* F" h/ E
        ).run()
    - \4 ?. X# A" E0 i* v( m) ~# M5 E' Y# H5 G9 Y6 D) L6 M
    第九种玩法:重新启动爬虫
    ' J0 w) s! `7 f爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。2 l2 W$ `1 M( g1 ~$ {; S

    ' Q8 `9 v+ E; R; v特点:
    2 f! r+ F$ i! e! {+ B2 p/ x检测报错重新启动爬虫& N8 \: _* p0 w! }2 |, U- n# D
    无需手动处理错误信息
    * u8 t. n: F# u6 E: Q  Q
    # B: Y, p! |- p缺点:! Y- E1 G& j4 I
    无法收集子线程错误。; ^- f( B, F& U' L+ o/ f2 ?% O
    2 u" k& f6 |5 S
    :return None
    5 a; D' ?+ q+ P- A) y( u" A- V8 O1 G5 s& W7 u  J% `3 K
    request.parse(
    , M( M* J2 a+ L        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],. t  Y+ ?% a/ O, W' ^( U
            #login="taobao",
    / m  I! b9 Z7 R* [' Y        type_url = "text",
    1 Y  V& Z5 h3 t5 _6 v        Parsing = 'xpath',
    # r0 K0 {. G, ]# U! p        label = {2 ]/ n8 o. x# R  I9 A+ R* ~# L8 {
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],7 T9 C% |' F  K# s1 W2 u
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    ( Q, F' }" N7 N5 o/ E+ r3 y. }            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]1 V$ e. `6 b# G9 J
                },& K5 m# Z; s# s" _; w
            write='result.txt',' b( g& A$ A$ K" s
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',& ?7 i  N4 x8 ?6 Z, J9 j
            page=[True,"now_url.txt"],
    $ _( v& {4 P9 q) t  Z        # texting 参数为是否启用连续爬虫
    6 [- \3 G4 b; w        # 爬虫程序异常报错后重新启动爬虫
    + A' ?" q: |* @' m! g; ^        texting=True,
      ]5 q% k2 |, n, o4 w/ {        ###/ M7 M$ d9 c9 i+ L/ D% n+ j
            write_SQL={# Q9 `. N4 Q6 E! N, A' l
                'host':'localhost',6 v8 k- a5 M8 X3 [
                'post':'3306',
    9 g& F( A5 V9 ]' |            'user':'root',& _9 v) B$ s2 _9 ^) ?2 ]( M
                'password':'123456',
    ' X+ p; f4 ^7 h. J9 F8 N            'db':'example',. j$ H7 S7 Z2 u# I9 y+ ?
                'table':'example'
    & l. I2 f; p, c3 T9 Y            }6 N+ D9 M" i5 U! B
    ).run()/ }6 E, r; F. I& i9 Q' l0 e# q& {

    ' ]- P) Z" O5 m9 T- N, F+ m第十种玩法:多线程爬虫
    & E/ O( W. S2 q! {特点:" \8 z. Q7 i, ^( I6 r4 K1 c
    爬虫速度加快,5 h- H  q+ E5 |# G; ]3 a  C' p" H
    更好的利用了线程。
    $ r- _* }4 E& F# @- O. L; [# D% a1 y$ N) z$ h  k/ w$ X% ~' ^. j
    缺点:暂无* J& @" n7 b5 m( |

    6 \/ i; C% W2 A+ g% v* }& M( ~9 y:return None1 q( i- M; Y" R( V
    4 I+ f$ ]8 o" J0 r
    request.parse(
    / ~" P9 y' e/ Y" J        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    7 l5 E. a& y$ _4 {, Q5 a        #login="taobao",
    * c& S9 p# j, Q) T: k        type_url = "text",8 _0 R$ z# a; }% Y# i" P! v
            Parsing = 'xpath',
    7 R1 @2 i) w+ i* Z! _        label = {
    % Q* ~# r8 ~9 B! I' ~* P" u6 K            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str]," u4 T. I0 ^+ ~. T7 N& x( M6 K
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],* [& m7 A6 Q0 E5 a; L( G
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    1 M* ~) w+ B& O3 y% q3 \" x            },
    % t7 w( n; o  z" U7 s  G4 X3 [* X        write='result.txt',. }! N9 A9 o4 @
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',2 R) I/ K. S& l4 N. G# U. a! N" M
            page=[True,"now_url.txt"],9 S& x& ^8 s5 d+ O% U/ W7 e+ o
            #clean=True,
    5 |8 ]/ ?# ^3 X) c; B        texting=True,
    , k# Z" V" O9 ]7 T3 c' f$ [        # status="threads" 启用多线程爬虫0 q. S: n; g9 o. L' y; o% B
            # Thread_num 为线程数目,默认为1 单线程. E2 N0 {( M) B
            status="threads",
    - o8 q. {3 I0 @7 R$ Y4 \        Thread_num=3,
    1 o3 D$ R) g& r. i- @/ Y1 T        ###
    2 g% @$ G) \$ D8 ^$ @        write_SQL={
    3 C/ {  y: T8 |% c. R            'host':'localhost',/ C( c% ~/ F) \  p- y
                'post':'3306',& x1 C" \  u. t: n+ P; N! U
                'user':'root',
    & M+ I' Z2 j1 U8 M. o. W( g            'password':'123456',& a$ q: `4 |  t* u, m$ e( u' f+ ]
                'db':'example'," C# n1 t- X% W) c1 ~& n# R# l
                'table':'example'& D5 S# A8 U% P& o# s/ ]
                }  o0 h8 E- A  a! B  y
    ).run()
    ( @& l! ]: T( d+ K1 l( Z& m6 F3 c- w0 e1 n7 }- s5 ~
    第十一种玩法:多进程爬虫
    : h  c+ W6 [: B1 g9 d特点:5 i  F- l- f0 U+ @% Y! C8 O- \( F
    爬虫速度加快,
    . W% X- @3 w( O1 N4 s更好的利用了进程。
    ( P+ z! t0 C) f6 g! f
    " q* q8 m, r2 ~4 m9 U& {缺点:暂无
    4 E* a. c3 H( y/ T6 i' L" P4 Y; q
    5 i' T* V# S* ^% v:return None. X7 h5 e4 E" n4 _% Z
    7 `& ^# C0 L- N8 y' V2 Q4 n
    from simple_crawl import request7 w5 _! C9 S- ]0 H2 D# r$ G
    request.parse(
    9 N& ~0 g" ]2 b        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],9 e/ t. V* I+ f. P
            #login="taobao",
    ! i( m$ D' ^% [+ v' l+ h8 u2 I        type_url = "text",
    - P# w* y9 u$ M3 _- {        Parsing = 'xpath',' G1 w% v& N6 S: H# I7 |8 S8 K
            label = {3 ^6 T0 S: {8 D4 V$ v0 ?0 ^
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    # J2 x% u8 P& B# s7 D1 I            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],8 i  n/ ], f  B1 q
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]1 T5 Y* `" \) ?4 n6 _7 E& B
                },* l' `$ ~. e4 c, o
            write='result.txt',
    8 o5 ]# f, y3 |        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    / H9 X# P& S& `( ~0 y        page=[True,"now_url.txt"],
    * ~( x+ s; |; _) w        #clean=True,
    2 V8 B) I0 W. h7 S$ H4 T) `! W5 p        texting=True,
    - F# r+ H, D0 j9 |! [        # status="multiprocessing" 启用多进程爬虫
    ' J# H' J/ i( }' D" r7 ~, ~9 A        # cpu_count 为启动代码核心数,默认为系统核数一半
    # O1 ?  P* G0 I+ j8 W        status="multiprocessing",! v, W7 L5 w, ]1 t1 q* D5 Y' ]# E! ?# D
            cpu_count=2,
    $ `. ~. s! T* T9 s        ###
    & |3 H( P* {; S! }        write_SQL={
    & s  J) r0 Z/ v) \            'host':'localhost',
    ( e6 I! k& o' _% t3 P            'post':'3306',' X6 H. P  |. J( k" X
                'user':'root',6 f% V- `  W  [2 x1 c
                'password':'123456',9 ^. t% r8 ^, q/ u
                'db':'example',3 z9 y7 m9 o2 D  A8 C* t0 ]* X& _
                'table':'example'* r0 U4 X: J# @% F
                }; \- P% M! j- K
    ).run()
    " W& a5 M. m& s6 K' a( U8 V7 d% a4 |& }" x
    第十二种玩法:异步多线程爬虫( O0 h2 T% T, m1 H
    特点:# y$ ^' A/ N/ z* T, }
    爬虫速度加快,1 X6 N) p0 z7 H+ H0 K9 j
    异步使得爬虫无等待时间,, }( U# g" S$ Q( c9 |
    同时使用多线程速度明显加快。% W* Y+ I* @2 P! x9 a+ |3 \0 ?: `

    8 s/ e- Y4 k7 |6 Y缺点:暂无
    4 t# E. G! u" k' y9 B+ k+ k, g% T. {; w" f1 i: C# C
    :return None% M, x# v# v1 s) g; N1 Y
    : f* C' r  i+ T8 B+ o' F
    from simple_crawl import request
    1 w: f% G/ R+ t5 i' Y) Xrequest.parse(
      j" l  M1 q9 ?: h        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    $ y" G$ V, O4 C9 u% B4 |        #login="taobao",: i" d1 F- b' H9 m
            type_url = "text"," h- k1 b3 g7 S8 ~2 t/ A2 m  A; d
            Parsing = 'xpath',
    + k& q/ j# e8 o5 s$ ^  w        label = {. u% O- G3 x; q# N: `
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    + X3 e+ i' y$ F. ]            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    4 [, ], o* ~! n0 C8 d# M' Z            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]" c1 ?; I& U, l& X% Q
                },2 o0 d" }6 S! `9 L
            write='result.txt',
    / E. |1 J( d4 }/ A8 |( Z* R9 n        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',5 O* W$ O0 T- }
            page=[True,"now_url.txt"],
    * m  |# P# ^- ?4 c0 g        #clean=True,
    3 V# J  c1 B& K+ I4 s        texting=True,' @/ |6 h1 |4 D% p
            # sem 参数为异步引擎数目,默认为5
    ! v4 A+ F4 H; p% R: g* p6 [        # 其他参数同上
    $ w, o$ j& ^) y: k" i+ N        status="aiohttp",$ N+ [9 S( R' y- |: g* F* N0 |
            Thread_num=3,0 E" |! [. w2 Z* @1 K4 x& |' {% q
            sem=5,
    3 U" g7 g- V& H1 t7 L        ###( t5 v! E; g0 }# _( A  ]
            write_SQL={
    4 o# b! B6 ^( [/ ^  n% d            'host':'localhost',
    2 P8 ^1 m3 G* c) M! V+ E" J& B            'post':'3306',. E% y/ y: e9 h& y% u! H! M
                'user':'root',
    6 l3 M5 h) S9 g/ p7 g4 Z6 ~4 ^            'password':'123456',
    , D# R2 z+ P. [: D5 c            'db':'example',0 j5 s8 C. U( [4 k- ~* V
                'table':'example'
    % H# e' x% d( k( ~1 u' @/ I$ M            }
    0 x# Y+ M; A: H  g! t5 \- K; ^$ J).run()/ U# Q  A- l2 {1 X/ i- L& G* g
    7 Y2 B; k/ ~! w) L+ q6 Z) @' S
    第十三种玩法:异步多进程爬虫
    5 q, Z: q, U1 k! i# R1 w特点:
    - p: ^( x+ B' X2 |) @爬虫速度加快,
    9 k, s) C% u' |6 \- ^4 k异步使得爬虫无等待时间,
    ! L: x+ d: G+ t' _/ X8 E' x同时使用多进程速度明显加快。& {1 J* z/ O! P7 I

    + ]: U/ F$ ^2 X. v* v7 U' y缺点:暂无
    + _. u$ O  h/ r8 Y6 q# {
    . O6 h  k0 M% F4 s4 p. t# I:return None- I; P( j3 |$ o3 F# o( f& g- y' A

    1 E# G- ]* K8 _/ ~* I; |% \from simple_crawl import request
    1 z& c' B- y3 `5 nrequest.parse(8 y, s: }* d8 y- @+ F+ M
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],' a  o- ~2 L# F, O3 g
            #login="taobao",8 K6 O+ P+ E6 @$ G& a* I; E# P
            type_url = "text",( h! h- v; u3 n! ^
            Parsing = 'xpath',
    . a% ^+ y8 H3 F, J* P/ z: R! O        label = {
    4 U, ], |2 ^$ J. W            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],* l9 X( m6 |, j- R
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],8 S" v1 W; x6 c* S# y! {
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    * D& J& }7 ?# l: R            },' y; s* _( Q3 P1 q8 f" |
            write='result.txt',2 L7 R, W  t5 T2 Y/ |
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    * n3 C3 b7 Z5 E! l        page=[True,"now_url.txt"],
    ( g/ a5 b5 d( Z# u; ?# p        #clean=True,1 v5 y% P8 q" v
            texting=True,# O9 T) D5 _9 W5 M  `
            # 参数如上8 c2 ^; W- i, E1 e% @, g  z
            status="between",
    ' x/ Q! c9 G% Z# _5 Q        cpu_count=1,. [4 |9 `4 }6 t& f5 R9 Z
            sem=5,
    ) b8 D+ P# W8 V2 b8 J, D$ o        ###
    0 V, z# ^, }( P* v        write_SQL={0 P. R( p* {  R4 J; X
                'host':'localhost',0 w" v" }1 |4 i
                'post':'3306',$ V. Z0 p  q; I
                'user':'root',
    0 ]( N4 H- G# U7 v" _0 x( m            'password':'123456',; s/ a/ Y: ?( o* l$ N2 N
                'db':'example',
    ( \# K1 C" i% _* H6 i' ?  p            'table':'example'3 f, Q1 H$ m$ G3 Y3 y
                }
    8 f% G/ d3 t6 i- \( N( z; x: v).run()8 p  w' K2 K) b/ N5 J7 b8 m7 I

    ) t* J3 F5 F$ p/ ]. a" |: L6 W6 `& i# u6 ~& S
    功能介绍完毕🤞
    / C2 G3 Q& T, P7 R4 e& f; M最后还是希望你们能给我点一波小小的关注。! ?7 o1 d% W6 [2 I4 p; ~
    奉上自己诚挚的爱心💖0 v3 x9 I- d# Z) i4 Y
    ————————————————
    . i; g4 Q2 O- ~( p/ I版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
      K3 A- x5 X# x* G原文链接:https://blog.csdn.net/qq_45414559/article/details/106005684: w, |& F, y( Q+ h* p6 Z- j
    " e3 l4 H. }0 o, S: I

      U  g# i7 o% B* N8 t/ w4 C# M
    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:50 , Processed in 0.202105 second(s), 55 queries .

    回顶部