QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5434|回复: 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: k- v( S* o1 D1 h) l, b
    simple_crawl
    - {! a! g# H( y" {' H) q. ^! g仅需一行代码即可达到爬虫效果
    3 i  r; N+ D7 \& Y8 B! o8 w) k项目地址(欢迎star):https://github.com/Amiee-well/crawl' C: E  W2 r$ @1 c3 I! @
    使用方法
    + G5 }' T/ ]0 S" `pip install simple_crawl+ ~: o* e" h" ^1 L; |. |& {

    ) p5 `* h: P. S. R& _1 }* k### 以下源代码为简单介绍,详细功能介绍再源代码之下8 @5 t, u1 a% p% o5 O* l- F
    from simple_crawl import request1 \. D' h6 y3 B9 J: q
    request.parse(
    + `( h& p2 {. Q6 W& Q        # status 参数为运行状态,支持单线程多线程多进程协程以及联合
    ! z5 n8 ]2 G3 J+ E7 o8 A        status="aiohttp",1 T0 m6 P7 V1 F
            # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式" x+ p- P* a* q1 \
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    2 \5 N, J! t& @8 Q1 H7 Y        # login 参数为获取登陆信息,如淘宝等网址需要登陆信息5 U' q; r( U8 k8 }0 _. o
        #login="taobao",) z- u! M7 {& n( m8 X: w  q
        # type_url 参数为返回源代码格式,支持text和json,默认返回text
    ' t2 d% S; P" n+ X8 Y    type_url = "text",( h: J; C1 B7 f4 c3 Y$ ~1 J1 Z
        # Parsing 参数为解析方法,支持re、xpath和beautifulsoup4 u% y* m) j4 t2 `1 y  m
        Parsing = 'xpath',7 P6 z' d7 ?$ p9 R5 _% k
        # label 参数为爬虫解析过程,字典格式,详情见下方' ^, u# U6 @3 a$ e, R; L! a
        label = {) a* i6 f2 s6 {
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],9 {* \  p8 D5 N4 z
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    1 |& c5 }* v7 X" f) T* I- M( p6 I# Y! o            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]$ y3 e9 D' O: }: Z7 Y
         },
    " G4 I7 i4 D$ X     # write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱
    * F0 f7 O! t# f( _6 ~     write='result.txt',
    5 X6 Q! m( a. t     # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫
    : X  o$ F) }- b8 ^" H     next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    9 k' {1 J* M! C7 }. s2 }     # page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫" r! _( _/ c1 M
         page=[True,"now_url.txt"],0 A. q1 A: n$ L4 z7 b* o4 t0 X
         # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息6 {% R$ p( x" N! c9 L. W' s
         #clean=True,
    9 [) m% {% i8 `! [     # texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序
    $ D5 p5 _. ]# H- O     texting=True,. L+ u+ F, `. }
         # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态
    3 d, \) m2 f, _$ l9 R     Thread_num=3,- z2 G: ^$ T+ d, j# W. ]
         # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态2 T% P+ o/ P+ h' w
         cpu_count=1,  P4 |% H8 w7 q4 t; o, S- K
         # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态. R6 ]4 W6 C6 M9 t3 s) w
         sem=5,& b. [0 ?: ~5 f1 G( ?, B
         # write_SQL 为是否写入数据库,默认否
    2 u8 b9 w/ Y1 a$ c4 i$ Y, {, @     # host 参数默认localhost4 ~# u0 v5 N  }2 R
         # post 参数默认3306/ b) e. W0 w3 V
         # user 参数默认root, i0 }1 k8 c! l9 `1 u" Z
         # password 参数必填,必须正确
    ' U6 K( Y( N  u8 T7 H7 l, Y: j     # db 参数为即将存入的数据库名,若不存在自动创建
    $ L# O9 i9 R$ _9 }- ?! d. q     # table 参数为即将存入的数据表名,若不存在自动创建
    ' ^! [+ Y, V9 I     write_SQL={
    ( I  K9 s6 y! h  M# K& Y         'host':'localhost',. f& u. ?/ ]2 \
             'post':'3306',$ f# a) \7 r' z0 ]
             'user':'root',4 Y0 {8 X4 x: c' R
             'password':'123456',
    : T! r' S$ V5 y2 |4 Q2 r         'db':'example',% ?( N0 ~5 N. c9 W4 S8 T, t% c
             'table':'example'
    : U6 s/ c' B; C, Q      }
    . c6 x) O4 e/ ~3 d).run()
    , T8 Q: Y3 k" J+ G4 w
    / O& U9 g6 g! F1 s8 F0 r: x# I介绍一下crawl参数设置:/ p- ]. ^5 w3 a. U. M! x+ w

    ) m. u6 D, V: k'''
    $ p, w! v% `+ G单行代码爬虫程序执行* o. p' B' y* G8 ?( d1 p1 R
    :param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档
    & E- q, s6 U* j0 S' K: d: X% |:param url:即将请求的url地址,仅支持get请求
    6 Q! p, Y4 S+ [:param type_url:请求url后返回格式,支持text和json格式返回
    ( v5 {& y( y# l* [:param Thread_num:即将启动多线程个数,默认为1单线程
    , U$ b% {' |7 R! B/ j; |:param sem:协程信号量,控制协程数,防止爬的过快,默认为59 l. D% e5 H5 Y3 `1 r
    :param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半
      i4 P6 m! K9 H& c2 C4 q:param login:模拟网站登陆,保存登陆信息
    , n2 d) |: L  O% E" ]0 T6 }:param Parsing:爬虫方式,支持re、xpath以及bs4方法) K) b4 Y6 y$ ]# Z$ H1 m  x- M
    :param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,/ \8 z4 b6 B" W" k8 W' L  a
                           多次报错结束程序,默认否3 R9 ?2 O+ d3 Y/ c# p$ ~5 w! h* P
    :param label:选择器内容,字典格式保存,
    , d+ ]+ g, Q6 m! h$ n* h# e* T                     字典值为列表格式,第一个参数为选择器,第二个参数为转换类型
    ' D# Y! B  l( C0 V                     第一个参数必填,第二个参数默认str类型
    7 e+ U5 Y& ]: X3 _$ O% p3 a3 L:param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否/ m% O, K4 d2 [; |2 g  a
    :param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫* E( I' T' a) O% q6 L
    :param page:是否选择断续笔记接手下次爬虫处理,默认否8 B% G. ?+ H) v5 [
    :param clean:是否进行简单类型数据清洗,默认否0 f( b$ y/ @4 v( a3 R
    :param write_sql:是否写入数据库,默认否
    ; u1 |5 z- A1 B( s6 c1 R                         'host'默认为'localhost','post'默认'3306','user'默认'root',: L$ x9 I; O/ ]; R8 C& Y$ Z
                             'password':'密码','db':'数据库','table':'数据表',4 A+ f6 S/ ?" ^! w( S4 U+ M/ b2 y
                             检测库是否存在,若不存在则创建,若存在则直接插入,
    ' I0 R  J3 ~  m; d0 t7 {; @                         检测表是否存在,若不存在则创建,若存在则直接插入( \+ Z) p2 T* K4 d0 k  @
    :return True3 v' \  m1 ^" G9 T- u
    '''! V* K9 a# Q& g% U. s. v1 f
    介绍玩法6 l9 q2 W" u5 ?* `$ B
    接下来介绍的均为调用第三方库的情况下运行:
    2 ?6 y$ h' y$ m$ L6 P$ c$ t) {
    0 A) Z/ |  P! ], {9 h$ l+ wfrom simple_crawl import request
    % B1 b7 \3 e& u- n# W* [第一种玩法:输出源代码0 P! A0 e' g! T2 ]+ P8 Y
    调用requests库进行源代码请求。. T: A/ b& H' r9 `7 T" t

    # }6 M2 A% z: t; g7 T' s特点:+ h/ b, P6 F+ i7 V# |$ @' B1 H
    请求失败则调用ip池处理重新请求访问,: d2 Z, R6 O, y+ ~% L9 x: V
    出现五次失败默认网址输入错误。
    . m# {! v% `) L7 X. ^% ?  f: k支持text以及json字符串返回。默认text。2 e, n; e% E5 w0 F- H, Y! N6 A. I

    6 H6 ~8 N, K- n; T) W( h缺点:$ q# }* C2 ]6 }3 T
    暂时只能进行get请求,不支持post访问
    " t5 I" {0 C+ a. b9 z4 h' J( Q3 U7 _( {8 u; W" o3 ?
    :return text or json  }- f8 {6 _/ b

    4 M* G* S7 C* _request.parse(7 `/ A* F6 l: j+ j% q: I
            url = "https://www.douban.com/group/explore",  ^! k0 Z+ v) E1 P! p
            type_url = "text"
    . w+ H; O  M# }" {& x).run()9 D/ o5 L) q" s& C7 ~
    # return text' ?8 N9 _' _5 X, y+ J. o  b
    - I- x# N2 M! O* d9 a
    第二种玩法:模拟网站登陆并保存信息
    3 E$ H# @# J/ q5 E调用DecryptLogin库请求登陆访问。
    & B* P6 G: w/ S" O) |: @& P
    9 M+ F& Y7 s) z/ cps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源$ O; o7 ?+ [& N# `* o- w
    在此放出文档地址9 M" I% \6 @+ J+ S( K  w% W
    DecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/
    / T# [- G" j9 R! o. ?3 A
    & D3 h. `* h% i- w9 G特点:% O) ~% s6 o# N
    将DecryptLogin库中二维码继承到此库(非二次开发)7 h  e; ~& i$ ?. n" H, C* O& s
    支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆)& Y  n4 `; D# Y( }3 z
    保存session.pkl信息到本地方便下次登陆运行
    ' T. e+ U# s! r, U
    + _. j1 M& @# Z( |缺点:- P6 s% W7 F: W/ H+ v1 D
    session.pkl登陆信息过时无法自动删除。
    " p" k& {1 a8 C; Q# z导致下次登陆疑似cookie无法正常登陆。
      P$ b& V+ ]+ U2 w  K4 ?2 E- V' R4 ~0 }/ J
    :return session- y, R" W% U" r" G9 I+ u3 {' k

    9 a) a8 O) ]; a7 e  d5 f4 o: Yrequest.parse(
    , k6 b5 ]) ^+ v3 M4 W; L        # 臭不要脸的推广一下我的店铺
    & A  Y) G7 c8 [  u; ^9 O4 v        url="https://shop574805287.taobao.com/",8 R' S' i7 }+ Z" I* z8 ^7 J$ H
            login="taobao"
    : a7 F0 Y% A( {3 b4 c( _; m7 a: C+ c).run()
    . b1 F0 i6 w9 p5 Q- R# return text$ S) K1 S9 ~: U9 D" ~3 f
    * ^2 ]3 Z  q) S$ Z2 W9 t
    第三种玩法:爬取网站信息
    ) |$ a1 ]' c1 v6 x爬虫库自然少不了爬虫的过程
    $ ^/ J2 s5 a0 f) O$ U
    - s: |+ L4 Y! c" N8 A特点:
    8 ^- e7 d# L7 E7 m5 p* r$ _支持re库,xpath解析以及bs4选择器。  D) a% V9 ?8 Z: y; N3 I4 t/ J
    爬取方法为字典格式。单方面输出。2 `) F* ], ~8 p+ m2 D. w9 r
    字典键为保存的字段名称。2 L: Z) h  h( ?# y& `) i
    字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。
    - w& ?5 B8 b  R, T0 k+ r" F2 T5 n/ C8 r6 X7 J9 l* P
    缺点:暂无(等待小伙伴们发现); V: o6 T6 ^. B- g2 j7 p9 T
    3 k( s9 }  ^4 L
    :return reptile_results
    4 k) L. z# N3 y
    ) O% T! m! P7 }& n  Brequest.parse(/ j0 u6 {, a! w
            url='https://www.douban.com/group/explore',4 ^# {- t5 x/ V! z& b& @2 b. a; \
            # 字符串格式,选择器方法。
    % o1 L% T" V" c, H/ [3 ]    Parsing = 'xpath',1 U  R8 x+ b3 g' j) o0 u5 M8 n
        # 字典格式,参数如上。) w" o! L# o3 q9 l( W5 A. k+ D" ]
        label = {
    ' Q' w4 i1 _2 O* D+ i5 H* ^4 v% C        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],: ^9 U2 o6 U$ b
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    " n: j  A6 {  V4 Z1 h        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    6 Q; S+ {, \2 {6 O* }4 z5 h        }* f' q; R6 s1 Q3 ~4 Q! \
    ).run()5 T9 s8 g. v, I0 w( G
    # return reptile_results(list)
    9 |$ }4 [2 C( b/ e( M& }6 [) d3 x* s; E9 \' g/ q
    第四种玩法:自由保存信息
    - c" {9 ]8 q( J! o目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。" V2 a! _5 t+ P6 Q* y6 V4 t

    + I3 b+ p% U4 f+ l2 X4 n3 g& m特点:
      K- P) V2 {! i) f8 |5 k; L* J8 S& ?写入文件均为数据格式传入文件。; o* d/ i) U" H, \
    且输入格式规范方便阅读and省事。5 t0 T' p# w* f% U7 |7 B3 q: \3 T

    : F$ d& B% T. }( u( a% u缺点:3 g. \5 c3 V; F6 G$ X7 G6 Y
    保存格式仅四种,
      @% D8 G4 \5 P. }6 d2 F+ a4 R不方便用户之后读写操作。# q  ~( s. z" y9 U8 o# r4 F
    7 e4 M" m4 b: ]) u
    :return file4 n8 L9 z" h! J& Z/ D4 {

    " M  B5 E/ _3 [! E: H# vrequest.parse(
    3 o2 i8 f( r8 w# d2 A& f% G        url='https://www.douban.com/group/explore',
    , j" I* f- w/ D    Parsing = 'xpath',) u" h) L" d$ F* {
        label = {
    9 f2 E8 i/ k: h; ~  J* x- j2 d        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    5 D! c; N9 l" d& E/ o        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],( O4 V4 n9 X' e3 a9 c: s8 B+ ?2 P% `
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    ! \! L  E5 d' R0 \. m# C        },
    $ K# P. E7 o+ f    # 字符串格式,具体保存位置填写
    + s4 T. Z  t/ m  j  A    write='result.pkl'
    $ t7 s8 K3 [& W# y5 S8 B, N2 q$ \5 x).run()
    1 H  k" z1 w( {3 ~& ~% B8 ]# return file' ^# E  v. @# Y* n! ?% u6 z" w

    , k, U- ~4 H. i: m5 B8 V3 a第五种玩法:读取下一页 url 地址继续爬虫& V! R/ E( P- a% ?+ j' ~: X, ^( a
    这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~
    2 x. y8 E  }; |2 T; z! x" M2 a
    $ f1 q0 V! Y3 y2 A3 s/ c! O特点:1 ~6 m" |: v5 Z% y6 i8 h: T' A  J/ q
    继承之前的Parsing参数选择器选择方法。& d6 p; I' S3 P0 I
    在这里可读取到解析后的下一页 url 网址。, t+ ?2 ]) r& J  O2 w# n
    方可继续进行爬虫处理。方便用户使用。3 k! y- J- v2 A& ^2 a+ ^5 \
    ! k# E! ~" B( J7 y# U1 u
    缺点:
    " c% T5 ?  W0 e5 `/ r; a若爬虫时下一页 url 地址改变,便结束爬虫。* N. x4 b) n+ ?" S  I, e
    只能爬取所给 url 地址中的信息。
    : U5 t. \- v( ?# w  c) Y无法进行某一界面的多个网页爬取返回。5 q' a8 Z9 N" Q, J6 K6 s; @4 g" d
    造成访问页面单一流失。
    4 b2 a) A5 p' k" A$ y3 O' R( l( d4 S! V: H5 N  w9 f
    :return None5 E2 \0 r; i, V4 c! l6 a
    / t2 N" u0 G. z! \: C1 P
    request.parse(
    % r! _4 A- S, v: ~        url='https://www.douban.com/group/explore',9 m- w5 p+ _& [
        Parsing = 'xpath',
    7 q1 b2 q) |0 }0 H) e$ I# Y; v& c3 @    label = {
    . Q$ p' u" l5 I1 K# V        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    6 o  X  u' {* q4 _        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],; E2 u# W- L  p$ {7 e
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    1 M4 F. A6 z1 y- @8 x        },
    9 S, a  z/ R( ]7 G# q! s    write='result.pkl',
    * q$ d; D1 f: z, W% j- d    # 字符串格式,根据Parsing方法继续请求下一页a中href9 |- P: b8 ~$ R" c6 G, e% D
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',- s6 J, ~3 x, U% {4 Q
    ).run(). ^6 X. ~% G7 s8 h: h4 E) F
    # return None / q: A9 @+ T% B, ~( `
    * Q# j) j+ l) Y. l( w
    第六种玩法:爬虫网页保存
      r  _3 x6 U5 j听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!7 F! h" s4 l6 P1 h4 j
    5 g& y3 S) u9 e7 ?$ S' c" o
    特点:
    ! s0 e2 r) K! c7 ]9 V$ s* Y持续输出断续笔记。# ^# |, \5 ~1 u$ Y+ ~2 e8 B
    将此次爬虫的 url 地址保存到一个文本文档内部。
    " c5 l! O( E* j+ d8 I. F下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。; G8 V3 F7 ~& o( a, ^
    % j3 W* o5 y8 Q1 ^
    缺点:
    0 O2 w! e" f$ O9 k/ G读取内容不单一。
    - ~& \+ q5 t3 U% r2 p导致下次爬虫无法正确读取上次爬虫留下的痕迹。* y2 e: }0 U& \2 W3 |+ N8 H& T
    " c7 i- p0 u4 d6 w
    :return url_file
    / r: P& s: G! c& Y; {; W6 K4 U
    0 d0 C+ l5 j4 d1 L/ Krequest.parse(
    3 k- T9 h/ s! F    url='https://www.douban.com/group/explore',
    ( Q& K! Q& m6 k    type_url='text',. [" U0 u, F4 e& k
        #login='taobao',
    / g6 t: A; V4 k# y9 Z    Parsing = 'xpath',
    * r4 w- J- V% p) \+ b/ p. m    label = {
    % O7 N% Z! i& }2 T        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],3 n- x& m0 v- L( g% A$ C) Q
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    # o% C, S! O- w; _& `: X" `        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    * l0 w4 l/ P8 `. r7 d; `1 y" s        },. A- B- f" J9 t1 H
        write='result.pkl',
    " J$ @) h6 X8 O" Z3 s" i    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    + k3 r. L( d+ y# \    # 第一个参数为是否需要断续笔记。/ @' ^1 }1 p' G& `7 h4 {) a, E/ A  g+ L
        # 第二个参数为断续笔记保存位置。+ q  o! g( s, F5 _
        page=[True,'url_page.txt']2 ?  |& T9 N( J6 A; {) A  B
    ).run()+ m* b) s0 g& @/ K  |& v. ~1 C* s
    # return url_file
    ) L! S# p$ m8 t; K& U
    4 f) _4 s, @! a3 ]第七种玩法:简单数据清洗$ T- F4 i( t9 f- F6 E
    数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。3 V8 U; K( a# a: ^

    . M+ I! O1 M0 {4 [特点:
    , U$ q1 A( L1 C5 V) w2 `- n- Z2 R" l2 {本人曾写过一个底层数据清洗。
      m6 h  H, k$ ]: r- H# T/ ]2 J: P能将列表格式数据进行归分清洗。
    # v* `( A2 r, I主要内容请参考另一篇文章: Z* j0 B+ F# h. [& q3 R9 O
    如下连接:数据清洗
    0 j/ d" N# O; U3 I' n
    * y8 V6 `: n3 a9 p$ w缺点:
    7 N( j9 I: d: m+ }! o8 d% J2 a0 i6 v数据清洗格式简单。
    7 b% R/ J8 @$ E. G- _2 T# _数据清洗内容单一。# q1 S5 t5 ?: M
    无法完全做到绝对清洗。
    . q  J6 R0 H3 W3 ~( _: C( }有待改善。
    9 e! ^7 p. A4 Z  F/ U# r+ q& Z+ y
    ( i  D1 n& @3 i:return keyword_list, value_list
    ; ^: C8 g2 _9 V& A/ U# T; q7 r0 Z( A" ]  u  ?, S' D; n
    request.parse(
    % o4 Q# ~& a& Y9 V( x( ?    url='https://www.douban.com/group/explore',; T# R% V& b3 N$ A/ P0 t
        Parsing = 'xpath',  M" E9 N0 W9 n8 C% X
        label = {
    ( E, U0 M5 R) g- |" x! w# t5 I        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],$ n# f/ `2 n# `; }. e) D/ k
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    5 V  X9 j% }/ R/ q9 {0 K        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    & R) r- F' H$ L$ K* |        },
    # S. V  A" H4 U    write='result.pkl',
    ( Z+ e! d( X' e. F! t    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',- X9 U) G* g8 P6 K& Q
        page=[True,'url_page.txt'],
    - }) Q! g/ y& Q2 F8 P& {; Z    # bool类型,默认不清洗
    6 m" N& q, a. g& j    clean=True" S5 }4 a2 g/ U! }
    ).run()& c/ N) u7 R# E( n
    ) s( ?: J7 v; G- a' `
    第八种玩法:爬虫存入数据库
    + }7 G* D# Z; w' `2 b存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。# h# w  L3 i0 g
    8 e+ w7 M$ e5 j- b3 M# R! ?
    特点:( X3 U6 `0 P' K% L+ m7 H1 `
    信息存入MySQL数据库。
    . e  e  z- ?! X& x9 b" _可连接docker远程数据库。
    ) g& W% k1 o! o8 S数据库的库名可以不存在。: d6 o- C8 i5 f! {' I
    数据库的表名可以不存在。9 H8 l& A4 ^6 J; ]# _4 z9 H* m0 H
    根据之前传入字典键与值参数判断表类型。
    7 |* L3 M) ?2 g) x$ H( H8 K+ }) E自由建立数据表传入信息。
    $ ]& F. H/ N  C; @8 ^% Y; [1 B, a9 T$ b' ?
    缺点:
    3 n5 H& ]# }. x% C仅支持MySQL数据库。
      S. v, `8 D0 |! C7 T5 d5 `" M( d/ M+ b. [1 }( @! O
    :return SQL
    $ x* ^& x. N6 W  ?5 q( \, \& o' X2 P
      j7 ^- b; F; o* srequest.parse(2 i) M6 O3 H( d# s" E% z
        url='https://www.douban.com/group/explore',
    " ?& F  T( ~4 \0 S% _$ k    Parsing = 'xpath',
    % n4 {/ y6 _. u3 y    label = {
    0 `+ E! y5 ]4 B8 p; F0 J        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],/ v; P- E6 q* ]: c6 g
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    5 E8 g5 w" a# s" T        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    & ~8 W9 m( T& b" d        },
    9 @) q5 |2 c, d# `! K$ ]    write='result.pkl',
    6 k$ [1 h' \& ?5 k% N! s    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    ! K) Q( w! [$ h! c9 p    page=[True,'url_page.txt'],
    ! a5 M; J5 z4 G' d  Q% U/ S" j    clean=True,
      Y$ G( w1 ?3 l2 C" ^: E    # 字典格式,. m; q* _2 X7 X; m
        # host可有可无,默认localhost6 o+ F* B7 \& h' j
        # post可有可无,默认3306' W) D5 P! M5 z
        # user可有可无,默认root2 E9 I$ w; F- G" \/ |
        # password必要参数,数据库连接密码
    : f4 Y; o3 t: T' L' x' {0 x( C    # db必要参数,数据库即将存入的库名
    # p# n3 E9 \, U% A    # table必要参数,数据库即将存入的表名
    " e3 V6 [, f' v8 p' D0 Z; o    write_SQL={9 A. ~9 ^2 b% |- ], L" w# ^
            'host':'localhost',0 ~& K  i) B; ^. j- D$ V
            'post':'3306',
    ; r* c$ ]1 e: z        'user':'root',
    : B0 f, v3 v* P. m4 d        'password':'123456',
    + d* Y$ J& {* k# K& W# g( f        'db':'example',4 N6 l. p4 g9 A$ X
            'table':'example'
    * [- G6 _  U$ s        }* |# J) i# }8 ?" m" O
        ).run()4 B' J/ U' @% A" t5 X
    , U( L: Z3 ~9 h$ `/ B5 m$ r3 |
    第九种玩法:重新启动爬虫2 e4 S" K1 X0 N* G/ X4 b3 Q
    爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。
    % I# j: }/ V+ G  N3 k
    , u& \  w. U& [( ~  W特点:# i5 x( f: w. r' A7 ]# Z) z1 C! T/ a
    检测报错重新启动爬虫
    * n3 O4 k: B% A! N, B5 H无需手动处理错误信息
    ! G2 }9 q6 h: Z/ u: Y0 B
    , A% l! _3 p$ c* V2 W+ x" i7 o缺点:1 q& Y6 w) \. m( L) |
    无法收集子线程错误。
    * f7 ^; D5 W5 v" B4 j$ s( [1 S
    ' z& ^1 h) L1 X) n0 i. M$ |! @! K6 U2 v  b:return None& {- F/ T- {) S' Q/ B

    1 t5 y1 e2 ]' E2 T! }1 Prequest.parse(# ?9 n/ P' [: c" {$ p
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],: x0 Z) k* P3 u& U0 t
            #login="taobao",
    6 f3 v' ~" y5 F# t6 F        type_url = "text",% Z$ k6 p/ Z& Y
            Parsing = 'xpath',
    % _+ ~% M, i9 ], ^6 s/ u; s        label = {
    $ Q% H( R- u2 s! K            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],$ |! N' M$ n0 w* ]1 A4 p
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],4 ?9 T! v8 u) f
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]6 S3 |3 h' p) t  e$ R4 d) I# J
                },
    # }" r! d) C) O- k( D  O" a8 r0 q( }        write='result.txt',
    4 n9 m0 H, Y3 z  V. O5 K" D4 [        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    0 ?0 X+ N- u- M6 f  \8 D( [        page=[True,"now_url.txt"]," w' i8 T& E; [) O
            # texting 参数为是否启用连续爬虫0 ?7 Q* G; n1 E: b& Q
            # 爬虫程序异常报错后重新启动爬虫- j/ T  [  a* l8 C
            texting=True,* p/ z# S; w; m6 ]3 |+ s" }! U
            ###7 n% Y+ o; o% L. D& Q
            write_SQL={
      N  Y+ {( u# `            'host':'localhost',
    3 T; r" S( L! \0 N# W- C# T            'post':'3306',
    ; u+ z1 P) Q8 r            'user':'root',: U# K. j' n! o
                'password':'123456',
    ; h, |% G1 W- C) ~& Z3 B            'db':'example',
    " t$ y  y, K( X0 c            'table':'example'- D0 y% l" j9 I3 B
                }. {$ {- D/ |6 C& y
    ).run()
    + F( R' l" m6 R8 x2 H3 r. b
    - D% \" S; D1 _( i第十种玩法:多线程爬虫
    1 e# s5 g- _5 F, z# A$ e特点:
    / c; T8 e4 ?! s* Q5 ?) `爬虫速度加快,( U- K$ C' w; v9 r9 L0 u
    更好的利用了线程。  k3 ]  W4 {4 ?* s- L: ^' N/ o
    ' f/ G9 J5 k5 z* a3 R% L$ ?: J/ J( D
    缺点:暂无
    6 g- w+ F; C- K! k5 O! }4 M6 l8 O. O0 d7 g& @: i; t7 U
    :return None( @, l, C8 V% @( C: y7 K

    & f/ r/ b0 _: ^, ]$ i  Wrequest.parse(
    3 l" u8 x8 G7 Q        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    + Z) `; w; Z6 Y        #login="taobao",
    9 T8 Q( \. J4 g) X        type_url = "text",8 _- {5 j. R: M: {. N$ S
            Parsing = 'xpath',  o4 T' Y/ Z% J
            label = {; D) Q  w* Z# E' I0 K
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    ' B0 [/ W4 `1 p' B0 n; l            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    9 C; j( v2 Y  d, c: [" ?            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    , l% ^+ o/ m# W  j8 v* _1 b* S            },
    $ x2 t% B) D  Y5 K4 V        write='result.txt',
      f" w$ k0 ~/ c) l5 w6 I        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    2 i7 N1 u* b. F7 G% K( m8 `        page=[True,"now_url.txt"],
    0 B; O( |- T3 W$ ~& [        #clean=True,' }5 p( A/ g: c3 A; a* D, K* d
            texting=True,) \4 k, G. |- [* q, J; E8 M0 X5 }
            # status="threads" 启用多线程爬虫3 M& H4 O6 e' e; @6 }) X$ r, A
            # Thread_num 为线程数目,默认为1 单线程
    * j2 x$ j3 B& e1 ~7 n8 N% {" |# _7 L        status="threads",) y. @# t; m# G' Q8 c
            Thread_num=3,3 G1 e7 p) g/ h+ m
            ###' y  h. R' e9 o* Y% c+ v
            write_SQL={
    : G& C2 j; |" |) X            'host':'localhost',
    1 R% `* f( q8 L, l) A) L2 m0 j            'post':'3306',2 y  C7 ^: A! }: u, Z3 ?
                'user':'root',' I: T& F! _" d* A2 [8 X
                'password':'123456',3 n- x  w/ a! j1 C8 i9 E
                'db':'example',
    7 A# z: t1 N3 D: W9 W; v; J  ?            'table':'example'( K% g% U8 v4 z! `' X) L
                }
    ) r2 M+ d% f! u).run()" Y4 g0 t0 o' |7 e0 M; M; |
    / d7 w+ N  J: `9 h; ^8 Q4 M
    第十一种玩法:多进程爬虫
    7 k4 [) W- v6 S7 V6 A' K& f特点:
    + t3 ^& l9 z% Y. n: r爬虫速度加快,
    9 O7 L  U, r* R( V( d9 Y更好的利用了进程。; r( p, H6 l% ?% `7 P6 h5 |1 g' y

    2 X) t6 ^: L* r. O* F$ [缺点:暂无
    5 w/ j: y4 g  q. N& p% @' A' E8 k& S4 c. ~$ n- ~% _! }3 ]# a% j
    :return None
    2 J- l( P+ B4 |8 u+ i. Q$ Z% q: Y! w! [( h8 U
    from simple_crawl import request5 o/ p% j* {: t) y% f$ B& b
    request.parse(
    0 U% h/ D# I# j        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    , L/ O- e) I# B- k6 s        #login="taobao",) O. s( x4 l- K0 I2 S" b6 i
            type_url = "text",
    6 H5 ]5 |7 Y4 A* p6 O5 }5 [        Parsing = 'xpath',
    5 x( G8 B; m# ~& C8 f+ q; W        label = {
    ' Z/ I6 c* R  y6 w. D1 M/ D            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    $ O2 A1 k$ C/ Z+ T            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    - M" }+ F# b6 Q# ?            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    ( f. V3 o- }- z% O" h! s3 ]2 J            },0 ?8 X. X. L3 m, n8 y; c
            write='result.txt',
    3 q, N/ {' S3 T, u        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    - B1 k* ~' Y8 Y0 A        page=[True,"now_url.txt"],
    4 W5 D5 D1 }5 O3 _+ o/ C1 s7 ^        #clean=True,
    6 J+ A$ e, B% A4 m# `# s2 C        texting=True,+ q. z+ h3 R8 y$ y6 f  t/ n
            # status="multiprocessing" 启用多进程爬虫
    & A: q, d" d* B3 j8 W! N        # cpu_count 为启动代码核心数,默认为系统核数一半, Q6 C/ L! J/ c1 P$ H! e
            status="multiprocessing",
    & C# r0 q3 c+ T* k, w) E/ T0 t' s        cpu_count=2,
    ( q1 o) C: T9 I9 S, l& ^        ###
    ; R5 O# G. ?3 ?6 b5 V4 e; g        write_SQL={3 k2 g! ]4 M' H3 d7 Q/ u
                'host':'localhost',; q/ h8 R1 G) K
                'post':'3306',9 V% Y5 k+ ^' c. `* L; b8 R: w5 I
                'user':'root',
    8 M6 N8 q  W, I3 H            'password':'123456',
    / A. H% R" ^! p9 e  q7 |! z0 G2 r4 b5 O            'db':'example',0 V# n$ q! ]+ V- T* B# F1 H; i
                'table':'example'2 X# T) u# J, e/ ]
                }
    ) z# S! N/ e# v1 }% v0 T: V).run()
    7 \' p" t) c% H& U0 m1 c
    4 A" _- e# r$ V% k/ I! g+ O第十二种玩法:异步多线程爬虫1 o; Q; {( C/ f& M& j; h; ~
    特点:4 X+ P9 M* Z; F( s! J( O3 L
    爬虫速度加快,% B6 D( [& ?2 H
    异步使得爬虫无等待时间,
    & I4 {' \* Y7 D+ d; {5 h同时使用多线程速度明显加快。1 a( o9 Q" v, p6 @, ^

    0 z/ C" W& j) d# u6 Q' V缺点:暂无9 ]& R5 P6 k- R% ^: I3 U. m
    8 f7 \& j* B* Z" r' F  W
    :return None
      B: M' s. z7 X* L3 D6 J. N, T& Y! Z7 ^* `  t
    from simple_crawl import request
      M$ @  K5 g) n0 Z8 N8 Crequest.parse(
    3 W$ ~: j" H) A1 [$ n: @7 _        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],7 e1 e$ ?+ S/ `9 p
            #login="taobao",/ d4 u5 c! d% F  ^) x
            type_url = "text",2 r5 ?6 m1 E" i: s) T% e3 w9 M
            Parsing = 'xpath',
    ( f6 j: o3 @5 ^% _, E        label = {1 S/ `( X5 I3 ^9 V2 J# J5 M$ s! g3 n
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    ; J9 g, V6 f7 S: M+ `2 p1 |! W6 r            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    - Z8 o6 y* }) `            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    ( u6 W; V2 z, V$ i) U0 d) h+ t( v" l            },
    : k) U8 F, E, G. L: B+ q! |. M        write='result.txt'," y1 K1 V/ ^% W4 x3 y# {
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',& m/ ~  m) g% c; I* y) p
            page=[True,"now_url.txt"],
    6 x1 h  K) [5 L- N        #clean=True,3 K( g$ s* N3 T; V( V8 j  h
            texting=True,
    2 t* `, H) G7 Z        # sem 参数为异步引擎数目,默认为57 h: {) p: u9 {) k; K! j$ `6 I
            # 其他参数同上
    / Q) ]2 P+ V: C+ q! }) S        status="aiohttp",
    8 @- a# M& K& u- u5 T: O# G+ K        Thread_num=3,
    ; _- i. c$ M& m  k, |        sem=5,- {( g" {( C+ O9 z
            ###+ p" B( N, m7 y0 C7 N
            write_SQL={
    6 D- O1 ^) e2 {( W4 H7 D# l            'host':'localhost',
    5 M2 m8 x3 j, |0 [) M            'post':'3306',* |/ l) y9 S" d$ o( J0 U, \  Q
                'user':'root'," Y* H6 r$ l2 X$ h2 D  t$ h
                'password':'123456',
    ( [3 t) n8 H( c; H            'db':'example',2 Y4 w' V" Y" B5 x7 i! g! u
                'table':'example'1 F" `" E* J& {# @! z9 T, O. Y
                }
    $ B3 u# G; ?3 u, b, K( z& j).run(). i5 H. E% k* U7 S% L, K5 Z( ]

    0 ~5 t1 p, [& Z, ?% K第十三种玩法:异步多进程爬虫
    6 S& h: P! T" y3 I' M特点:: n7 D8 g! D- I
    爬虫速度加快,
    4 \: y, Y" P. A异步使得爬虫无等待时间,
    ( K. f# A) Q! y9 @' \1 `同时使用多进程速度明显加快。0 V4 b. X. `% i; g  M$ R/ X' l
    ! L* G% w  g9 `- e
    缺点:暂无# ^. a, ?6 {* b7 s2 h

    5 d: G0 _7 }& ^# v! @! l:return None
    4 O) w% {' a4 j+ X4 G% Q8 F- C
    from simple_crawl import request: y* ?- }# T! O) R) [' }) a
    request.parse(5 s' N/ n* {& {1 E
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],. ~9 ?; y5 c3 v" Y' O# F5 \
            #login="taobao",
    / e6 a, x8 r9 B* g8 E4 n; L. R        type_url = "text",
    8 B, L! j- K& ^! m4 O        Parsing = 'xpath',) T, l- n9 a+ s4 ?7 v" l- y; h
            label = {
    ) Z6 Q8 \6 K. P$ v7 @            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],- I& H3 Q  s3 l, N
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],6 H7 |& J7 a# A: z$ m
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]- k( A: k) N, l4 L8 `. ]* C
                },
    2 E; |9 O! x1 _$ r& H) c; D        write='result.txt',
    3 W1 V: W+ E+ {2 @. J6 {) y        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',$ F9 O7 q3 ]2 M6 _" \
            page=[True,"now_url.txt"],
    # I. M4 ]/ w8 A  ?* ~. d$ D0 v        #clean=True,5 O' z- u3 F) h6 _# O# w$ @/ Z, d
            texting=True,
    + m/ e1 S; Q) a8 _: X        # 参数如上) ^* K( Q' h0 h- \5 x
            status="between",: e) P; z$ n# u5 F$ p+ n
            cpu_count=1,. ?4 }2 x7 Q/ D+ [& f1 x
            sem=5,) ]3 L# X/ r( [: K- X  K8 n4 q
            ###4 U8 l2 c* `1 X
            write_SQL={
    6 w1 S& Y2 i. H* i  |* n; N            'host':'localhost',
    # X$ A0 K' m5 J3 }, I            'post':'3306',1 j" F6 S# c, {
                'user':'root',
    7 \9 M/ S* A2 i- L. I            'password':'123456',
    ; O9 P' B  I8 Q) x: o0 a            'db':'example',
    9 K- T- J" G& B' O5 }            'table':'example'
    ; S4 n4 a% O. n3 o/ ^1 h7 M% o            }
    3 J: w1 H. X# I$ r3 t. p  o0 r; f).run()
    9 K: Y+ b0 v- V. j5 |3 G( d; q8 L$ K6 @: K' G% t1 h

    & ?; V+ d" G3 c, k- U功能介绍完毕🤞; Q2 E; B" {0 ~9 r) h3 {/ h; D* l
    最后还是希望你们能给我点一波小小的关注。, e$ l/ O0 D9 H! o  h& ~5 k# [
    奉上自己诚挚的爱心💖
    0 @( {- m% {5 x————————————————
    , p; S. l! B5 V* I7 s7 ^$ ]版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    1 }7 v- C4 T2 t! |  g' x! b9 C$ ~原文链接:https://blog.csdn.net/qq_45414559/article/details/106005684
    6 I2 I8 L1 s9 J8 Q. Y4 v/ |9 ^9 H" Y, M* g) t; Y# n- W

    ! V, a) T2 l4 p" X) y
    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-6-14 20:44 , Processed in 0.384803 second(s), 56 queries .

    回顶部