数学建模社区-数学中国

标题: Python爬虫仅需一行代码----crawl第三方库 [打印本页]

作者: zhangtt123    时间: 2020-6-2 16:00
标题: Python爬虫仅需一行代码----crawl第三方库
仅需一行代码写爬虫–simple_crawl
9 E4 A4 Z7 x( b4 ]& Y! \( zsimple_crawl
; Q& h2 q  |3 Q- R仅需一行代码即可达到爬虫效果
/ H' a# h! ?# e; U4 I& s项目地址(欢迎star):https://github.com/Amiee-well/crawl
: K4 p& t$ B0 P6 M+ G7 n! r使用方法  V/ N, k' _& a/ v% F4 C; W" f
pip install simple_crawl
* U* _) u3 `6 F
( K( b% w- A! Y4 [### 以下源代码为简单介绍,详细功能介绍再源代码之下
' ~; [8 r. ^* xfrom simple_crawl import request# D4 O9 j, S" N% n; t
request.parse(3 M8 b' O$ m, n) h3 r7 n% x- h" j
        # status 参数为运行状态,支持单线程多线程多进程协程以及联合
8 y- U* W: k8 R1 r( F  j: R, A4 a        status="aiohttp",2 p4 G& ]( f+ q! N# I7 ]2 b, o
        # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式2 P/ _* T5 F# v+ w' q2 h8 _- h  P
        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
% n. M' u' t: u: P1 k/ x        # login 参数为获取登陆信息,如淘宝等网址需要登陆信息
3 Z9 l2 o( f  [6 m, c    #login="taobao",
7 V  M! M8 T' G0 ?3 _/ A$ r    # type_url 参数为返回源代码格式,支持text和json,默认返回text" ^& R! k1 W$ [9 H# o3 b2 w
    type_url = "text",
! E1 Q. V( l% h* R0 ?    # Parsing 参数为解析方法,支持re、xpath和beautifulsoup
- P' V5 N# u& O- n$ H, ~# F    Parsing = 'xpath',
4 V! E: z& f+ O+ M. A, H    # label 参数为爬虫解析过程,字典格式,详情见下方
& O0 h9 \. k+ o7 c# g  m+ E6 d    label = {
( @& t$ u: c3 g; a            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
* d! V$ V" d1 b$ V+ d2 z            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],) Q6 G! N+ r& ^* g  S
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
1 X/ N: T0 H1 Z2 M     },% v1 p. G$ e# }: c
     # write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱
; [- m" h0 `! t, j     write='result.txt',: i7 \, U: D5 @1 ?, a9 o( A
     # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫' k7 [# m0 H2 x- C7 j
     next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
( K6 T$ K* U2 X( ?6 b0 J     # page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫2 Y0 H1 L0 S7 p, h6 t
     page=[True,"now_url.txt"],
  [; l9 y& E6 L! c" _: G7 }     # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息6 T3 w! t* q. V
     #clean=True,
; U, U  u4 w3 \2 u. b$ N/ J     # texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序7 G8 C7 Y2 y/ E, C
     texting=True,7 j3 ]) t( g4 ~) x  e5 [! b1 T- ^
     # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态- F& N' ]+ r5 Z& y
     Thread_num=3,5 }+ \* I/ a4 Y# F- q0 b; P& z, K
     # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态& [  G6 I2 H5 Y
     cpu_count=1,7 Y) }4 D: J% M  d* r& I
     # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态
) g' N( T0 u0 i     sem=5,
$ t/ M! Q( N- y9 f' Y, t0 T     # write_SQL 为是否写入数据库,默认否, ]# [) ], ]. d8 n
     # host 参数默认localhost
. Z5 y. w3 W& B$ ]% I6 [% d     # post 参数默认3306+ Q) Z# z. @  |$ v# X5 D
     # user 参数默认root* G; L; D; \# [  }/ G8 j
     # password 参数必填,必须正确: X0 z3 Q: f0 F7 T" ~
     # db 参数为即将存入的数据库名,若不存在自动创建
, H  n* V; R5 a8 i. I     # table 参数为即将存入的数据表名,若不存在自动创建
( L' S; p9 _$ e: T$ K* p+ H     write_SQL={
" ]' a& v! `. D         'host':'localhost',
" E0 P& H% w6 b0 s' t4 ?% x         'post':'3306',8 U  l6 d0 t$ w
         'user':'root',8 F& r  l; s( Q8 P$ p) C* R' p
         'password':'123456',  r/ H7 g- a" H% R( N0 Y' ~
         'db':'example',
5 w# `! T* ]2 t: C3 t' R5 m         'table':'example'
8 ]- ~! E5 L  ^9 F      }4 {" d* T. T5 w
).run()! P2 z4 C+ |- Y9 w* B2 O, g
% S# I8 C  G% k: F6 |% s1 T8 H( P
介绍一下crawl参数设置:
! B  ^9 D7 S+ K- c% r8 x3 g. S
, f' a2 G/ X  d4 E$ i6 \2 V% k) x'''1 r& s0 o$ }; u/ X7 O3 U  U7 K
单行代码爬虫程序执行- `( e( J2 g% w2 k: R
:param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档0 d& ?1 n( @1 U
:param url:即将请求的url地址,仅支持get请求
7 f  P# p1 F2 r! V7 E5 h:param type_url:请求url后返回格式,支持text和json格式返回
* [$ [. A* C" l' [% `8 |9 q9 Z6 A:param Thread_num:即将启动多线程个数,默认为1单线程
# \4 U( i; l8 w/ q. V9 }" r# _7 [6 \:param sem:协程信号量,控制协程数,防止爬的过快,默认为5
% @9 V; d0 F- j7 X( P5 Q" H:param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半3 [+ w( e) o5 `) u9 m
:param login:模拟网站登陆,保存登陆信息* b# @' s! r9 q2 J8 w2 c) a
:param Parsing:爬虫方式,支持re、xpath以及bs4方法
4 `  v3 l, w3 Y+ @$ O:param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,, F' t( P2 o) v1 m, y7 Z
                       多次报错结束程序,默认否
5 s  N: D+ t2 V# L:param label:选择器内容,字典格式保存,
9 I6 i' ?. J* p# f                     字典值为列表格式,第一个参数为选择器,第二个参数为转换类型. l+ e. {3 Z7 U7 Q
                     第一个参数必填,第二个参数默认str类型
( d& i+ y  \; m+ c+ ^$ n4 r0 c:param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否  O2 }; m. }1 Z$ H1 R' n# v2 R; D  W
:param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫* S; @, b$ ^1 X# E  ]
:param page:是否选择断续笔记接手下次爬虫处理,默认否6 J& Y2 u1 ^" E* H7 w9 {7 k  M' O
:param clean:是否进行简单类型数据清洗,默认否! b9 ~) g2 z/ V5 ~! `# N- x
:param write_sql:是否写入数据库,默认否
+ B, O4 \/ q6 r                         'host'默认为'localhost','post'默认'3306','user'默认'root',
, L% O* S+ {6 E4 W. _# X                         'password':'密码','db':'数据库','table':'数据表',
# ~/ ?; F+ e9 D* q1 P2 v$ ]' @- b                         检测库是否存在,若不存在则创建,若存在则直接插入,% I; j  L2 V2 h# C3 M, |$ ~0 H
                         检测表是否存在,若不存在则创建,若存在则直接插入7 p. ~" o/ `! t: v4 u7 F
:return True/ B. b/ f: T- Y* x( O
'''
+ l/ I+ R1 s  I8 O' i: H! b介绍玩法
2 n/ g2 S  U8 i# q接下来介绍的均为调用第三方库的情况下运行:4 ^. X) ~" E% @' w+ w- @( t( \

' Z, J4 S( i2 lfrom simple_crawl import request3 i- `$ C6 E8 Q: n4 U4 H' {
第一种玩法:输出源代码6 x" I5 y$ w# r' w) U( r! Y3 f- L
调用requests库进行源代码请求。. A; O( t" ]4 o* q# E1 d, d- t

3 P- l+ T- ~+ U& b+ P特点:6 W+ c( G( V0 ?& j4 c
请求失败则调用ip池处理重新请求访问,1 j- c+ T* x$ S- X. J2 U
出现五次失败默认网址输入错误。! P/ S* D$ A) f0 Z0 N! F& h' i* h
支持text以及json字符串返回。默认text。
* X) }7 T/ S+ g9 W% B# n6 Z$ f) I9 n9 k; j' B
缺点:
' A" n& W% m6 m( X) [' M( @暂时只能进行get请求,不支持post访问! k/ F3 x# D# _. s, l

1 B0 Z/ ]. }# H6 Y, k:return text or json
0 v' b8 P, W. M  U/ {1 A3 l% x
7 E0 N$ J! F* r' j/ s9 L( urequest.parse(8 |3 w, o9 T+ i6 s: g/ t" ^+ h
        url = "https://www.douban.com/group/explore",! k7 n9 O6 U* |0 G: ~
        type_url = "text"; s% B6 V0 A+ `! B4 }- o
).run()
" V1 ?1 s/ j5 q0 P0 ^4 i  L# return text
) V7 v+ D! t* _- I, F; [1 g
6 x( }0 Q, }( v2 B4 m第二种玩法:模拟网站登陆并保存信息- T" S0 O2 x" z" a& Z
调用DecryptLogin库请求登陆访问。1 k& c" N* @  E, H
9 Q" c0 G6 u' D+ {
ps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源
; k' ^0 a; S' v, X. q在此放出文档地址
6 B8 I9 ~2 x3 l' a5 n" m3 MDecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/$ w  f$ ]: x8 m7 s

  Z% i  X$ b9 f8 B) o) `特点:# z) R3 x+ C9 Z& k7 ?
将DecryptLogin库中二维码继承到此库(非二次开发)
; p2 r5 z1 m+ V/ F支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆)
, V) a  p1 j. o5 l( G9 y) V0 p保存session.pkl信息到本地方便下次登陆运行% s1 S" V+ B$ H) a- M

0 \: m7 O6 R2 Z8 w7 E- z% d3 D5 d9 O缺点:! \4 @. E/ F. `8 C4 h8 j
session.pkl登陆信息过时无法自动删除。
: ~7 [+ K- e4 O+ ^% i6 {+ [0 @导致下次登陆疑似cookie无法正常登陆。3 X3 |- Z6 K* `+ @
) L- N$ x2 ~6 |  h# N5 v
:return session! |1 B, T  I) b6 D2 u! Y' y) R& v# V# s

5 n$ @& x  D6 b9 Zrequest.parse(
. x- x: c! W8 @2 D        # 臭不要脸的推广一下我的店铺  D9 ^, {% e; J
        url="https://shop574805287.taobao.com/",
# L2 s# ^, a+ m* t$ @- w        login="taobao"
0 o% w$ C1 Q: ]: b: p).run()
% i; |$ o$ _; h+ {# return text
; d. U& S& D: E) P. H  B) Z5 Q& ]" B
第三种玩法:爬取网站信息2 G' z4 W+ `3 f3 X2 Y/ e/ b
爬虫库自然少不了爬虫的过程
& h. R# z. T, I( t+ v- O2 p: p8 ?" w
特点:
7 f1 p6 V8 |0 I支持re库,xpath解析以及bs4选择器。
7 I6 L( G" }- U' }$ }爬取方法为字典格式。单方面输出。3 p9 G% E7 t  U: m0 v: h
字典键为保存的字段名称。5 {1 ]2 l9 M( B* f7 A: B7 e0 H0 Z
字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。
  P+ f1 \$ ]0 Q6 Q/ f7 z
  {( ~' `* F4 o1 ]6 C9 z4 L缺点:暂无(等待小伙伴们发现)
' b7 c* H( F. D0 w: _) M0 S0 w5 N, v: X" O) L1 `; }
:return reptile_results# [" t8 f  ~" i6 E
1 \1 k; Y0 R. B& X# g# @$ [
request.parse(
$ X+ Y0 C! b. b( k+ U9 a0 f        url='https://www.douban.com/group/explore',; h. Z5 `' E+ h) F4 A
        # 字符串格式,选择器方法。
% w( }* P+ {6 R! H5 y% M    Parsing = 'xpath',% i6 B* a- k: }! q: ]1 W" H( e
    # 字典格式,参数如上。
* l# b1 H" K  Z3 x    label = {
3 X. e4 L1 Z' f; b) B        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
4 L" w6 G2 W5 r  w5 Y; ?        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],# m8 j6 A7 o" E! L
        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
" A+ i3 r' M- [2 y* q: b  i        }; ^  p# B' D( M* B$ T& l& F+ l+ n
).run()
3 k& h# o6 Q: i# return reptile_results(list)4 y, z# B4 y+ I' o; ]2 ^+ [

, B+ @  H# `. b8 g1 L第四种玩法:自由保存信息7 Z4 @9 I: S" J* T# n3 Z
目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。6 s+ g% O* l% o: `. ~) H

. B1 V) |+ c, \& Y, C特点:
, P3 T- |8 t2 W7 G写入文件均为数据格式传入文件。
# b: F+ z7 s  l且输入格式规范方便阅读and省事。
3 I* f9 G2 S4 @( ]/ P, _; M  n' ~( a8 N0 W9 I
缺点:; Q* P% p! {5 }; {# L' R" @6 ]
保存格式仅四种,
+ B: ?& @1 E# O, V& t7 X不方便用户之后读写操作。; r6 q( r" b6 e$ |  Y

, B. a, L3 Y9 z:return file
$ n; ~# y/ H% H8 w6 `" e, w3 |% y
request.parse(
6 i" y1 A% c) g, V        url='https://www.douban.com/group/explore',1 Y: L( `# ?# @0 v
    Parsing = 'xpath',
: g. T/ g2 i, B& {3 T( ?- g    label = {
) U) H+ S& D+ R! N        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
/ }$ a: E. V$ Z( f7 T; S! d) i        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],$ `1 }  _4 m" e7 G5 H+ e! s: s$ d$ y
        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
( k9 z5 e$ r* `3 z; |, A' P        },7 \2 F- z' m7 P
    # 字符串格式,具体保存位置填写( f  J2 W' H: q: f: G0 g
    write='result.pkl'' w1 T3 [' @- b: h' @
).run()3 D: e# s" k: U
# return file
1 ]+ b3 p7 u/ A4 x9 L7 o. s$ J! @- z% ^
第五种玩法:读取下一页 url 地址继续爬虫' ^4 ]+ X+ N0 t$ ]/ k9 s$ L
这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~
5 N) g" w" `5 \9 \: p0 |  J6 Q( ~3 u$ ~+ `/ o5 F& E: {
特点:
( u0 N7 P+ z0 `3 p$ n2 S3 m# O3 A继承之前的Parsing参数选择器选择方法。
# b- G! D7 e) ^* @; g. t1 p4 a4 I在这里可读取到解析后的下一页 url 网址。
( S! K7 ?6 \4 |- ^; e方可继续进行爬虫处理。方便用户使用。/ x, Y( ^1 s6 X9 n
9 Q8 D# J4 w! Z9 K4 j# }1 h6 |6 a
缺点:
; `/ f3 ?' l$ @) W若爬虫时下一页 url 地址改变,便结束爬虫。7 f/ a( z$ ?/ l, O7 L) b/ p" D1 n: h
只能爬取所给 url 地址中的信息。
* ^% `* o7 w$ J+ O无法进行某一界面的多个网页爬取返回。! b- ~$ ^# {6 _
造成访问页面单一流失。
! @3 ~  m: L: n8 t0 O, w' p7 O5 _# T5 `3 r  y0 U/ V
:return None
$ c! s/ @* \( }( v1 j6 k
$ _& ~9 }+ f- U& h# Krequest.parse(
" D' p7 \" h" z# j: C8 y# d0 ~5 \        url='https://www.douban.com/group/explore',! ^' f  w: F9 _$ m: S& T0 Q
    Parsing = 'xpath',
7 y) I6 }: q) ]- u    label = {
% d- e2 n! t, `8 ]3 `8 z        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
" E  t* B& b& C' v- g  |        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
) `3 j3 n* l! m2 I        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]# E: M) \2 p  z0 `" a& V, X, U; [6 \/ Z
        },
7 r7 e6 }8 R: f/ V+ K! C4 p, y    write='result.pkl',/ g6 d/ X3 J6 i4 r
    # 字符串格式,根据Parsing方法继续请求下一页a中href0 j9 M2 }9 ^- m0 J. s
    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',% ~" c2 w* D5 ^8 K
).run()# D, f, U* b1 r; m
# return None
8 [; D& |( ^" [$ A" J$ z2 \# I, c' I% h7 E( a5 d9 o$ a
第六种玩法:爬虫网页保存
, @" o2 c& L+ K9 D- Z听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!
$ A) V2 {$ G: V( C! f# w4 V  W1 E5 n1 m5 d; s: y3 @
特点:  Q# q: B0 ]# u$ A% M
持续输出断续笔记。
9 v* f" t0 L. U' c' g+ p# H将此次爬虫的 url 地址保存到一个文本文档内部。, e( W, r+ {7 I+ h1 C
下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。
9 X( `3 y+ m* _/ j, d, H1 ?0 w( g* \! j! [' ^
缺点:% f, z8 x5 {$ Y  D! |! t
读取内容不单一。# @  S' c0 N, {+ ^( m$ q
导致下次爬虫无法正确读取上次爬虫留下的痕迹。0 j; X5 F, Z- k. O

7 u, q+ h* b  T/ u, L:return url_file
/ M& B/ d# @) W% c& {- i/ G9 ^$ \, z1 @
request.parse(
- l( D# f, S& `( b+ u" L: [+ z    url='https://www.douban.com/group/explore',$ ^5 ^$ j8 w/ h; f" r  f
    type_url='text',0 B0 y) k. h* Q# H6 E) ]! ]
    #login='taobao',  r: H" G* W9 Y6 I
    Parsing = 'xpath',( e- ^! f  a& R& j: [& S
    label = {
' W9 S7 x' d* D6 k& B$ |6 u        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],' x0 J; d  B, U3 f) @) }; Q+ ]
        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],. Z* V0 w, F- ?# y* {4 ^
        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
. E4 T- ?3 ]+ T" h) b        },
8 V+ d7 L7 R# n* k6 I8 X; N    write='result.pkl',
/ X  O- _' {) x7 O' O* ?    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',% p# X9 ]4 u- W% ?. \! `
    # 第一个参数为是否需要断续笔记。
+ B" U* `4 K$ J( D2 {+ K; |  U    # 第二个参数为断续笔记保存位置。( W1 t& m8 I. M% U- Y& o
    page=[True,'url_page.txt']/ v9 \+ X9 ?0 P) Y
).run(); U7 F. |! e( P
# return url_file4 _  c  @6 A, ]/ d7 Y% r$ c
1 B' q+ {1 R- h$ e
第七种玩法:简单数据清洗
. Z' D4 y" L1 z- s- {+ s数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。6 A8 y, Z. D9 M

" g% V$ q) S4 l5 @+ |* i特点:* j: X* Q0 {6 C* Q" u3 w
本人曾写过一个底层数据清洗。
$ D1 e; U' R( L4 i( U! Y( k1 Z; N能将列表格式数据进行归分清洗。9 W5 N3 m% P! e% p
主要内容请参考另一篇文章
, R  i- a" `: q3 I8 q如下连接:数据清洗1 z3 I9 p' e1 F
% a! j& \$ d# F4 X3 l
缺点:" Q  c; i% O" l0 e
数据清洗格式简单。
5 h  g! W& g1 c5 B9 r数据清洗内容单一。9 Q/ s4 H( Y& B7 {/ r3 U: v
无法完全做到绝对清洗。8 C5 W) D, ]  R; f4 @: @% v" ]. s
有待改善。
; P! X% j7 [' h5 K9 q7 S* I# R9 `$ h' j( e) s% E$ @
:return keyword_list, value_list
/ }0 k6 H$ _8 b  _+ ?: G
" ?9 ~5 R/ Z; xrequest.parse(  _8 b7 F/ p3 F4 o6 N7 i, K
    url='https://www.douban.com/group/explore',
5 D' T( X8 }. C, A    Parsing = 'xpath',& ^5 V* ?/ F7 q
    label = {
+ B8 V: i9 v: f8 N0 L# ]6 Q        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],5 S9 _$ C- n  k
        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
8 U  p" I, z; s% p        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
* R# f! b0 p' ~# \; T        },% ?) F* v' b# d; O# ^$ t) i
    write='result.pkl',
- f5 w6 [1 c8 ~0 i( k2 F4 w# T    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',, w( O% }8 d% m- s0 L' _
    page=[True,'url_page.txt'],8 x$ {6 {0 s- x3 Y2 u
    # bool类型,默认不清洗
' z4 w7 N) @: F) d. i2 e% b1 l* }    clean=True
4 A, Z. U, w. i! F3 y).run()
8 [" s0 l# {$ a3 }7 H5 _
1 y+ e; J+ b' {+ c- w* \第八种玩法:爬虫存入数据库" Z( [  h% l5 x0 \0 M# U
存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。. c; z9 ~* j' F  ?

' I% u# A  k0 @& W0 u& o, N特点:6 d) k( x; }  I& o
信息存入MySQL数据库。) @9 q0 Q. O" `* ~. e  z, ~
可连接docker远程数据库。
" `- _- j! z; W4 u数据库的库名可以不存在。
9 l5 V2 W% e& v; \- _" x数据库的表名可以不存在。7 N  Z' F  o' S& T# e  M) e! q6 X% f
根据之前传入字典键与值参数判断表类型。
2 o! b6 Z/ a( v  ~0 s' h自由建立数据表传入信息。
9 B, m$ j3 M2 V- ?; ~
7 b0 \) r1 d3 p3 O缺点:7 W( ~; i( `0 F1 s) V1 m0 k
仅支持MySQL数据库。
! a! J# h" I7 z0 Q+ y. X
: l* Y( E1 p4 X% B  n3 G6 o:return SQL
' l# X. k6 i: ?' ]9 P: V2 U! Y! {
1 Y: S/ V. L; Y5 r- Frequest.parse(( {2 C- l) r  \( c" w
    url='https://www.douban.com/group/explore',. m6 W" w" x8 K" h* `9 H+ F
    Parsing = 'xpath',3 \6 f% J+ X3 G0 F' h" @) I
    label = {
) s& [6 c5 @- H3 C: N8 q        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],4 m* B& P4 [/ D+ f7 y: K, v: Y- s* b
        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
" {. a. A( [& U6 M9 M1 Q9 _# T, H        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
/ a2 u% ]" C; l( y) |* w        },- l" m2 D' `# g; A# Z- [: f- P
    write='result.pkl',
( S! z  J6 B; b; I    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',% s4 @2 l3 U4 U1 q- U! k- _& z
    page=[True,'url_page.txt'],
. N" Q# V9 U+ @: N8 m: o% W! z    clean=True,
5 W* R$ s& }; D  {' N    # 字典格式,0 A, Q4 K, b  q  o9 ^4 E
    # host可有可无,默认localhost
: u0 b  s. F$ F. `& P$ w    # post可有可无,默认3306! x; ]  Z) D/ p8 s
    # user可有可无,默认root8 P5 \0 c) ~# C5 R; |
    # password必要参数,数据库连接密码
1 T- ~6 C1 T6 i. b& V    # db必要参数,数据库即将存入的库名
9 X) ]# p3 C7 k+ L, {2 m    # table必要参数,数据库即将存入的表名. K& ?" L6 o) u' c
    write_SQL={
! [, Y" E2 P8 u, Z        'host':'localhost',+ b1 R  Z0 @9 D: e& o) b. C( d7 u
        'post':'3306',5 _. m. ^# d0 U. [3 ~
        'user':'root',: [3 Y  P9 V: q% ]1 ~8 ]- u
        'password':'123456',1 P7 k* d7 m' H1 \
        'db':'example',
5 j- I; g% a+ D/ `5 y( G! D- {        'table':'example'4 ~0 o/ M0 B" g
        }" s! }% I, }, @# l
    ).run()  D& f$ G' N. Z" R: r! _
0 E) K8 I8 J  d( L* Q7 [" {  v
第九种玩法:重新启动爬虫7 c. ]% K1 [/ [% ~3 ?$ C; N
爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。8 X3 z  p' ?0 u) h6 A
% w# j/ Q1 l( M/ a. n0 G
特点:* w8 I( V" u& m
检测报错重新启动爬虫
& A! I6 Z" n0 _' }! l$ q无需手动处理错误信息
3 W1 J1 ]% w' y! R* d8 ]7 }$ `2 c; w4 C/ M, `' i2 e2 ?
缺点:
: s) W/ H6 G8 h1 O" v无法收集子线程错误。
  V3 i' s, K% a4 c) B/ @6 |* K2 F( O9 E/ u+ E( s$ e! @
:return None
' E+ Q/ Q- T) W! I) ]; S0 B$ C/ ~, H) W+ M  U( l: M, t
request.parse(9 a1 `9 ^1 c3 V. ?7 h, o
        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
+ E: k. n; T  T  Y4 z) y        #login="taobao",, u' S2 J7 G! K! z. I
        type_url = "text",
/ ]/ ^9 w: D; c/ q$ [  y. \( t        Parsing = 'xpath',1 F; x0 W+ F7 Q' Y# Q! I, }
        label = {
- L" F8 d* I# z2 v- I; A            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
# [9 |# f% j& F6 o$ C            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],# N6 s5 u5 b- A4 {
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]( x" \. o) w6 c, U5 `6 {# h
            },
0 F/ U- T1 |0 E+ L! N" y# B$ k        write='result.txt',. w. C: ~' R0 u" P- _* V
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
, T" l& D& T4 V, o: ]! {  w        page=[True,"now_url.txt"],
' f" [% J9 T2 u6 {        # texting 参数为是否启用连续爬虫
9 j& a0 |/ K* B. G        # 爬虫程序异常报错后重新启动爬虫/ D, C9 R: v: }  y" O7 B
        texting=True,
4 F/ F: F( l$ G! y0 v* w; N        ###
' W! q& }' g6 ]( ?0 H8 _1 r: l: B        write_SQL={( H/ b+ U. Q# i+ R
            'host':'localhost',
: }) U& O7 m/ u( s7 g% _2 q# q; y            'post':'3306',# R/ A! q. D4 z% D0 g
            'user':'root',: d7 [- p  r, j% [4 `: o- g0 N/ R7 D
            'password':'123456',
$ P3 P$ w5 y: c; Q' k            'db':'example',# x: A+ h2 z: E2 Z4 |. B# t% j
            'table':'example'
$ {% l/ Q8 D$ u9 c# q9 S9 s! D            }# s) {% @) ]4 q7 L$ ]. _& U% B
).run()" ]; f/ V4 E/ Q

5 l5 ?3 E2 u2 n4 A2 u1 ?第十种玩法:多线程爬虫
# T9 \( e: W4 Z  o4 A特点:( [; C& T. h, e7 I, m# Q# e
爬虫速度加快,
' t8 m/ D6 F2 B) a* Q更好的利用了线程。( d$ |2 [$ i% V3 k* Q
0 W; _  A! t8 t/ {5 V  b( k% e( H
缺点:暂无
% N5 S& s! d" U2 |) X- e  v0 Z0 m! {$ y$ T$ a4 U; p# B
:return None
( s- j9 I) o# K# y# \3 g6 ]' D( ~
8 g  s# G5 R" W) p( T+ drequest.parse(" f% q) `6 O) P# `- k! G: \
        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
2 Y* x; j4 z- M6 }% }, W; N! A        #login="taobao",
/ ?/ s9 ?& [$ ?        type_url = "text",
* o; r# H1 n- w3 h        Parsing = 'xpath',
# ^. [1 v8 G/ j! X        label = {
4 M4 G0 n2 q8 R. p) `  P            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
4 Z4 B6 y2 @: F' A            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],1 N7 m5 B3 t1 a) c
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]4 Y) S$ ~8 Y3 O4 d8 \) I
            },/ G% N) r3 b6 V1 m
        write='result.txt',
5 H  ]7 c/ q0 V$ _1 G        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
+ x2 C) @, t5 D  D        page=[True,"now_url.txt"],: Y: G* Q$ H/ R3 Q! K: Z/ @
        #clean=True,
1 X2 Y& M1 U8 P$ ^, x: X6 J        texting=True,
# A' g) v* t7 ^) l4 D        # status="threads" 启用多线程爬虫& y0 ^! W$ _% G$ n% ^7 S
        # Thread_num 为线程数目,默认为1 单线程+ h7 Y3 F$ ^' P4 E
        status="threads",& ]7 \; m0 G' D1 H+ }! m
        Thread_num=3,
" a: s+ g, E6 y0 A& U! T' C        ###) A& T+ S: [4 t! T/ l
        write_SQL={4 F' Q1 A$ {* X, n" D! O0 Q
            'host':'localhost',2 b/ Y* f, r$ |+ K$ c
            'post':'3306',
2 y/ q) K8 ]( f, K2 u* ^2 W5 V            'user':'root'," p4 a) Q0 l; a: l1 ^% T/ C
            'password':'123456',2 m* ?1 T2 R# i! ~
            'db':'example',6 D- P) A$ c  K" ^  Z  G3 E3 Q' ]
            'table':'example'$ O/ C  g5 s, v' G! ]/ l
            }
+ X# L5 S( Y& I! ^).run()
- Y9 X- ^1 T5 w$ K9 X' z' a$ d+ H) {  B2 p$ l. C/ g
第十一种玩法:多进程爬虫
$ w5 H. b2 g% v& y特点:
% z: M6 z; Y( Q& ^) @爬虫速度加快,
6 ^3 \8 X/ d# B1 `0 o: W0 D更好的利用了进程。
2 I, {- R$ d( W  G; _
. L* C2 e! p8 e; g2 m+ y6 ?缺点:暂无: o; m# |, ?8 Z) C0 t

; ~: d2 \# V, ~9 x:return None) X; {. n+ g1 h1 ~& }1 T" _' r

) h" T1 v" ~1 Y4 @. \6 J1 f. d% vfrom simple_crawl import request7 v5 w1 r+ u, D( Y" [" l* U9 v5 P
request.parse(: `& I- I* s9 d! U( w+ `
        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
: U5 j% j# I* z" H5 n0 o! o' f        #login="taobao",: _4 Q# p) s; L* A7 t9 V5 U% `2 I
        type_url = "text",
4 P, j! e5 |& c0 w; y& u9 `        Parsing = 'xpath',* G0 j: d3 c" q- Z: @: z0 t  ?
        label = {
, g, a; k$ U6 E, q0 o8 o  O            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
* Y3 t: c& |4 P& `+ y            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
. g  L5 y$ [$ n) H% F& C" i            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]9 d9 B# u' K; J  ]7 U) b" x
            },) s# I: M6 Q' e0 e, ^4 M8 T
        write='result.txt',- w2 _! t) [3 Q. T
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',) L2 P2 y) @3 ]6 B
        page=[True,"now_url.txt"],
. v4 ]4 `$ ^# q' R- G! F        #clean=True,
; N& d: S9 R5 @) a        texting=True,  b+ u5 p- T, @
        # status="multiprocessing" 启用多进程爬虫
8 P  ]  S* l  r, C/ M        # cpu_count 为启动代码核心数,默认为系统核数一半
  U' h: h* d% P( i  ]        status="multiprocessing",
3 g$ _7 Y' [( o2 I( G; T9 d* \. d        cpu_count=2,6 r  g4 E$ S8 ~, S' h
        ###8 w% {0 F' G" o; t
        write_SQL={
' w0 y7 }) B: T7 g: M7 Q9 W            'host':'localhost',3 H# J* G$ f1 u" H; u9 k8 L5 ?
            'post':'3306',
' h, g/ s$ a* @, x& _2 v+ g+ y            'user':'root',' [; L. R* ^1 p$ x6 R. A
            'password':'123456',8 ?& ~+ s: \  w/ e7 G) X: m+ Q2 t  C
            'db':'example',' T8 p1 }$ j. Q/ N; Q
            'table':'example'
8 L% v# T& z  e2 }5 [- o            }* H, M4 [) Z& M
).run()  ]6 u2 Q; z0 U% u. t3 h

" u" c" ^6 z+ E& Q. x* S第十二种玩法:异步多线程爬虫" v, h2 Y' y" M4 Q
特点:; s/ |& M9 E, P0 P/ p+ M0 H
爬虫速度加快,
9 H. X: J9 \5 y( o- q异步使得爬虫无等待时间,- ]7 U6 I% w* G7 K$ S4 l1 `
同时使用多线程速度明显加快。
  G6 @/ c/ m+ O. x4 x8 R, L  D8 L7 o/ N
缺点:暂无
5 \2 \6 |& l& E' {/ g) ]' [% M  v& c, i1 n- c% u* z. k3 v4 C+ X: F6 D
:return None
0 z6 `; {/ s# \' P3 S6 j; n$ [4 b0 \% _7 M' A0 P
from simple_crawl import request
' S" P4 v9 A" i, V5 x. Xrequest.parse(0 z' o- _, {5 `! V( T) V
        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
8 Q* l7 i; I0 ]& s        #login="taobao",; J! w+ l9 z' u2 p: ?8 \* R
        type_url = "text",
, ~! _$ M- T; e& T4 ^  `+ W7 e- p        Parsing = 'xpath',
/ q; K- K8 u6 H) }4 ]1 N# K        label = {
7 V! N! p" ~" A. d3 K+ x4 {% ^            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],& L; H% z3 G( g6 Y& f
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],/ N" W' B' |/ f( k
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]3 X8 N' L# P4 W( z0 |: p
            },
/ K6 v6 W% ?; l        write='result.txt',
1 `  v9 r1 Q2 s9 J2 H        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',# X  P" R% S( L# S, x$ A
        page=[True,"now_url.txt"],7 m# m7 U1 H  D. `% R/ j
        #clean=True,
' K) m" Q2 `! S        texting=True," P% _) ]9 a: k0 j3 V
        # sem 参数为异步引擎数目,默认为5
. H8 V4 b' _4 M# t' b! e        # 其他参数同上
' F# |' b, m7 L  K& b( Z$ h6 _4 ]9 D7 _        status="aiohttp",
3 N7 B1 z0 N9 k  h* u0 f! c        Thread_num=3,
* ?+ c% ?, y5 K  v8 h5 N" z" e. D# F        sem=5,% j6 y$ v# U" c* p# P
        ###
( |' L/ I- f4 I# f6 M        write_SQL={4 y" L% H2 P& \  U
            'host':'localhost',) N# {* {. U( v1 i( i: a+ n
            'post':'3306',
# o6 y8 W  ^$ J6 {4 y- J, k            'user':'root',! I. d  F6 A  v1 D
            'password':'123456',( y5 V8 P" W& t: ?
            'db':'example',
& \, |7 g  T1 `! R, q5 e* `/ h  |: a3 r. N            'table':'example'
" N9 ~8 ^5 w! X; j* u            }
* n' j0 b6 }; v# `).run()
8 l. @4 A; c" F( A. e+ m- q. l$ P2 c5 \; F4 j
第十三种玩法:异步多进程爬虫7 [$ ?2 X0 a. g" \: R. q+ q+ l
特点:
% `' P; j, o" H# a9 u# v7 B. P3 n! v, `爬虫速度加快,5 ?* {' L; m& c9 Y8 F$ A2 P$ N
异步使得爬虫无等待时间,+ K7 ]; C$ y. S- N* H8 Y2 m7 D$ G
同时使用多进程速度明显加快。9 b3 a7 L: _' `0 _% h/ J

5 t8 A( C+ b( d* y) l8 C缺点:暂无
6 R) u9 m- q1 ~/ ~/ \* {) t( d" r  T6 S% ^/ `
:return None
7 p% o, ^. `1 b  [, M: [" n' \  q7 ?2 Z& z+ b- ]
from simple_crawl import request
# j5 Z- w' x$ trequest.parse(
- s6 @& a# S; j, g/ u        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],% q8 d7 S; k$ q1 z8 v8 R% i- Z
        #login="taobao",# G. W2 f7 z; \/ c' ?
        type_url = "text"," r, x( k: o4 @6 @6 @
        Parsing = 'xpath',
3 K5 h1 d2 `! E  d        label = {
+ U9 W7 y* N, T5 d8 n            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
% S! \; a7 m9 @6 T& ~/ n; L            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
3 c5 X9 N/ g. F& ^7 |            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]2 \2 a+ I8 u9 n) T; Z7 Z
            },4 d# ?: ]: c. n1 e8 e: b4 t
        write='result.txt',8 z0 T3 a0 E4 M* Q' R! X
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',# [+ {9 r+ \6 i/ t. m
        page=[True,"now_url.txt"],$ b- r+ ^# g! T
        #clean=True,* O$ a2 P( V, n. |" V
        texting=True,0 v. m# E' y  K7 t
        # 参数如上- L- R# L1 d/ t. r
        status="between",
4 [8 v: V5 P& ^5 D* @        cpu_count=1,  n. F0 d. A5 b' y
        sem=5,
! H/ P+ R1 j6 W$ O2 I        ###; k( x) I1 E- y4 c( h6 X( R: N
        write_SQL={
( Q" T1 v* d6 G+ ~6 D. J& E% W            'host':'localhost',0 K& y) w- I; C% t# M7 v
            'post':'3306',
3 x8 v7 {; q: u/ e+ R            'user':'root',
5 [8 J) ~; R  J, E4 s            'password':'123456',
! J. n3 ]2 g/ |2 S! r0 l0 ^7 C3 D) }            'db':'example',  Z: G2 v: r) r" n/ |2 \
            'table':'example'* p% s4 T" k: g" |& ^4 @
            }
- J; O( ]$ r3 Z  z: {* \" g+ w7 b1 [) ~).run()
' b. W' `. ?7 B' G8 S) R
* v2 G. K/ Y8 y, s  Q- N+ i; f! F) D# q8 P% P  |3 R/ q
功能介绍完毕🤞7 u1 R0 a+ }! H* x6 G
最后还是希望你们能给我点一波小小的关注。! D  u, O" a' l* Q; y
奉上自己诚挚的爱心💖, }' w* n7 s) H/ Q' m1 q
————————————————4 s0 @& E. h* t
版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
$ r1 B1 S0 h3 W# n9 V7 ?原文链接:https://blog.csdn.net/qq_45414559/article/details/106005684+ R. q( R( s0 |' f9 \0 l

# x& u7 b! ?$ ^% A1 k6 l! X6 U! U/ O

作者: 738391227    时间: 2022-2-19 15:34
66666666666666666666666666666* A9 P4 y) a. w; u3 o1 R6 W





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5