QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5499|回复: 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_crawl8 x: x0 q% M* c' Y) }
    simple_crawl  S3 b' f( X+ W1 y! C" I# d
    仅需一行代码即可达到爬虫效果
    $ k( ~0 z# j( J8 M# S项目地址(欢迎star):https://github.com/Amiee-well/crawl
    & d6 q* t: v+ H' _2 }使用方法% r! D0 _( O2 g3 g0 Y
    pip install simple_crawl
    * J8 W8 k$ v6 U# N  V: |# N. ], E( P2 b6 _6 b+ v
    ### 以下源代码为简单介绍,详细功能介绍再源代码之下
    5 ]/ c) s5 w. Q9 y9 w' S; Jfrom simple_crawl import request# F* ?+ O2 N4 T3 Q3 C: j
    request.parse(" D1 \% F4 T# E. O4 `5 A
            # status 参数为运行状态,支持单线程多线程多进程协程以及联合0 |2 @. B  S/ a2 f
            status="aiohttp",
      `: c. G/ `- c. j" \3 z9 v5 c+ R+ E        # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式( P7 k: o1 z1 f& `4 P3 \
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],7 C5 ~4 g, Z$ h1 z, e0 b) X
            # login 参数为获取登陆信息,如淘宝等网址需要登陆信息( j, C$ T4 o( r$ }) Y- N& w* i6 V
        #login="taobao",$ I* n3 `- v8 s. b7 M% M/ J6 r7 u. t. n
        # type_url 参数为返回源代码格式,支持text和json,默认返回text; e; e  @: Q  }: y
        type_url = "text",2 {, h, n) m3 L0 y: O! V/ k+ N# u4 R
        # Parsing 参数为解析方法,支持re、xpath和beautifulsoup8 G4 C7 Q+ [0 Q7 z/ F' Y  v' ?8 @
        Parsing = 'xpath',3 ~, \  t3 N0 e0 A* S% I0 B5 P! c
        # label 参数为爬虫解析过程,字典格式,详情见下方$ {) q* H0 B9 g
        label = {
    3 z/ ~! p( o2 l; [9 g8 s3 {, |  v" b. E            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],: a3 i! Y$ `5 H% d4 a
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    + o) L8 G  t2 y  z9 I% y& h            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]$ u$ L& Z4 G7 [7 \+ R
         },
    3 }( ?6 b( l, @/ j0 C) e" b     # write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱& d5 [, ]- D$ [' o5 [" v) d1 R
         write='result.txt',
    & B- _' I6 D& V6 C3 m3 a     # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫
    / C- H1 O( @' Q& m" f9 p  A     next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',- _+ E! Z6 T0 P
         # page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫
    / ]' U! N- A$ H& G     page=[True,"now_url.txt"],% I' H1 ?3 G" n  o( z
         # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息
    , |; F/ |0 N, @; x     #clean=True,3 A8 k% r9 t4 B
         # texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序
    ! a2 J" |2 Z+ X+ m* c2 `- f     texting=True,( S; J$ r' W' D8 P5 ~/ P) u
         # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态
    - s3 S' Q+ \! _( h7 v     Thread_num=3,  p# d& ?( ~, X, N! W$ W& X, _
         # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态
    9 u/ o% H8 t5 M' z# _     cpu_count=1,; V) |2 n; O  q  N( B
         # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态
    4 j* X" z$ Z. W5 K4 e: W+ h( _     sem=5,7 ~; N" p  y8 P8 Q
         # write_SQL 为是否写入数据库,默认否! _! `) N" Q9 n) z: U
         # host 参数默认localhost* ^% @, h9 d$ \% o
         # post 参数默认3306& k0 `8 j1 T6 T3 y
         # user 参数默认root, q: q# h  \8 `7 j  ^. J
         # password 参数必填,必须正确
      {  C) H$ W1 L' ]5 H- f4 i     # db 参数为即将存入的数据库名,若不存在自动创建
    " u1 I( Z+ k. e5 v0 K* E  M- N9 Y     # table 参数为即将存入的数据表名,若不存在自动创建
    : p% Q! d1 X4 x3 K     write_SQL={" _, M  C3 l- [) W$ v
             'host':'localhost',; z5 C+ l, x# o: Z' K
             'post':'3306',9 q" k5 G. C! a4 _: E
             'user':'root',6 x( C+ w6 a! w4 R, S$ R/ _
             'password':'123456',
    5 U) p0 D5 x5 X; S/ i         'db':'example',- J$ Z7 M/ A2 k6 n
             'table':'example'
    0 ?. ~* _% ^* ]% c8 o" s) I      }
    # o% a& p& Q& N).run()
    * Z. ?; W# S1 H
    ) A0 Z, P) C% H+ m( V7 f5 Q# ~# J介绍一下crawl参数设置:
    & M) B* ~) u; n  O, l  s1 H& {/ n
    : {1 H- N' \9 e4 o7 K, Q'''3 c' y7 D( J) L; |! f* Z& d+ s) P
    单行代码爬虫程序执行: R' y( K5 Y$ F7 ?
    :param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档
    . L4 j$ @( S  @( m$ x0 V% |:param url:即将请求的url地址,仅支持get请求; U9 x' [: ?  M' M7 O
    :param type_url:请求url后返回格式,支持text和json格式返回2 e' V2 _3 k1 m& _: Y
    :param Thread_num:即将启动多线程个数,默认为1单线程  d! I) |/ a2 j+ y* O3 p
    :param sem:协程信号量,控制协程数,防止爬的过快,默认为5& i1 l* [3 F+ x! i5 y
    :param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半4 P5 r/ ^6 n. S- i9 C; X& K( G+ K
    :param login:模拟网站登陆,保存登陆信息0 b: [* D# y7 u) E# L
    :param Parsing:爬虫方式,支持re、xpath以及bs4方法! @) n; p  A% M0 l6 P3 v0 x( s, w$ d
    :param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,, C2 P) Q* {2 o( q8 K& c0 d# `* g2 @
                           多次报错结束程序,默认否: A0 a3 `+ c: P, w  ?
    :param label:选择器内容,字典格式保存,
    1 H: t% |. w- w  A2 N3 \                     字典值为列表格式,第一个参数为选择器,第二个参数为转换类型4 B# F; c5 ^. m
                         第一个参数必填,第二个参数默认str类型
    ' W2 @- L( o& C) H8 {/ Z) R" f9 [:param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否
    8 m+ V) P$ a* B. T2 B$ h( [:param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫
    , @% _+ B! G# Z; l4 g0 a:param page:是否选择断续笔记接手下次爬虫处理,默认否
    ; s  D( A7 h9 L3 z( ^+ v; s( ?:param clean:是否进行简单类型数据清洗,默认否" w% ~+ }- t) Q
    :param write_sql:是否写入数据库,默认否
    / m# }! b. P% ]- ^: `2 k                         'host'默认为'localhost','post'默认'3306','user'默认'root',
    " m% k& D% `3 ~2 t" x! L                         'password':'密码','db':'数据库','table':'数据表',
    ! D' z1 L! P. R8 C1 D3 l                         检测库是否存在,若不存在则创建,若存在则直接插入,
    " Y, U& ]3 J  M; H& {                         检测表是否存在,若不存在则创建,若存在则直接插入
    . ?0 c0 S, g0 H: W& @:return True
    9 b1 d: i- I- h+ F7 ?5 o5 j'''. @/ U- A- ?" X8 r1 c
    介绍玩法$ _7 j  u/ H3 V; l) E1 Q
    接下来介绍的均为调用第三方库的情况下运行:
    0 i" Z* F& m" U4 W/ w4 x% A! I0 s, R
    from simple_crawl import request* ^5 R- K1 h5 X$ r" i; E3 Z$ M
    第一种玩法:输出源代码
    " U% S( W5 }, A# i% V调用requests库进行源代码请求。% C% {! ^. U  C3 A% Z8 ~4 O% |7 ~1 ~

    : f6 m& P4 W0 B8 g* E( `' R特点:1 k) t% \5 X) l" s" V5 R
    请求失败则调用ip池处理重新请求访问,5 P; l# [' L3 D4 B) ^' H& G& T
    出现五次失败默认网址输入错误。7 c1 @+ x+ Q) {  L) E
    支持text以及json字符串返回。默认text。1 V1 P6 w. @$ e  n7 V9 b8 d

    * y+ u, F" ~6 d' a- Q% `缺点:
    , H) t: U' j. D# }) D& d暂时只能进行get请求,不支持post访问' U- w- g+ s: c

    3 |9 q7 Q9 Q: X( }; v/ @" _7 ]0 V:return text or json/ Z0 N8 p: C- s: ^
    5 c+ M. A& A- ^8 O
    request.parse(1 x2 f/ d; u$ E
            url = "https://www.douban.com/group/explore",
    9 F- _, |. P0 D: o        type_url = "text"
    ; m5 X: ^& F2 P).run()* P0 H* Y5 e" I5 Y, D$ ^: J' o) t: U
    # return text4 C8 X9 q8 Z1 `6 n: R/ Z; `0 q6 D

    ' }) P* E  P. J% V$ N4 o3 e0 Y2 ~第二种玩法:模拟网站登陆并保存信息
    4 U% p9 [& ~8 C- u6 e' ~0 F# x- M调用DecryptLogin库请求登陆访问。
    5 ~+ L2 v( {4 w0 D  V5 t0 g$ t& r+ t1 h
    ps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源3 R. c9 T* Y- F7 i0 [  k
    在此放出文档地址
    7 o5 e! I* y2 X$ _DecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/
    $ b4 l' D2 S" H/ v! p0 J- h! a- n/ X% B; t2 R  d0 Z  e- P
    特点:( ^0 s$ ?5 W5 B9 y% u& m, ^
    将DecryptLogin库中二维码继承到此库(非二次开发)  b. g3 A( N: A
    支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆)
    8 v/ W3 {7 }, U- j5 z0 \$ t0 o保存session.pkl信息到本地方便下次登陆运行
    + ?* d; `) @9 @8 Q6 v8 D+ w0 ~$ ~2 k& A
    缺点:
    ' l; d% }. j* C3 o! {session.pkl登陆信息过时无法自动删除。
    , Y5 }  x& m# W8 t7 \导致下次登陆疑似cookie无法正常登陆。, m8 M) g, a6 f
    4 a9 k: U- D& C
    :return session
    2 }3 Z0 d3 X; G: A0 I6 @. |
    9 ]" Y/ y7 x$ |5 R: drequest.parse(6 a0 S# C5 a5 @$ n3 o7 j
            # 臭不要脸的推广一下我的店铺5 I, i5 V+ P+ q3 f
            url="https://shop574805287.taobao.com/"," B4 f( f! `/ {6 @3 U6 O
            login="taobao"
    $ O8 B& L9 Z2 B) e).run()' J/ D6 E3 ?; h) q& ^
    # return text
    4 l7 t+ Y) f( m( |8 G9 |/ G
    2 F5 Q& i' Z: j: ~第三种玩法:爬取网站信息) E& v% c. c: N3 `/ k9 d' k
    爬虫库自然少不了爬虫的过程
    " D* K) h: J  w! R% m6 m* g- O% ^1 n
    特点:( D* S  ?+ i6 i; E) F! M6 o; X7 R
    支持re库,xpath解析以及bs4选择器。4 u) g5 j* Y' r& e8 W0 i3 S$ o, }
    爬取方法为字典格式。单方面输出。0 J) Z% s. x8 `( j. B* K) I
    字典键为保存的字段名称。
    , m; h8 y8 @, j/ e字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。
    " T2 Y, B) ^. h) V6 d; i
    " {  a9 g6 q8 V: ~6 e) c* a缺点:暂无(等待小伙伴们发现)
    : u2 C; b/ n5 u
    7 d4 P9 a' k) v. R  D. u; L7 Z:return reptile_results6 z  b/ c9 W  N+ w0 p( s' P$ V

    * Q. t* z: k7 q- Frequest.parse() ~: t3 I% g' b0 K; `2 k  o
            url='https://www.douban.com/group/explore',
    + d6 h7 S+ Z7 I% \1 \7 [9 R% u        # 字符串格式,选择器方法。
    4 d1 p  q* s$ r) e* A) M    Parsing = 'xpath',0 ?0 Q. p1 U1 r, v8 x$ |- w
        # 字典格式,参数如上。
    % T: L' H2 a  n    label = {
      e; b8 M% @* y        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    ' _8 j2 u6 ]' r0 q' k, E( e( a        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],( ~$ t& |# Q/ r' l3 U
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]0 A: i  a; v- o1 I- a
            }, Z# D; w' ]/ s! }7 [" W, W
    ).run()
    ( e& P$ ^1 }+ y; G# return reptile_results(list)( l# `2 C( w5 B1 f# ^

    + ]+ K# T# m2 z第四种玩法:自由保存信息
    1 a0 }" }) u- [% X( s0 o4 o目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。# h: D% D* b( o

    ; J+ M! H9 t: m/ m3 x1 @特点:
      @$ ~% A6 W- ?% N, U' H写入文件均为数据格式传入文件。* L5 E, X/ `3 q3 r  L4 k
    且输入格式规范方便阅读and省事。6 w: B9 X" |9 X" e# ^. p

    ' H# g" M/ H8 _1 ~  \& K* B& w$ B* o5 n缺点:
    8 Z; k4 s8 {4 y) O, s  G7 z9 |保存格式仅四种,/ ~& R: c3 e6 [
    不方便用户之后读写操作。5 v# Y9 Z3 ?! c9 L& ~/ A3 S: Z! O

    2 w, X# a6 f$ o2 T1 Q4 H:return file
    0 n' m8 x' R+ g% S! N% o3 Q6 @) T" {* V% ?# C6 ]/ G+ y
    request.parse(9 h3 z- k4 i7 k% \6 j$ y# A4 r
            url='https://www.douban.com/group/explore',
    # ^7 O5 a6 u) a( d0 e    Parsing = 'xpath',+ u! n3 z7 p- b2 g0 M1 v
        label = {9 k& {- f+ W7 c4 y0 Z* I
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    2 C$ b& m; v9 a+ v        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    0 V1 H% H* o- Y        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    / y3 k! J4 |- S- T. H! U' m        },
    0 G1 d/ ]$ N8 e! d8 l' U    # 字符串格式,具体保存位置填写9 Q% W1 W4 G$ P+ G* ]+ y7 z$ a
        write='result.pkl'
    7 A2 D+ [( `' ~9 l7 Z).run()
    , }/ l9 P, J+ k- O' V: Q4 E# return file2 ^' H% o% k4 d2 H, Y1 K3 b

    / V3 o: J% e4 |; I; U$ ^第五种玩法:读取下一页 url 地址继续爬虫7 U' \4 U& u. t: u% A0 J) u
    这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~
      U/ s* `0 C7 ~5 ]8 k6 _2 q, X
    ' H6 Q8 X  B- ]1 ?$ ~! P' g* o; p特点:
    3 ~# _% m4 b/ t% b2 l9 u% V继承之前的Parsing参数选择器选择方法。
    % o9 Z& Y+ t5 p4 O) k在这里可读取到解析后的下一页 url 网址。% A+ w6 z3 n0 v; F7 T/ `' @  z
    方可继续进行爬虫处理。方便用户使用。
    : J- s3 u6 i/ m0 p( r! h
    % w8 Z+ X9 W8 u! ~8 D7 ]缺点:, a0 M$ {$ u- @& {+ e6 O! l3 l
    若爬虫时下一页 url 地址改变,便结束爬虫。; O+ ~1 k+ N- I; \# n. H
    只能爬取所给 url 地址中的信息。
    1 h0 k* _  ?# r8 o) j8 k无法进行某一界面的多个网页爬取返回。
    9 p& S& R7 q7 I' X造成访问页面单一流失。# {) ]: m( a# @

    + @/ j( W: R2 b8 Q:return None0 Y6 O$ v2 c: `' N, @

    8 w& u9 g6 L# p/ R* k; q  Srequest.parse(
    6 N" `& y# ?, q- l; E        url='https://www.douban.com/group/explore',  Y! [1 w+ J- j8 {8 D7 Z
        Parsing = 'xpath',
    ! O/ F% d- F/ ^) Z5 s; t4 K3 s    label = {& n/ r4 d6 m" f
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],: u( z( m- V% z* N5 U8 [: V
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    ; U) T; m4 A4 f) m+ |8 n  w, p        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]( H0 R6 b, s( P, E1 z9 a
            },4 E2 [! X3 X/ p- E0 q
        write='result.pkl',
    7 z) h, F% k* Q  o5 ?# X5 i    # 字符串格式,根据Parsing方法继续请求下一页a中href
    5 z  m) x$ O! F2 r( c9 L3 H    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',  V( ^) D8 m. q; _1 W0 r% t
    ).run()
    + m) Y1 R6 ^8 x* u! s3 P# return None
    + j# S" s/ f: b7 I- I, M" l. i
    ; y# g/ r8 R( u- [, r第六种玩法:爬虫网页保存4 L: `( k  T2 k; J
    听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!
    ) x. w+ m* Y0 w, }$ o: m4 `0 N6 a3 F' w" G$ e: Y2 L
    特点:# o- y! S& w( G1 a: t8 l
    持续输出断续笔记。
    * ~5 K$ q7 j- K: q将此次爬虫的 url 地址保存到一个文本文档内部。
    3 H) b% Y# `4 ?" p下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。
    4 b+ k' s5 D. m
    ' T  [4 a, O3 W% }# k缺点:
    / D4 J& X  P$ i& W9 f  @+ \+ I+ K# f读取内容不单一。' U* W% u) A$ C- C( q2 Y
    导致下次爬虫无法正确读取上次爬虫留下的痕迹。8 K; Y. d2 j% X4 H' H1 E! Y

    % x, {) t2 F6 O7 G5 f* w:return url_file# P0 H, ]! ^- ?9 A2 `  X

      J, D1 Y$ {5 U0 a. [5 d6 Brequest.parse(* M5 h. l4 x8 N* n8 T
        url='https://www.douban.com/group/explore',2 [+ u0 G7 F# K5 N* T! a! n
        type_url='text',
    1 L/ E$ h% V' t6 c1 U: t7 [    #login='taobao',
    ( I) r$ F( q) V$ x; u    Parsing = 'xpath',1 _/ b* O2 V4 t) G. @
        label = {
      q% T) X- C9 \  P' m        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],% c2 y3 ^. f6 h) q. J
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    & |* {* v2 l5 O0 W# f. N9 I        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    2 j4 H4 n+ O0 _( a5 \        },
    3 \' J8 w6 m8 n  K% m. F  T) P    write='result.pkl',  N" V! I0 v9 X7 T
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    3 w8 U2 }! u: R% }3 U" O6 @& c    # 第一个参数为是否需要断续笔记。+ r( v4 Y8 ~+ P0 L
        # 第二个参数为断续笔记保存位置。
    1 u8 g' W0 P- H5 L8 l1 ^    page=[True,'url_page.txt']6 r6 V7 V- y3 S5 S' J
    ).run()' D0 ~  r5 A; T
    # return url_file. Q' f2 |. l( D5 d2 T# g
    % u4 k# h4 C4 Y9 H" d
    第七种玩法:简单数据清洗
    # }& b7 z1 |/ c/ n7 x数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。
    * Q; c! o8 e: N4 a; i: D
    ( ]4 F4 \) ^# E8 b特点:
    $ R2 Z$ }. j  p# E, b7 f/ Z本人曾写过一个底层数据清洗。
    # d2 f$ R8 L- i能将列表格式数据进行归分清洗。  [) k3 r  M$ d
    主要内容请参考另一篇文章2 P# \; o4 d+ _9 o6 C7 r7 V- L  v) Z
    如下连接:数据清洗
    + p( E9 J3 J+ m% j( T2 V; C' |: u% }' I; T0 c5 \+ u7 s' h! k; c( G
    缺点:
    5 m+ c2 P# S: p& }) |; [数据清洗格式简单。
    * T! D) J4 L1 S$ M1 n8 D2 c# z数据清洗内容单一。  y/ S5 Q' t, b' R  W0 @
    无法完全做到绝对清洗。% O/ c9 J, g+ ?! y1 [* e: p
    有待改善。2 U0 w: V+ e) l0 d/ C. c
    - N: N! r7 A( l
    :return keyword_list, value_list8 i1 M0 |+ I8 x6 s6 [

    4 N9 o& e/ Z( @- zrequest.parse(
    9 h# Q! w8 D7 {# i' Z    url='https://www.douban.com/group/explore',
    ( m; u' p# p  F% T0 I4 i/ [4 n3 l8 y    Parsing = 'xpath',
    % N+ e& A0 p% M8 r; S    label = {- [: [) \/ c/ Y5 I! ^
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],& Z" a6 a! `& i- h7 [
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    . j; O  o" ^) E/ [8 F& q$ T" v        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]* S3 ~" n- b$ j, j% {- ~4 ^
            },
    + A. Y4 Z3 q  G8 D& W0 y  v    write='result.pkl',1 w. c, C4 R1 ^1 o
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',+ C# i7 y2 S# O6 u: h& i6 N2 I1 c
        page=[True,'url_page.txt'],
    4 A2 {0 u+ p, M6 n& j    # bool类型,默认不清洗6 {2 P9 c. U* ~, r. I) k
        clean=True
    + |, E/ h# ^: ]& O; b. T).run()# n4 f# H" h2 s( q8 C* |

    2 u2 b" H. e- V第八种玩法:爬虫存入数据库
    : E# y2 [0 Y# j) y存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。$ r1 t3 d! L) L6 w; w

    - j; [, C; u9 n1 p' n1 q/ ]特点:& T% o9 Y& y' c
    信息存入MySQL数据库。) ~) G; S7 r6 Z! T% z! P% U
    可连接docker远程数据库。2 ]  v8 |. S/ Q, ]
    数据库的库名可以不存在。
    2 K+ P7 S1 c) y3 b) P* z; u数据库的表名可以不存在。) S/ J6 i+ ?* n. Z7 P
    根据之前传入字典键与值参数判断表类型。
    4 L  C# C6 k- n' y1 E自由建立数据表传入信息。
    . o2 g, @, s- X  G! G" ]0 o# K! Q7 A' k; }/ L
    缺点:
    6 Y+ E% e7 B4 C" y7 y仅支持MySQL数据库。
    + k. S5 C# U1 v% ^( ]+ K1 B  w" a4 c' q& Z- }% `- ^3 p
    :return SQL: c  N0 R/ t+ ~" t$ l

    % }+ J; W, n6 a4 t) U' _request.parse(
    2 a0 d9 j' E; ?) |5 F) H* M+ l8 t    url='https://www.douban.com/group/explore',9 P' N5 @& I: o& J: o  J4 g+ u
        Parsing = 'xpath',
    ' v( a" c% H' }5 }* }, ?    label = {$ m0 P) H5 ?3 K) V$ R" r
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],5 t& j$ }) M9 W2 c
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],; E5 U9 M6 c# I# q: k4 x' L
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    ; ?# i! u3 X+ k& C        },
    . ^7 D6 }  k/ I; d% @    write='result.pkl',( F2 P& T7 R$ _9 e7 i
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',5 D7 {# Q( I2 ?
        page=[True,'url_page.txt'],
    0 K; T8 x1 q8 B) j8 M) c    clean=True,
    * ^( \1 Z0 }( f' H: |  _7 V! s0 }( g    # 字典格式,& B/ _. W- V  I$ u
        # host可有可无,默认localhost
    5 q4 t- n; T# Y) n- _) Z8 g5 I$ q    # post可有可无,默认3306: ^8 g6 o* o" |& O7 _- Q- m+ A
        # user可有可无,默认root" `6 i, F4 \* y; g
        # password必要参数,数据库连接密码9 z; ?$ r4 \2 e7 b
        # db必要参数,数据库即将存入的库名
    / I# k! m' l; m, k, N) S* h$ w2 ~    # table必要参数,数据库即将存入的表名1 e: v. F  z* q' X) D, v3 ?- g7 T$ Y# x4 t
        write_SQL={1 F' X9 F- C, l
            'host':'localhost',* k# ?9 Z# s% I+ I3 A2 ]
            'post':'3306',
    / Z5 _) d# v9 G        'user':'root',' e* P. E1 ?! o) B3 @$ Z$ a
            'password':'123456',
    # r& J' P% k0 L& x' b" D        'db':'example',: Z* B! O! L0 v  Z  Z$ H5 @
            'table':'example'
    7 W+ X7 e* G2 O" u7 v        }
    2 d+ q8 Y# ^, b9 F7 F    ).run()
    + D) F0 H6 D  Y; m- i% n0 D/ N. d6 U- Q( i: r% ^4 W
    第九种玩法:重新启动爬虫% k  z3 b8 K9 m; l/ E# Y+ I
    爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。, |$ i* _& f; a" _2 y* x

    . {7 o  Y2 G" [0 `) X1 v6 }# E特点:
    % z4 \/ I1 q% u检测报错重新启动爬虫
    & \$ f0 }. ^! l无需手动处理错误信息
    % t5 o; j9 ?3 I- n/ Z$ P" X" |+ N) c
    缺点:
    , K9 G# i  ^9 L9 {无法收集子线程错误。
    / e: y- T+ ?! L! F# m: u
    2 F0 k  ?& F; d. C$ M( v1 m:return None5 ]8 M! y$ e+ @  I

    " i) h4 T! y. F% {request.parse() N: i5 G4 v* ^# A0 Y
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    ! c# o" B' H7 A# t* i! R        #login="taobao",
    ! m/ g+ k# [+ F' r3 Q        type_url = "text"," g+ V" r0 p  s
            Parsing = 'xpath',
    ) {) ]4 Z* C6 q" G: ?        label = {
    ; A$ g' Z! E7 n0 R            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],9 V" m' I; ^1 K, D
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    . w+ o/ b6 _0 D/ ^% e, h            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]. |( q8 n( }- L4 @/ Z; i* r% k
                },' r0 i+ }& F( ^8 p) g8 \7 ~
            write='result.txt',
    ; V! h) Q& `- t6 x, a* {- _% P        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    8 ^- d0 }4 S2 J: c1 O/ Z        page=[True,"now_url.txt"],
    4 b6 t; Y/ |5 N5 U3 K- z        # texting 参数为是否启用连续爬虫2 g4 W. a. t; k. h2 N
            # 爬虫程序异常报错后重新启动爬虫6 f% X3 y4 N# U& B# s7 _& u: ]) _; s
            texting=True,* Q+ }8 ~7 Z) H0 p
            ###
    / J; c) v* u- f- a+ i        write_SQL={7 C# [% X/ q6 z0 }  t, B. o
                'host':'localhost',8 H. R# {; _8 a1 m* {
                'post':'3306',
    9 h8 Y' a& ^8 f3 W/ K! s+ O            'user':'root',6 n2 p7 H8 i, i
                'password':'123456',
      F9 {# _0 e0 U8 F3 o% ?' V            'db':'example',5 |% @' s+ R1 p- J# u
                'table':'example'
    7 K- B/ u% M, o            }
    - B, T& o3 \: a) B).run()3 B6 o3 x4 Q7 t

      d1 L4 T+ c& D8 p3 o0 x- x2 I第十种玩法:多线程爬虫) Q3 m1 }' Z+ u
    特点:7 {2 M$ G2 s' m7 V7 B
    爬虫速度加快,
    . A9 c$ Y: P! o2 l# n  L5 w更好的利用了线程。1 ~/ T* e* e% T( b& h

    # i- n) ^8 P( n0 I3 U4 j缺点:暂无; t3 |7 @9 E2 E" T

    & m4 q5 E9 p5 q! ]:return None
    / z1 p) ~$ M$ v/ n" O5 y
    $ F& ?& N9 D! `  Arequest.parse(
    ; p& v( _* \4 b6 j+ }        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],3 C1 C* G+ x. `" @7 G1 R) V
            #login="taobao",  R4 K- N, }5 _; j$ ?0 K
            type_url = "text",; E6 T" f/ E- V! v; L. k; B8 d
            Parsing = 'xpath',! }2 F' j$ F4 h% y% o
            label = {
    / t' ^& R* j" j3 C  m5 l, Z            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],& N  H- M9 x) |- O( F6 X" K
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],/ \. ~* a4 I! g. p
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    & {8 f; v+ a2 S% t            },' O. S+ N% h6 m  J) z
            write='result.txt',
    ' J6 z) Y" h0 O        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',$ u  E# n2 R& j% o' u; l6 c
            page=[True,"now_url.txt"],
    ) D( P1 B$ I; @3 n4 H' V2 s        #clean=True,9 e  ~% L* m- p: X( y
            texting=True,/ A  e- q% N1 Q, E+ {, J3 @+ g
            # status="threads" 启用多线程爬虫: |; T0 b+ ^: k2 o
            # Thread_num 为线程数目,默认为1 单线程
    $ `4 Q, C9 h4 `; p% r1 ]        status="threads",) [  w$ _4 n3 Y
            Thread_num=3,
    # ~- O4 D7 F' h9 ^        ###8 T4 y: _! ^9 u1 h3 Q
            write_SQL={
    5 }! @4 g" `5 h% z9 S$ m9 {            'host':'localhost',, `) D/ O2 ?/ U9 X$ U
                'post':'3306',
    ! C" Q2 m  J8 L6 I6 b& q0 g            'user':'root',
    3 B! U& p5 p! E4 a            'password':'123456',
    7 }3 V" T1 o+ ^/ C6 J            'db':'example',
    3 X! }# Y) p" f& b! l            'table':'example'* c  B$ z8 d! g: G. h5 |) e+ Y& K: U
                }* Q+ c' c* ]+ W* f( n1 d: N
    ).run()5 H  {. X2 }& J2 g
    - T: \: }- v, G4 e1 @& c7 j! _
    第十一种玩法:多进程爬虫
    , r, c8 F8 y. N/ W( G0 y/ j特点:  R4 P% B6 d  A' [
    爬虫速度加快,7 q8 w5 h, v. m& O$ y8 z9 W
    更好的利用了进程。  k9 S  w! Z/ W1 w7 T' o" Z  W* n
    # Y, H5 |5 M9 H* r" v0 f8 u4 o
    缺点:暂无
    1 I1 S3 |- H/ C4 j% B: Z, X8 e  @3 f: m! v: l* V9 U
    :return None
    ; F7 z/ I- P( H. r
    , D" K$ i; T/ z8 l3 t0 efrom simple_crawl import request9 i& _5 z/ ^/ `7 _2 d
    request.parse(; d" l& ?5 [+ K) K  }9 {. Z
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    . V/ d3 Q* P0 D9 P1 S8 O        #login="taobao",. f; [- h7 R7 P' L, P
            type_url = "text",' S* P1 z+ C0 T) [( N
            Parsing = 'xpath',
    8 J3 [6 W& X5 g$ Z2 }+ e5 K) v        label = {
    8 g: N( {0 t8 l4 D            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],% z! N/ u& B7 Z. Y% e
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    , H! N9 n1 g( w( _% t( @: l            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]6 n. `# q  u- K8 b. I: p  {6 z% T
                },1 p7 V8 B* }8 P
            write='result.txt',8 Y& Q% o5 X  y6 V; T" R  b9 F2 K
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href'," Q( {- n5 q- Y  e
            page=[True,"now_url.txt"],1 l- D& g9 U, ], I1 d
            #clean=True,
      n  l0 w5 O  T: M        texting=True,4 w; w: F  r2 r& `9 Y7 I9 b
            # status="multiprocessing" 启用多进程爬虫
    2 |( r6 i8 P( p        # cpu_count 为启动代码核心数,默认为系统核数一半
    3 R5 u+ `) S4 U7 k, ]0 P        status="multiprocessing",* F7 A( o& g' L
            cpu_count=2,7 q' f* W( D( b, H4 U9 _% n
            ###
    7 B/ ^+ r5 B9 a' K' E        write_SQL={
    : C5 V& R$ q  K5 c/ ^  |5 X$ p            'host':'localhost',/ p2 V1 k# e5 J) f/ |' u& j2 p
                'post':'3306',8 v2 B: e  t; X  N2 N
                'user':'root',, A2 c) U: t8 c
                'password':'123456',
    ) M- P' J2 }7 y9 r3 _            'db':'example',) y$ Q( @4 D$ ?  V$ x$ C
                'table':'example'6 W) F# w- |% K0 ?
                }
    2 j  d( N& J! Z# f).run()8 `0 P" t9 P% n; D7 G2 k; o, F

    ' c  Y$ D2 |& I& ]第十二种玩法:异步多线程爬虫
    0 k+ Q: x; A' s% S! X6 ^+ K: d特点:
    , [5 v4 r+ X  a6 C4 v爬虫速度加快,
    , q8 A  r3 q# `  A2 I9 G异步使得爬虫无等待时间,
    # c; t- b/ q1 k/ A同时使用多线程速度明显加快。* O0 n+ g9 `  O! Q

    ; `0 s& n! r! m( Q6 v- z1 I9 o缺点:暂无
    ! x+ R0 Z. x- R' e! _, ?& o2 x# o( A6 }+ P4 g) ?% f* Z
    :return None$ i# R) p/ X0 ]/ F

    % h- Y8 i4 F/ z" \" |( N6 Y! ofrom simple_crawl import request
      \7 ^7 Z, m/ @- q2 hrequest.parse(
    & E& F# ^7 b# q8 Q& K! _! c& C        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    3 t- ~2 q% g0 b" c        #login="taobao",) @) e, l9 m' e  M! G. s
            type_url = "text",
    4 Y; j% @( b" \. [8 ]7 g( i7 H        Parsing = 'xpath',
    * M$ k  e; t# |        label = {: n+ h1 v) E" o# R1 [
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],+ x) g, W% ?# Q. a
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],1 x- x0 ?, D- w
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]  Y: Q9 ~+ P9 b/ _: U+ |# a
                },
    + ~' z) }! S6 W9 h! T  j) b% X        write='result.txt',
    1 L5 C- z- ]4 q# W5 z        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',/ j$ n/ k1 I' z" O
            page=[True,"now_url.txt"],$ W+ y$ |3 L1 N" g! y
            #clean=True,
    ; ^) n- a- _7 _. R  o) r+ n        texting=True,2 l6 J+ I) P- t9 b5 C
            # sem 参数为异步引擎数目,默认为5
    8 O7 J; P2 n1 g8 c# q! a  Z        # 其他参数同上
    8 b5 Y( V$ q0 V/ z  n        status="aiohttp",
    1 A; I! [+ e# n, Y$ n        Thread_num=3,
    0 [( g" a3 g$ c! y+ n. \. B# d        sem=5,
    7 D; K6 g  G" c( p) ^, Y- q1 X0 Y8 F        ###
    0 V& f' [+ R$ f2 J# E        write_SQL={
    & N8 R, b& P& l" t            'host':'localhost',7 M+ z3 s7 U5 K2 z% g8 Z
                'post':'3306',
    7 P% @3 {; b; s6 }" d" c2 P            'user':'root',7 J  t2 v0 e+ f$ F
                'password':'123456',
    * `% Q3 x) i% r6 t8 ]' c, \            'db':'example',
    ( H( b* R* d: Z' v/ w1 B            'table':'example': {7 ]. v# w+ \4 P
                }
    5 r/ }8 G! K* X1 [2 S: d' \8 I).run()
    : c% d4 W& Y, v! F" Q) r
    # a$ g- O- M% S+ U第十三种玩法:异步多进程爬虫
      s3 I6 e4 v7 D$ F特点:7 f5 y% c" S$ D
    爬虫速度加快,
    3 z$ M% d: u. }+ l4 S9 A异步使得爬虫无等待时间,: G9 E/ `. N- L* Y- o; P& M% {
    同时使用多进程速度明显加快。% S1 N- y9 R; [7 a6 H4 W/ R
    / p$ D' @* |" o. K
    缺点:暂无
      b) G1 P2 ?. t0 {: @* \" `; s3 T3 `/ @2 R) z7 t; D' s9 d& c
    :return None
    - H3 y$ ~' k7 i( F* J# g( d  S; v4 M0 ^4 C$ v3 Y
    from simple_crawl import request
    $ M0 s: E5 |( N. X) Irequest.parse(( h6 S+ Q+ W$ j9 f4 z2 [; U
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],/ n' \4 z7 e/ ~* A; N; a. m
            #login="taobao",
    1 c$ H. p  r! d* i9 `4 ?        type_url = "text",7 s7 O# q# r% a8 w+ O0 H/ D3 h
            Parsing = 'xpath',; W+ z5 z* e$ T
            label = {* H8 ^/ S* F( `
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],6 o* q' V& G, ]
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    8 r- x" ]- g' V( x1 p2 r            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]" `) D8 j4 b. J
                },
    3 k  v1 y2 K' ^        write='result.txt',
    6 ]" L- m% l5 K" O$ S( x5 U        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    , n+ |& {- I. ?        page=[True,"now_url.txt"],
    ) g/ Y1 m$ `" b3 h- S2 @" v        #clean=True,
    7 t3 n" L/ J: a6 V1 G        texting=True,8 X3 I' L- p9 l; y+ Z7 h/ f# f
            # 参数如上
    2 x) p* U' c5 X- F8 g! m& c        status="between",
    , a- {3 r# A; g- x" {& n        cpu_count=1,
    5 C# p% J7 V! k$ v/ N( x        sem=5,  a/ H/ B3 L3 i! I* B1 E
            ###
    + O! w8 X  D8 q+ g- u        write_SQL={5 u/ A/ h: _& Y  M; {
                'host':'localhost',
    : K' K! D, M9 l5 I            'post':'3306',
    . _9 f# E/ t$ O6 l            'user':'root',9 a  [1 n4 \! ]" a: O
                'password':'123456',% U  U% b: Y2 |" m" A3 S
                'db':'example',9 Q! b4 [- c  S% S$ {  f
                'table':'example'0 f- [2 Q2 m+ ^" N. O1 g
                }
    5 B3 K: W+ _$ q- @: E).run()! ^9 }& t& h2 }- E0 z

    : {2 \1 a2 Q4 x9 p* a- n% [; i0 C6 C9 [& O  E3 c
    功能介绍完毕🤞
    4 X+ M, V# K& ^' y最后还是希望你们能给我点一波小小的关注。' ]5 ~: G! S- K/ a) B
    奉上自己诚挚的爱心💖
    0 h, f& D( u! o————————————————
    9 @, X) U+ R5 r: ~: _+ I版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。, |7 ^  M5 {5 Q0 s
    原文链接:https://blog.csdn.net/qq_45414559/article/details/1060056843 V$ i2 D4 h) r5 S

    8 `0 @/ H/ L$ I( J8 V& d
    9 c7 E9 ?) r2 S2 l3 x2 h$ A# p
    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-9-14 01:23 , Processed in 0.381640 second(s), 56 queries .

    回顶部