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