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