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