数学建模社区-数学中国
标题:
Python爬虫仅需一行代码----crawl第三方库
[打印本页]
作者:
zhangtt123
时间:
2020-6-2 16:00
标题:
Python爬虫仅需一行代码----crawl第三方库
仅需一行代码写爬虫–simple_crawl
0 f, s+ T1 F" X2 T% p. E& f
simple_crawl
8 U6 a" K1 ~, d8 F: v
仅需一行代码即可达到爬虫效果
- ^/ I) N; a7 v; l0 H& _
项目地址(欢迎star):https://github.com/Amiee-well/crawl
; B5 H" z- J$ W) ?9 ^
使用方法
, G% [) W/ P" I/ x7 K4 U+ N: W: a, Y4 J
pip install simple_crawl
3 q! _% G: O2 ^2 V9 D1 n
# s* D# N! k; [, q
### 以下源代码为简单介绍,详细功能介绍再源代码之下
$ T& W' S1 ] L/ K
from simple_crawl import request
: P, ^, V' d* d& { N
request.parse(
s( ?8 D& C& I$ G% z
# status 参数为运行状态,支持单线程多线程多进程协程以及联合
7 z3 a7 x: S! W0 d! t* P- A, y
status="aiohttp",
0 j. ^- t: M) i5 ^6 q, s3 m2 }
# url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式
5 ~; K# D# U0 U4 R; O% L! U' q
url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
. I! H- n: e2 @/ _. }# @
# login 参数为获取登陆信息,如淘宝等网址需要登陆信息
: S: R1 {$ ]0 v* B9 F
#login="taobao",
$ @- ~6 `4 u. L
# type_url 参数为返回源代码格式,支持text和json,默认返回text
- x! x9 \" P% D0 w/ a3 n! _/ t
type_url = "text",
! d( _; K- J( C* i) L& R `( d) a
# Parsing 参数为解析方法,支持re、xpath和beautifulsoup
3 R+ }& ~4 }) g- T+ l
Parsing = 'xpath',
5 i/ R4 c; h: }! R! @; S6 D7 L$ L |
# label 参数为爬虫解析过程,字典格式,详情见下方
6 E6 \' B* |, a* X
label = {
$ a. H0 y& Y1 m& H9 O
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
$ T+ D9 k" ]9 U- N V
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
/ \4 ^. ~# _1 v
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
, P2 t+ z$ U$ A2 W0 H
},
. t* ]: P/ e% T6 B( P" L# E/ i
# write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱
5 w, I! y$ K+ W! C
write='result.txt',
# a+ {2 e/ F' P) m2 C
# next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫
% S6 i% q/ s1 c1 _5 D
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
$ e6 l' d; B6 @/ k% x% K6 W
# page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫
* m9 ]5 J" W: _6 h" @0 l
page=[True,"now_url.txt"],
3 ]" {" \7 Y5 W" d/ U8 E$ v
# clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息
. d/ U& F5 p1 ^6 H. l# f) k
#clean=True,
; R ?% l2 Q# V
# texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序
/ W& p8 F+ ^% O' `7 o
texting=True,
( {. u5 f' R/ C7 d
# Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态
! E* U7 V, x. _$ P+ R
Thread_num=3,
$ Z {! @( i. P) p) Y) J. J3 P
# cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态
% Q& R) q- A u7 L3 i+ J8 E
cpu_count=1,
6 \" Q3 G" |' s% h" T$ Q' ?
# sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态
9 q9 ]4 {; w1 F1 I: }+ f. u' n
sem=5,
. I* ^9 w! H* w1 j5 H& k
# write_SQL 为是否写入数据库,默认否
% j- p6 a0 h) i, e1 V+ k( t6 I
# host 参数默认localhost
) x# r3 L( ?- L- T3 E3 G8 A
# post 参数默认3306
/ x$ x5 M6 p: R2 C
# user 参数默认root
- Q& c: ]3 R' u/ ]$ P4 V
# password 参数必填,必须正确
7 G3 Y& F) q' l3 L# h
# db 参数为即将存入的数据库名,若不存在自动创建
& W; j& s# c0 L/ P7 \, k1 m
# table 参数为即将存入的数据表名,若不存在自动创建
' \5 ?6 q' n% \0 L0 Z
write_SQL={
* x E) t8 J- }9 b4 ~
'host':'localhost',
( {, ]6 S% [- P) I. j
'post':'3306',
3 a/ t, i/ u* w: S3 x# A0 n
'user':'root',
9 B0 p* k1 Y+ |) M7 m& `5 N2 S$ e
'password':'123456',
& o& H9 c) n" f$ M) r! U
'db':'example',
- C$ i" O; q( U9 C* J; Q3 p
'table':'example'
% ^% l( X& C- v" ~4 p7 C- M# w
}
' R( K' U5 Y1 J1 L+ H- O! b
).run()
% C, `( s* z; I3 P" B8 d
4 W* V9 f: R7 [
介绍一下crawl参数设置:
6 Z% N9 L5 v8 Q% c& p
0 Y0 f1 d+ z) @7 u! j0 \& n8 \8 z0 _
'''
6 P/ R# j5 [( x
单行代码爬虫程序执行
( ]; t$ p; o6 b: [# a2 h; A
:param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档
/ B! Q0 m3 Y. b
:param url:即将请求的url地址,仅支持get请求
4 B- c" p8 @- J1 x) d
:param type_url:请求url后返回格式,支持text和json格式返回
5 O4 \3 H, I: _1 f: a8 a- R# W: n
:param Thread_num:即将启动多线程个数,默认为1单线程
7 U- k. g% V! C3 {5 P- \4 E% J2 o* ]. }2 u
:param sem:协程信号量,控制协程数,防止爬的过快,默认为5
! M) n1 U4 U. h) ~0 K7 X
:param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半
, o& `5 K# n2 m7 U2 F
:param login:模拟网站登陆,保存登陆信息
. W# E, k( I8 [$ c5 O* ^% }
:param Parsing:爬虫方式,支持re、xpath以及bs4方法
: T; j0 o/ S3 l* J. \# U; V
:param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,
+ c2 ?/ U" g/ `+ D: b& R* G
多次报错结束程序,默认否
7 P1 `& R& Y @' w
:param label:选择器内容,字典格式保存,
( M* Q7 T/ y9 w* w& K1 ~% i% j
字典值为列表格式,第一个参数为选择器,第二个参数为转换类型
/ r' p8 B7 C& T3 l5 h4 ^. u
第一个参数必填,第二个参数默认str类型
( x! {6 M6 V$ s1 C, V/ M$ m( c0 Z8 {3 g6 B
:param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否
, ^: y0 J0 f1 N4 G2 h
:param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫
) G$ ?9 a% k9 {. b: j
:param page:是否选择断续笔记接手下次爬虫处理,默认否
0 b$ P+ g. [3 X
:param clean:是否进行简单类型数据清洗,默认否
7 }5 O o) [+ p7 F
:param write_sql:是否写入数据库,默认否
& U* b7 C A2 G& c
'host'默认为'localhost','post'默认'3306','user'默认'root',
0 G8 y' C9 E) w3 ]! D! E9 u) R
'password':'密码','db':'数据库','table':'数据表',
& s' ]$ E1 x6 S) L: @1 s. N
检测库是否存在,若不存在则创建,若存在则直接插入,
0 h9 C& y7 X$ ~$ M0 M% \
检测表是否存在,若不存在则创建,若存在则直接插入
" n8 ^. f" d8 ?2 F# n! [
:return True
% y9 @" O1 Q! ` e5 T! i) k/ B
'''
( O' w) Q* |1 t8 H% q
介绍玩法
; q: x( y9 N# x. s/ V! v4 @$ d0 j8 y
接下来介绍的均为调用第三方库的情况下运行:
- l* a, c, I4 t) d
$ n G U' P M; E5 O# P
from simple_crawl import request
0 ^# b) y' v$ R1 U9 @
第一种玩法:输出源代码
3 a8 Q/ b6 C3 `6 @+ Q! F
调用requests库进行源代码请求。
, ^' D, M) O3 b# ^
. Q3 P/ `, h1 P* b2 @. W
特点:
5 O6 D$ O, y2 h
请求失败则调用ip池处理重新请求访问,
9 V+ {: |. I, K+ x3 A* M
出现五次失败默认网址输入错误。
8 O( @) k. t% w4 J' j+ b( C
支持text以及json字符串返回。默认text。
+ e- c) D6 [& ^6 F/ |$ F" A$ c
! R: {0 B% E( T. Q% c* D" c8 E
缺点:
' I, b5 e7 @1 `
暂时只能进行get请求,不支持post访问
' b# E$ |- Q6 z" T6 h) j/ ^8 S
# }8 q) \( {) \$ [" Z4 M2 _6 Y
:return text or json
3 ]2 I' A: s4 M8 _8 h& L
. j' Z8 l& U) h- I$ H9 i( A# }
request.parse(
1 o8 |9 l$ A. l, R
url = "https://www.douban.com/group/explore",
5 }" D3 ]% f! J# ]: `: t8 r: `
type_url = "text"
: P- N* \" Q5 I
).run()
& R4 x% C* q0 S/ K
# return text
+ }# @! A& @$ m8 i3 G
! Q9 ^* ^9 G/ p! {/ r
第二种玩法:模拟网站登陆并保存信息
8 ]+ D i% b9 o& n' R6 c' P
调用DecryptLogin库请求登陆访问。
% D. l6 c9 |9 L" K
( M$ e( G; W c, G
ps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源
, X4 g6 B0 }- u: |7 u' ^1 ^
在此放出文档地址
9 H j: r( `! {" m
DecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/
/ B1 A- V2 U5 Q
! t# w; \: b: e) R
特点:
0 w- W) p y1 f3 E4 B6 r
将DecryptLogin库中二维码继承到此库(非二次开发)
5 P# x9 t J. L% A
支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆)
Y5 C" n& ^6 p E9 H
保存session.pkl信息到本地方便下次登陆运行
6 F, J' H+ ~, a8 _2 e
: D4 `8 \! j4 Q- t* I0 j; j
缺点:
* v3 I$ o. U" D; l, T
session.pkl登陆信息过时无法自动删除。
% e$ O' F: t% W0 p' F
导致下次登陆疑似cookie无法正常登陆。
+ k. J8 U' J7 u6 U6 d" d
4 Y# g( w! C( Z* l4 Q
:return session
4 |5 X3 ~# W3 g' t3 K
2 w% P0 b! D( @' o W9 d
request.parse(
0 ]- V: ?/ q( _+ L8 [/ \- B
# 臭不要脸的推广一下我的店铺
8 X3 o2 R, ~* V* M7 r! m/ H
url="https://shop574805287.taobao.com/",
( J+ ]4 _' v, D: E" }9 s
login="taobao"
' n! ^ T, y' s+ j0 \: H
).run()
* [6 |: g" S3 \; W2 I- D( m5 b
# return text
- c8 c! y9 }- @! E0 g( E
* y) w4 r: j( S E
第三种玩法:爬取网站信息
& i# q3 O, r) ~
爬虫库自然少不了爬虫的过程
$ R& \9 v1 P. a# n% S
+ e& d! O5 \! }$ ? N
特点:
& t- s& C b, J8 i) ?
支持re库,xpath解析以及bs4选择器。
) E6 d1 [0 r3 S
爬取方法为字典格式。单方面输出。
1 d1 C' V* Z7 b& Q
字典键为保存的字段名称。
( s. G+ }. x' @
字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。
. Y" n6 _9 X% _1 Z1 T X
" c5 ]2 Z6 i/ w% ~( u: T
缺点:暂无(等待小伙伴们发现)
& m( e6 Z3 t- n1 @
3 J! I7 H9 F* o% l; A* n9 K& w% M
:return reptile_results
! `7 f" `! E( g, `7 @, g+ x) F8 n
! W$ K8 Z9 H2 z6 V1 u
request.parse(
3 D8 ~" P" Q1 K7 R) E
url='https://www.douban.com/group/explore',
9 B' C6 ]' l; G' j; v, h. Y
# 字符串格式,选择器方法。
& W: t* x$ K0 g% o, I2 f
Parsing = 'xpath',
$ I4 b2 Q& T- M! a1 m0 B
# 字典格式,参数如上。
, N- u7 L, z; \ ^- T
label = {
- y5 m) g W! L; O, l1 s4 I" _2 w7 a
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
& n3 `5 K1 L7 O3 ^" j/ R) D, L
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
9 Y1 x5 }% \5 R* A+ p# ~; a# |
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
: Q. T) ~! ^9 l! e
}
' P* O' J) }4 i$ B' d$ ? ~
).run()
4 z7 r$ @7 X6 h# v
# return reptile_results(list)
5 |! M, r# m- [5 ~% F9 `
+ |" P$ U+ ]& `. _1 z; }
第四种玩法:自由保存信息
% V1 N! m) Y9 D8 b
目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。
8 t3 B- P! ^0 k' |
! \, }" S' w, k5 u% {0 X
特点:
" I0 ]2 T7 S: k% b' H f
写入文件均为数据格式传入文件。
s* |% u; ?5 F6 [ ]
且输入格式规范方便阅读and省事。
, M0 b: ^4 z9 T* S5 I4 G+ O& O
7 V' h- Z0 ?0 h+ V. d
缺点:
~1 _% X* i/ Q7 z1 D% K, {& _
保存格式仅四种,
: u3 j5 y% l; j+ {- A
不方便用户之后读写操作。
4 y, ]+ X3 t# l' c& [2 m+ q* b+ U
& `% a% i( b8 n2 ~% B; r# A
:return file
# _- S3 x; b$ w/ a: f7 }$ f
5 D K" M; w- S- [1 \
request.parse(
3 N9 K$ r# I# t
url='https://www.douban.com/group/explore',
; i/ F$ G. h' ~! n% M B1 I
Parsing = 'xpath',
9 s6 q# P8 J( d- M3 j
label = {
6 V& E$ c4 ?" j j% {
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
[" W+ O z9 z$ n5 k7 G
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
4 A1 R; m8 t# u! l A# x) c& Y, w
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
, Z" E Q t, f7 s( D' W
},
. f6 M- r8 |! t; V" a+ B8 i7 y
# 字符串格式,具体保存位置填写
3 [# L4 A0 x3 I* X( W
write='result.pkl'
" f& V( c) \5 {, s. |6 q
).run()
$ c+ N' N! I2 g% t: C0 O
# return file
9 z: C- G; X5 f B# I% C
. w7 O" S5 I; `/ K3 v" `
第五种玩法:读取下一页 url 地址继续爬虫
/ X; }- H1 ^! x+ c# A, d
这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~
, g6 m# W9 t6 C: R
6 h! j9 C0 j9 q: r0 }
特点:
- g' U6 E0 e1 Q4 [# ?9 S' O
继承之前的Parsing参数选择器选择方法。
* c6 x; j% ~! \1 w" |
在这里可读取到解析后的下一页 url 网址。
: T, a0 L& c$ {7 S5 n
方可继续进行爬虫处理。方便用户使用。
0 |: Z" P* e B8 x5 R$ e
% s' V! m% J* T
缺点:
' `% G7 I( T2 p
若爬虫时下一页 url 地址改变,便结束爬虫。
6 p6 G0 h+ d& f1 q6 F
只能爬取所给 url 地址中的信息。
6 a) E) b5 X0 {) w7 u( ]
无法进行某一界面的多个网页爬取返回。
% E' O" h% @) \4 x
造成访问页面单一流失。
8 _1 H. s/ o" _1 y) z( j
' `+ Z( J' x" K- G
:return None
) A1 Q+ e! M# F& I
: L& q, l, E3 M' L
request.parse(
& H- L' J+ x* r) |0 x% C
url='https://www.douban.com/group/explore',
8 r+ E+ h4 x/ e5 h
Parsing = 'xpath',
) o l& L" V' d1 d
label = {
8 @( p0 v# ?$ C2 n) e9 z6 D( f
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
8 Y" L) L% k# s9 I5 k/ y. Y
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
7 H8 B2 t0 t$ N
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
7 R' \5 f0 O! ~
},
; ^# |; Y8 v& P
write='result.pkl',
a$ W, {+ _, [2 O% i" Y4 _
# 字符串格式,根据Parsing方法继续请求下一页a中href
+ V% @: E' R. `0 P4 w1 K
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
, M. H! B9 ^3 q, u" ?* [
).run()
3 V& T$ x. W2 ~, G5 D6 z L6 \# O
# return None
4 `2 d# l# F% T- K8 a- v4 P5 o( ?
T7 ~( U1 H: I% J/ H" D3 @# ?
第六种玩法:爬虫网页保存
5 H/ c# J6 ^+ x7 k/ ?
听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!
! ?. I0 n8 g0 p* s
# i' W, d' Z6 i, f/ H& C
特点:
) z) G U- f8 Q/ a
持续输出断续笔记。
, R# L% }; Q P5 C1 v9 p
将此次爬虫的 url 地址保存到一个文本文档内部。
/ n. I( W* K3 J
下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。
3 {* u$ E* c% p, Z3 {9 m5 I- m
8 D5 o+ F7 a8 g0 R
缺点:
$ p; s8 o! ?4 Y) P
读取内容不单一。
; @2 J- V5 Q* j4 s% M6 y3 ^/ c
导致下次爬虫无法正确读取上次爬虫留下的痕迹。
2 K8 l9 |; P% F5 o$ L$ J
) q6 h( W7 z: O
:return url_file
& |6 d4 b2 o6 y4 _; R0 i2 ]
: s$ v1 i9 D, _$ o/ T6 t2 N
request.parse(
$ }% e$ P% l( J6 _* ?7 z8 Y) _
url='https://www.douban.com/group/explore',
6 g, Y4 S, g6 s" v3 j
type_url='text',
/ }3 x; F* r& K8 J4 H v8 D4 d8 b+ F, z4 |; [
#login='taobao',
- u$ r3 F% h. X3 a0 H- t
Parsing = 'xpath',
, h( d. I$ @/ k
label = {
* N( ?4 w; g2 t$ R8 y g% T+ ?3 {
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
) v9 R' D' P# t
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
( ]3 F; F3 y' l K( @4 I# M( X8 B
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
+ A# X' P0 I1 ^5 W8 ~- }2 C& t" ?# [% N
},
N8 r- Y d) L( w2 A: k/ H
write='result.pkl',
8 X: n/ T! z7 s8 Z$ X2 ^% G! Y, V5 S& x
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
4 M: r: u J# g b
# 第一个参数为是否需要断续笔记。
! o( ]1 x! ]5 a; g+ E3 ?$ ?: m! p% h8 t
# 第二个参数为断续笔记保存位置。
I3 u+ L* Q2 j( L
page=[True,'url_page.txt']
; t9 c3 q; G$ r( h9 F
).run()
0 o4 U9 X1 n4 R( L8 W
# return url_file
0 s: I' D! H& a; O# `6 s" V
. F6 A. F- a0 v+ E3 a+ Y! s7 @
第七种玩法:简单数据清洗
v8 y( s! f6 w# i; h! y
数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。
) p8 Y/ q, S& ^: c
) i; m% i2 v5 ]/ t& F
特点:
7 S& _2 D( Z- u9 C8 i
本人曾写过一个底层数据清洗。
9 m7 g7 b% m$ J1 Z
能将列表格式数据进行归分清洗。
$ x. V+ B. G% v) B0 f4 v/ d
主要内容请参考另一篇文章
# _( A9 x7 {0 _9 l& Y7 s4 K- f* L4 k Z
如下连接:数据清洗
; |! h4 b# l8 n7 ~0 D
5 W' o9 j0 c$ j3 @4 K# w* Z9 V5 M
缺点:
. q& V' _0 D1 r
数据清洗格式简单。
3 B, X# o" l+ K# J% A* E* ]' w+ H
数据清洗内容单一。
# d( F. b# Y( o, M
无法完全做到绝对清洗。
3 T F) f/ b% o+ p) X" u
有待改善。
/ r4 {, B! n5 h: w& R3 q+ A4 X
( v6 \! s( p3 b
:return keyword_list, value_list
: B$ R( y. S' k* X; B% R" Y
7 w& U7 X/ e3 ~ h# m) n
request.parse(
! ?/ B& s% P7 {5 c3 P
url='https://www.douban.com/group/explore',
# {- K1 v! c4 O$ J+ K+ q$ D8 F
Parsing = 'xpath',
$ }. C0 o2 L9 Q, _9 \9 l) r
label = {
, S$ A2 U/ X6 F! E
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
7 I3 k+ R3 K) J$ z
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
3 b" ?: U% K# v z+ B# s
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
7 x" I8 Q1 g( Q& V4 e1 D
},
& f* D' E, G; N% H/ T
write='result.pkl',
- N. d5 V+ j l
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
6 f# D! H1 a6 k' E( E* e
page=[True,'url_page.txt'],
* t9 c. P7 S0 o7 X
# bool类型,默认不清洗
& z5 [$ e ~9 r) I# E. |+ b" E
clean=True
+ v" x( T( H: Y8 C0 v
).run()
. o% Y/ V1 p% v# v/ E7 K5 F
# @- n/ Y' T! k- `: \
第八种玩法:爬虫存入数据库
0 ^7 R- O, I5 g4 Z- S2 q
存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。
5 J4 N% I- ^/ b7 y; Y6 `) L$ V8 o
$ E5 U. H7 `/ u0 ]
特点:
! J% |% w# {+ J0 r
信息存入MySQL数据库。
5 |: a$ h/ n8 v& Q6 M
可连接docker远程数据库。
4 e- D4 d0 e, }$ {% v6 u9 {
数据库的库名可以不存在。
9 T' U4 ~$ j7 e. B" S2 [
数据库的表名可以不存在。
( d, |9 G. e. O6 A% V
根据之前传入字典键与值参数判断表类型。
7 _ P( ^5 j3 K4 n( |1 G* X' N8 \
自由建立数据表传入信息。
# K8 Q6 o" N) l: m' i# d
5 K& L3 C( A2 A3 d6 G
缺点:
/ F% N" b# ~ K* O+ p
仅支持MySQL数据库。
8 n4 g2 ]3 W# ~1 i
! }0 _3 m# }' `$ g" I$ ~3 b, m) q8 w
:return SQL
. k# v! u/ |2 ^# h7 V
8 l5 r, {3 N, r- B3 L
request.parse(
9 n& w8 K4 y: J
url='https://www.douban.com/group/explore',
6 K) g& ^( ]9 m' f; i) m$ o& o
Parsing = 'xpath',
' i! c( s( ]; Y4 c7 A
label = {
+ F8 p0 j% O! b2 ~3 e
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
' q4 I* i* D2 ?
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
2 y9 O9 p O2 r. A# c1 o1 p) y
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
6 N5 g8 t! J) @) ~6 L9 a
},
Q; a: o( Z6 K2 Z
write='result.pkl',
) h0 q; w/ L$ L! O0 L" v; l
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
' P' |8 k% f7 G9 |5 N- t3 A1 T0 e
page=[True,'url_page.txt'],
$ U& X+ F+ z; m/ W; V5 p
clean=True,
P/ S6 `! u" f* ^; K5 \ l
# 字典格式,
# E5 H7 K) x6 z* R9 H! c
# host可有可无,默认localhost
8 K: p$ L) I6 f# [6 I
# post可有可无,默认3306
4 `, C# @4 ^2 K
# user可有可无,默认root
7 {7 @8 ^% x+ R1 \2 _
# password必要参数,数据库连接密码
; Q, _# Z; m* _ f; p$ `1 x
# db必要参数,数据库即将存入的库名
! Z! j: p o/ e+ t, ^. Z
# table必要参数,数据库即将存入的表名
& ~ ~0 ?1 b% b# O5 y- L: {
write_SQL={
. r' f( n8 o- s: b) g9 _
'host':'localhost',
% \6 h [$ l7 r% G; r3 @4 m; @5 Y4 j
'post':'3306',
. u7 n' w$ G! _4 Y6 N
'user':'root',
5 ~9 x8 o! b) D- w. K# l/ Q
'password':'123456',
1 n( d+ Y2 v4 \( T1 i2 Q* d- s8 I
'db':'example',
8 P( {. ^2 w0 u
'table':'example'
\* }& I$ N0 X7 W& m: N6 d
}
( V" B; g) P& a8 V8 x0 i
).run()
w/ |4 ]' ?7 g8 {
) V% {8 ^: u* S8 g
第九种玩法:重新启动爬虫
' u% }/ ]- a& |8 K' [: H
爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。
+ k" ^5 L/ G0 Z0 t' F& U
6 F! I5 ^8 b* e0 |- u7 W
特点:
+ `" y/ F$ y! m; B `
检测报错重新启动爬虫
; M( m5 S+ U4 a/ K3 a4 z/ B+ w+ k
无需手动处理错误信息
1 }0 H! Z$ a( |( T
( T" q3 d( m9 G. T; _1 \4 \8 C, `$ x
缺点:
( ^" Y W/ \9 ~0 I! [5 w1 R
无法收集子线程错误。
9 U$ I7 N8 z8 {6 \5 O( T3 C
% o/ ~! S& a% @# }, A
:return None
# L' e* l1 H' ^- ~- T
6 c/ o* }, B) _5 A v4 I
request.parse(
2 Q$ o* Q+ }0 ^4 b b- b6 G6 O
url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
v; [! Z) V+ I, I" {
#login="taobao",
+ U0 V8 B1 h% g3 C6 a* F
type_url = "text",
# V5 p' P4 R+ h: e
Parsing = 'xpath',
2 ~1 z1 `5 w( {, T) @
label = {
' U( H" ~; c4 o: d ^) G- W9 H
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
. ]6 N4 q# | f; J5 J/ p
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
+ w1 y6 v# i/ w: c8 j% q
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
+ E' j7 l3 C, M# X: c( ~
},
7 P" I1 \9 x4 A% w" @+ o. e
write='result.txt',
3 d: W+ [& u \" {% E& P/ P; s$ d
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
, }4 b- v- C6 c7 i! i0 u. e$ X
page=[True,"now_url.txt"],
$ }' L& ?- i& B) p! v2 C
# texting 参数为是否启用连续爬虫
7 Z; P( X& m2 L& N" j
# 爬虫程序异常报错后重新启动爬虫
! W F, D7 T7 X2 h# v( @
texting=True,
+ a! {5 x, N0 g5 e, l' G# f9 L
###
$ i7 p. c* g; x
write_SQL={
% y# x) {5 y9 |6 ?( g6 [
'host':'localhost',
" R: i2 E! |, I5 _7 b2 j! U1 R% e
'post':'3306',
$ `. d5 ]: M+ C. M/ ?. e4 u
'user':'root',
- ~# N. V4 r) ~: j
'password':'123456',
8 @1 Z; [ ]! Z. ^
'db':'example',
' N' v8 ]" X, n- v
'table':'example'
/ M8 w1 J; K. z6 l
}
- p1 f$ L. n& Y. |# j' f
).run()
) |4 z( E7 R' A
$ A$ ? Y6 `7 N( b9 T2 R6 B1 G
第十种玩法:多线程爬虫
7 }( s6 \1 d' ?' h" |% V
特点:
) Y1 T3 X* o j& ~8 }: u0 {
爬虫速度加快,
+ [/ K) b7 E& |/ T6 [% c2 h
更好的利用了线程。
6 D* ~$ n, A8 `& W, r9 S+ g2 W, ~6 m
: d# b/ ?9 w% @4 ]$ E: G" X4 _( T
缺点:暂无
" O" q/ N+ ?% @0 L% E
2 ?* R5 w& w' m% d( f( t u# }0 V
:return None
2 i" U l2 [5 O$ x
% p# e- W. v1 G( x. H. c4 S( J$ D# x$ B
request.parse(
% h6 x: }6 g) X( h1 H7 p
url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
H' ?5 G( Q5 b, Z
#login="taobao",
, |: z2 j( K/ x2 q
type_url = "text",
5 ~- i \9 M" A- e2 Q9 \
Parsing = 'xpath',
# P; t+ b2 h0 Z: O: [9 p, U* E
label = {
- p/ @; J" b: D4 E0 k
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
; C$ x5 d4 _ E+ @: H* Z9 S
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
8 U( @% z2 U: U! {" v9 r' Q
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
7 z; C$ J- f \2 n, n( I. A2 J
},
' N3 J$ {, B6 g- C" e1 p" Q
write='result.txt',
/ K) K& m3 y* ?6 _' ?- I( V1 P* H
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
" G' I- t- W3 r/ K* s
page=[True,"now_url.txt"],
$ {" B3 N# X O% b5 v+ F; q1 U' b
#clean=True,
% s5 S( i* w9 t" R1 o- b
texting=True,
" K6 d9 l% c8 V/ v: l
# status="threads" 启用多线程爬虫
* A" D! ~1 y3 P$ u
# Thread_num 为线程数目,默认为1 单线程
5 w5 k" G6 v3 M! ?: |
status="threads",
9 E! v u# Y* h9 j; C+ M! {
Thread_num=3,
) `3 e) I+ |+ ?0 W) i) R- ]+ I
###
$ b) Q& T2 J! o6 B% Y
write_SQL={
1 O, @0 m* p- d4 W. R
'host':'localhost',
8 X4 k+ h0 M2 B1 @
'post':'3306',
. I1 i5 _$ x7 u" K; Q
'user':'root',
) x4 z8 q+ y/ x5 d! V
'password':'123456',
% \4 I# a$ q1 q0 `! y. I
'db':'example',
1 j8 @4 e& [5 E, I7 {! N# g. O
'table':'example'
0 O5 S4 b/ s! }8 p; f
}
F# d$ r8 L) o, ~, O, H
).run()
4 @4 _1 S) n5 k+ n& N
/ m3 `. E4 _3 T4 D( f4 E
第十一种玩法:多进程爬虫
8 D4 B) y! i# u
特点:
( r- O: P- Z! x9 l1 M
爬虫速度加快,
# R$ R# E* L4 f8 x( U9 K
更好的利用了进程。
% m. V* @% _" o: Z. ]' y
+ Z( B. t. O& _# m) W6 [
缺点:暂无
* z. J+ ?7 F2 [ W% e
6 p* ~# V# O ~3 E( ], B- \3 J W
:return None
1 b5 }7 D, w/ T" @8 V
) R# [1 s# w' H6 m' _5 ]6 h
from simple_crawl import request
+ y/ A# |! X' B
request.parse(
) M, U. L& Z+ Q6 p& Z
url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
/ d/ G7 ]' V X+ a& w8 }
#login="taobao",
, |* t) ~: P( k3 P4 |6 W# C2 B
type_url = "text",
1 t2 S4 d0 X1 h# k1 N+ B
Parsing = 'xpath',
% D; R( S. w9 W8 Z1 z; Y( K; c5 Y
label = {
0 K) G: M5 K; l' T9 ?' G# G2 f. R
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
0 w/ }! k, I# I2 e, Z- P3 M2 \8 L/ c; F
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
4 A5 p# v% X7 n8 Q# P- f' }
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
# P: L# n Z: P. e- I' Q3 J, N
},
: |5 a6 `) ?, X l8 F) K3 b8 b
write='result.txt',
+ U/ v5 ]" T. o/ u. m3 `7 v0 S, I
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
: q/ L! w( Y/ N% G9 q5 u+ S
page=[True,"now_url.txt"],
6 i7 E) ~, e& ?& |) x# q4 J/ s
#clean=True,
8 u' l" x- q+ \5 F$ \
texting=True,
+ X2 q% R' Y: S1 P2 @7 y
# status="multiprocessing" 启用多进程爬虫
' ]3 g+ i7 c% j1 Z* C. L* w2 R! y+ ~
# cpu_count 为启动代码核心数,默认为系统核数一半
; l' s# J6 I! v# R* G U, n
status="multiprocessing",
' U! M! u |" U) l
cpu_count=2,
: C# H9 H9 v7 o/ d0 q& H9 _
###
7 w1 M1 q2 d; [! q1 S% v
write_SQL={
2 P& b. l1 B/ X5 |4 y
'host':'localhost',
2 e% G: x! K- q8 U
'post':'3306',
8 f$ ^8 [# Y% w2 i
'user':'root',
! w1 k. U8 q5 A/ H8 O
'password':'123456',
9 h' T+ }" L+ [. G2 R4 d$ J$ ]
'db':'example',
6 u3 [, l1 c2 ~/ _. ?# Y. b% S
'table':'example'
3 q% i3 H2 L% v0 h9 N/ _
}
+ S: c8 F; O, J: m
).run()
5 S' Z+ d1 }: @; e2 z2 d( d! N- j+ H
/ u9 b% j2 u2 Z. B! B1 ~: k) C
第十二种玩法:异步多线程爬虫
! a4 G' b: X$ \; S. A1 | u& I& o
特点:
$ W+ ]1 y2 z" V6 {$ U8 W* q
爬虫速度加快,
4 F; I I- K5 A0 U ~
异步使得爬虫无等待时间,
% z9 v& h# u; m( ~
同时使用多线程速度明显加快。
J' n# U' P& K6 N7 ^7 q
- O% f) ?' q+ P' X
缺点:暂无
5 u+ L' h/ _, W5 b/ P7 T
& w8 X% i6 @* u" a, M ]6 x
:return None
* r3 j/ i5 m1 O! s p! I* q! Y
X, `. y& {. w y/ h
from simple_crawl import request
9 |: Y I/ e% _3 ]3 q5 Z, F
request.parse(
7 v! {$ t$ [# t+ u
url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
; D% I0 @8 ^" @& f4 i
#login="taobao",
1 F9 r- v; l! l, ~5 v6 I, G0 {" W
type_url = "text",
* }2 ?8 ~( h/ z5 C
Parsing = 'xpath',
3 G6 ~0 O$ s2 \
label = {
( e) Y; `6 l M h# k
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
: N. }1 @- d! V8 }
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
/ C+ ^5 W1 E+ _) v: ?! @, E
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
* H1 p& ]* i5 J
},
# Q: Z% b- U8 p3 O
write='result.txt',
9 e: T6 ?' U" J4 t: p1 S
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
7 n6 K- S2 s: S! w$ m; C
page=[True,"now_url.txt"],
& P$ l8 X; }, q/ r; F. @, n$ r8 ?
#clean=True,
4 H( J( e! P' G' _* a! l* r: ~
texting=True,
# x# h# G9 ~5 u* s
# sem 参数为异步引擎数目,默认为5
% U% @% I4 J$ C9 A1 S& i, y' L
# 其他参数同上
6 G1 M8 I. \& k4 T
status="aiohttp",
9 K8 @2 E9 ~4 X# A
Thread_num=3,
% Q2 S2 \# a9 z& }+ x. O a3 n
sem=5,
* }: z5 N5 ], C: k
###
- w% E- R# R& t0 ?
write_SQL={
$ }5 C) Z. L* z: i/ y& Y# B" f
'host':'localhost',
' Y' ]; Y3 C2 ? V- a8 R# W
'post':'3306',
( z/ b* J( t& `4 U& i1 I* H8 s6 d
'user':'root',
m+ V5 n& V7 ]& g0 k/ Q
'password':'123456',
; ?) Z. v. y; g
'db':'example',
) A; H) `8 ^- F. n; r
'table':'example'
( b$ D( F" F. V% Q
}
& p3 @" j/ W( |) J* c
).run()
* K; [$ ^$ w) [! u* a4 Z
" h' X' e. i7 P
第十三种玩法:异步多进程爬虫
+ _: l! O1 X2 B: m+ y
特点:
( Y! c* B2 L5 R, u1 }$ F
爬虫速度加快,
; H" D1 E% A0 K0 G) Y1 _5 n* Y
异步使得爬虫无等待时间,
5 J w, i0 M8 J' f. y" K1 Y
同时使用多进程速度明显加快。
( h6 f n1 k" c. I" k$ L5 r8 P
: y8 }) L) a; k5 f0 E2 \; d$ s" k
缺点:暂无
3 F6 u2 m& y0 ?* m
4 m4 C6 M/ l; A# Q' t A# c! E
:return None
$ l7 g7 U9 d/ ]$ ?. s& x
( ~) {# @; A) d1 z
from simple_crawl import request
3 y, Y) V( L& P- z
request.parse(
" K" \4 C, x3 o+ f
url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
5 y3 @" j6 ]8 Q7 I" O0 K9 x! S
#login="taobao",
* e& z. V j9 T3 Y: r- j( {- _6 e
type_url = "text",
& B0 P$ d8 w) H' w6 l0 i* ~) A
Parsing = 'xpath',
) y0 I. n' i, S0 d
label = {
+ u7 I, K0 d r% {, y6 W
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
! a0 F7 Q: S8 z& B# e: ^
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
, d3 m+ j1 d. }: u7 t/ V0 Q
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
6 k+ }/ c) N: {1 V# Q
},
; i" v9 [9 {0 T- g7 O* d) r, M
write='result.txt',
; M3 g- b9 ?1 y4 _1 p! X
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
" ~) u h+ x7 }0 H; Y1 o7 K
page=[True,"now_url.txt"],
$ x+ y: C& m; u
#clean=True,
' x+ d6 Y% r# O# \. h0 D
texting=True,
8 ~& O8 a Z+ t# w2 A* m
# 参数如上
' @- k$ R) ^ o" l
status="between",
2 B. ^! R4 K0 t; e2 [
cpu_count=1,
$ R5 M/ }6 ], {" H" G
sem=5,
) I) U9 Q+ b5 }1 S. @
###
4 `5 w4 e- L6 g0 `) O; m
write_SQL={
+ h9 R; C& o6 B3 u N3 p
'host':'localhost',
1 B" f/ j F' {- v% f
'post':'3306',
5 @5 p$ {' i5 m
'user':'root',
. R n6 S5 T8 T. ?( G$ H) p
'password':'123456',
" m$ P4 E* w+ j
'db':'example',
: c, J6 Y9 o7 A4 J3 I& t
'table':'example'
) p( M g" J2 J# U& _+ F) X
}
- U+ M P, H X5 Z' ^* E" J# \& N
).run()
" J8 C( ~( O( O/ E5 k! F- B
3 Y& g4 `. e0 k: @0 h+ K! y
, B! `# v2 E+ q3 g+ O
功能介绍完毕🤞
, X4 i0 y% E5 y7 F8 z1 r" F
最后还是希望你们能给我点一波小小的关注。
1 p; M/ Y a4 N W$ ]2 S3 w4 n
奉上自己诚挚的爱心💖
8 p7 F' z& f8 u4 q: @" [; ~
————————————————
0 c2 T3 a4 Q9 ]0 u
版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
: n2 e/ |9 c0 z* t ~9 G
原文链接:https://blog.csdn.net/qq_45414559/article/details/106005684
! @3 X1 D7 B3 M# m9 i
4 N @# V% H* C
1 }: G% g9 C" p
作者:
738391227
时间:
2022-2-19 15:34
66666666666666666666666666666
0 P+ G0 |! P5 C% @
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5