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