找回密码
 注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 1400|回复: 0

Python + pyspider某小说站的爬虫,入数据库,火车头发布,资...

[复制链接]
发表于 2019-6-8 23:06:07 | 显示全部楼层 |阅读模式
Python + pyspider某小说站的爬虫,入数据库,火车头发布,资源下载到本地,另可写爬虫!6 {( X( n' B2 N
  1. #!/usr/bin/env python; |* q( K% S' k, N+ ^; Y# h; h& V2 I
  2. # -*- encoding: utf-8 -*-. D  m9 ^) [) u( b# r: t, F2 h
  3. # Created on 2019-05-05 21:43:11
    $ n! {! N3 I/ Z; z# L3 r
  4. # Project: XiaoShuo
    5 k& U- \- Q8 |6 T

  5. & a" S( t7 f% u7 n2 A+ k: T* @5 B
  6. from pyspider.libs.base_handler import *# C+ u5 G! V; A7 L0 u! l
  7. import pymysql
    5 `+ b3 ?6 r3 t1 K3 y& U9 m- D6 K
  8. import random
    & C3 c* o+ S) E. e/ Z
  9. import datetime
      l/ g- e0 l. D- q7 V; F
  10. import urllib2,HTMLParser,re9 h2 w) R0 L% g
  11. import os4 X, ]% x1 B6 M4 t
  12. import sys4 i, Y  y3 Q3 V7 |! J9 S- U5 O7 E, L
  13. import re
    . ~% V' F! `( s* X0 w
  14. import codecs* R1 b4 O: e( C" k3 _4 Y$ o; A# |
  15. import requests
    8 u+ V7 r' `  K: I
  16. import json* I! _, c  k5 K" {+ F# e
  17. * p  q* J- u) D! U- D# g0 o
  18. class Handler(BaseHandler):6 N- k4 q( y0 W3 H
  19.     global Datos# ~* O8 J8 T( K
  20.     global P_dir    ! y9 Z7 w' S( h+ @
  21.     P_dir = '/Tools/Debug/'  #采集时候图片保持到本地的路径2 _: f. T" M4 o4 ^! I" b& _$ C
  22.     global Datos) @( j% z( w. S% i0 d3 L, a
  23.     Datos = {}# P2 b( Y0 C( b/ X8 O) N
  24.     headers= {# M+ ^6 O4 X# }) \" L
  25.     'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    8 w; G4 Q% I, ?4 L" X" F
  26.     'Accept-Encoding':'gzip, deflate, sdch',/ Z/ V4 C# `& Q3 v0 x) }( z
  27.     'Accept-Language':'zh-CN,zh;q=0.8',- a( P5 }7 E3 N' T1 J
  28.     'Cache-Control':'max-age=0',+ ?9 [2 F- e# T/ i& Q. _/ N6 ]) y
  29.     'Connection':'keep-alive',
    : e2 v' i) @. o) V) W/ \
  30.     'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36'
    0 o0 V3 U# I3 J+ F
  31.     }8 ]& v6 `/ i& }3 ^
  32.     crawl_config = {
    + u6 p2 I) Z/ H; h% ]# l) e7 E& Y: `
  33.         'headers' : headers,
    5 U& ~) i; E' k
  34.         'timeout' : 300( j5 }" n8 s& Y' W
  35.     }9 O0 I( l( H' c4 d. Z6 R1 c- q3 N
  36.     def add_BookFile(self,Bookname, BookIDs, img, Locaimg, Book_Dates):+ o% p" W2 ~; O. L3 W
  37.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8"); @+ A3 V5 J: U% Y" i# M" s
  38.         try:" ^; d0 E* w( U
  39.             cursor = db.cursor()
    2 e: S- R2 X4 x) C0 y3 D2 d; [" o
  40.             #注意此处字符串的占位符要加双引号"%s"
    ) p4 s5 i5 a" V& {! M( ^
  41.             sql = 'insert into BookFile(Bookname, BookID, img, Locaimg, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, BookIDs, img, Locaimg, Book_Dates);
    ; E  N, {  o+ Q4 H  V
  42. #            print(sql)9 n$ k3 b2 w& `) Z& c2 l# g' |3 {4 J
  43.             cursor.execute(sql)* J+ O( H* ?5 b, n, H) v: T
  44.             
    / P9 {: l$ A. k) ~
  45.             #qid = cursor.lastrowid5 t" Z- M# G# ?" U
  46.             #print(qid)
    1 P7 K* S% B' D% T* r/ Q: E  o4 n1 o8 X
  47.             9 S/ h+ W/ n6 \0 }6 R
  48.             db.commit()
    . I) l2 I# Z, Y
  49.         except Exception as err:
    * v, @' r4 d5 Y% A
  50.             print("Error %s for execute sql: %s" % (err, sql))
    0 B: w) S! a3 K; r0 H( k
  51.             db.rollback()$ w8 z8 e: w; L  Q- o
  52.     def add_comment(self,Bookname, Booktitle, BookID, Titleid, Book_Date):
    ( B% o# c+ K! Z1 O9 m- V& V" C
  53.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")2 r% X3 X( U& ~" E
  54.         try:3 `4 W* r& ^2 x- m. O# J3 t' J
  55.             cursor = db.cursor()
    0 s+ H5 d9 g0 v3 G/ N* d
  56.             #注意此处字符串的占位符要加双引号"%s"
    / ?( B: c9 e7 {6 Q: H) t
  57.             sql = 'insert into BookTitle(Bookname, Booktitle, BookID, Titleid, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, Booktitle, BookID, Titleid, Book_Date);
    5 u- H: D, b( O( o' y7 G
  58. #            print(sql)6 e, ?: B- \) f3 K
  59.             cursor.execute(sql)
    & h% O, ^5 J1 I& O
  60.             ' M: Z1 ?9 S6 [# r% q0 q
  61.             #qid = cursor.lastrowid
    8 L! H3 c" C' y
  62.             #print(qid)( H5 ?1 L$ h4 P- o  M2 N8 L# R
  63.             , Y& s* \! a, X7 o+ J( P+ j
  64.             db.commit()7 R' W* N/ `1 G
  65.         except Exception as err:
    4 I/ ~. K2 e  C
  66.             print("Error %s for execute sql: %s" % (err, sql))
      E; p! N) l+ H9 F. C7 l
  67.             db.rollback()
    & `- n: Z; o/ `
  68.     def add_question(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date):' G) x! K, y8 F* f; R7 {
  69.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")! |- Q* j* n& G/ ?/ y! }/ U+ h6 G
  70.         try:
    & Y. Y! J' i" W( ]+ @9 C& g. q" t. d
  71.             cursor = db.cursor()" D# D+ f5 ]5 z5 ]1 {: {% J$ J
  72.             #注意此处字符串的占位符要加双引号"%s"7 Z% I1 _: J2 z3 r7 G
  73.             sql = ' INSERT INTO BookConte (Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date) VALUES("%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s")' % (Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date);
    # p7 x: X# P( j5 q& N: z" w" @; s* W
  74.             print(sql)6 y5 ]8 \  a- d) F! E
  75.             cursor.execute(sql)
    / z( X3 r5 J- @5 L
  76.             print(cursor.lastrowid)9 ^7 Q8 G5 n' g0 n3 t
  77.             db.commit()
    6 u& ^1 i9 H- i( z  h
  78.         except Exception as err:
    - {6 B, K- |$ e5 d
  79. #        except:
    , E8 Q6 E+ {  Z- }2 C) H/ i
  80. #            print('Failed'): [& E; P: c2 r& g6 }4 M
  81.             print("Error %s for execute sql: %s" % (err, sql))
    & D# v) N- u2 i9 v- S
  82.             db.rollback()
    1 j2 ~8 o8 D) ~6 P; ?( Z9 d* ~
  83.         
    ( g6 l/ @; a- k  E! G1 G+ z2 }
  84.     def add_locoy(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover):   q. \* r* Q0 L5 u* a5 ~5 h
  85.             reload(sys)
    7 k( C# k. C8 z6 N/ B
  86.             sys.setdefaultencoding("gbk")
    & ]& s/ D) ?5 m6 _. x
  87.             locoy_url = 'http://www.******.net/locoy/?my=book'  #697火车头发接口地址6 r1 \$ y. |. @# }9 A+ c" [2 |
  88.             locoy_data = {! d" p: D6 I: h1 `( D/ @4 c: n$ n
  89.             'my_u':'用户名',   #后台用户名
    8 h) f  ^& _8 |, U
  90.             'my_p':'密码',   #后台密码
    8 S: R* K6 X7 \* M' Z
  91.             'subject_669977_net':Bookname.encode('gbk', 'ignore'),# S/ q: s4 K0 _0 o" W1 a
  92.             'caid':Cater_Name.encode('gbk', 'ignore'),. x4 k8 Q8 i! l
  93.             'title_669977_net':Booktitle.encode('gbk', 'ignore'),
    + t1 K+ ?4 M7 m0 o
  94.             'article':BookConte.encode('gbk', 'ignore'),; [2 x8 ^% E; a  D$ t
  95.             'author':Book_author.encode('gbk', 'ignore'),
    . o" `9 ?4 Z& w$ W" Q
  96.             'ready_1':Book_Palabras.encode('gbk', 'ignore'),
    : T2 i2 R9 Z7 B3 F8 q9 o7 M
  97.             'thumb':Book_img,
    ( u0 v- v9 F' N! H* q! r/ l7 w
  98.             'content':Book_Introduction.encode('gbk', 'ignore'),
    & ]: b3 p/ w4 h
  99.             'abover':abover.encode('gbk', 'ignore')             S; t9 j* n1 r, K
  100.                 }
    & Y- C  N5 `: `/ L
  101.             res = requests.post(locoy_url, data=locoy_data)
    0 f$ c. S9 E1 `, @1 b
  102.             print res.text
    1 `  T7 Y5 H9 q# D: \6 G; Y
  103.             print res.content
    # L9 f' v3 [$ g  C$ o" c/ K0 q# {# G
  104. #            print Dsd2 q! l+ O  ~8 C" q" ?4 H& m2 B
  105.             return res
    7 r9 L, E  v4 ]. q; v
  106.    
    7 V2 s& `; x4 R1 V  i
  107.     def __init__(self):" `# f4 z  \+ ?5 W1 t7 X9 h
  108.         self.base_url1 = 'https://www.****.cc/'
    ) m' q' h. @3 A
  109.         self.base_url2 = '/'; C& z/ K, \- z8 i3 `
  110.         self.CaterId = []- I0 X4 F' A" f, i2 {! r1 a
  111.         self.CaterIds = ['xuanhuan', 'wuxia', 'yanqing', 'lishi', 'kehuan', 'kongbu', 'nvsheng']- I5 l, S! H* h  V, \4 s! q
  112.         self.page_num = 1& m  S/ ?$ q; J$ O+ C8 ~
  113.         self.total_num = 200   
    % L) P- B) c6 Q

  114. * P& n) D$ L7 R" U
  115.     @every(minutes=8 * 60)
    3 e2 n! F0 Q" t( P8 V+ o: {& [" H7 O
  116.     def on_start(self):
    2 c) }  @6 Q' K# X% }8 W
  117.         global Cater_Name, E3 }5 e% w$ z/ M  y
  118.         Cater_Name = []
    ! X( z* V% n! I8 p" h6 \, t
  119.         while self.page_num <= self.total_num: ' ^% c1 ~0 y% l% w7 W
  120.             for self.CaterId in self.CaterIds:
    , I  v& h5 O' x3 Y" Q
  121.                 if self.CaterId  == 'xuanhuan':
    ) Q: V; k0 L4 t& V/ {# W
  122.                      Cater_Name = '玄幻': Z8 G6 A# N, ~# E
  123.                 if self.CaterId  == 'wuxia':- f/ Q- Z# G- `+ U  O  I) i
  124.                     Cater_Name = '武侠'+ S# R$ n/ u! H6 K4 n4 I
  125.                 if self.CaterId  == 'lishi':
    " X; j* y/ f9 `7 ~% k. c# v" a) v
  126.                     Cater_Name = '历史'            ( K: }4 Y1 a, Q0 F) [4 h( p1 ]# h
  127.                 if self.CaterId  == 'yanqing':, N8 Z6 m8 [! n6 }6 t; W! L3 r% ?
  128.                     Cater_Name = '都市'
    4 |4 m( K1 A6 n
  129.                 if self.CaterId  == 'nvsheng':( c# }* s! |' u
  130.                     Cater_Name = '都市'
    $ C  d/ Y5 R5 F
  131.                 if self.CaterId  == 'kehuan':, ^, q; b8 `: `9 k2 p7 Z6 w7 m
  132.                     Cater_Name = '科幻'
    4 h0 L* T& b# \8 o. {' V1 ?! H/ A
  133.                 if self.CaterId  == 'kongbu':- F. H( N: p" k) }. E$ j: t
  134.                     Cater_Name = '游戏'
    - r( k, i5 l0 [9 Y! r$ _/ u' a
  135.                 print self.CaterId; q2 q; t# a2 u# A
  136.                 url = self.base_url1 + str(self.CaterId) + self.base_url2 + str(self.page_num) + "/"         
    & |  S  d2 M* k% S
  137.                 self.crawl(url, callback=self.list_Caterg,save=Cater_Name)
    , I; o) V3 c( \- t
  138.             self.page_num += 1 8 l: S7 A! U; T; A
  139.             
    3 A+ U6 n( L& h
  140.     def list_Caterg(self, response):: N1 y6 X' `0 [/ J" x0 L0 o$ O
  141.         Cater_Name = response.save2 `  e& h3 w3 E5 j9 ?
  142.         for each in response.doc('.pic-list a[href^="http"]').items():
    % s9 V/ d; ~) ]* \: [9 g
  143.             self.crawl(each.attr.href, callback=self.list_Caterg_detail,save=Cater_Name)5 w8 c  X- U) D# _; p; m* v) X
  144.             - h) w/ N. b5 @4 Q/ ^% k) |8 v
  145.     def list_Caterg_detail(self, response):
    4 t4 E6 E. J+ E1 J; ]" [  h$ D& Q
  146.         Cater_Name = response.save
    5 z2 [$ @) h- a
  147. #        print Cater_Name5 z. w" W! n; S, b8 Z+ i3 k
  148.         Bookname = response.doc('h1').text()
    5 k2 [* d2 t0 q
  149.         print Bookname
    5 |0 i& s7 S* x4 D8 J; Q
  150.         Book_author = response.doc('.authorname > a').text()8 m, u* e: u% x/ |2 Y$ T7 Z. B
  151. #        print Book_author
    9 X* F2 v4 c. U9 y7 u; h
  152.         Book_Introduction = response.doc('.book-intro > div').text()1 T! Q+ k! q* h2 J
  153. #        print Book_Introduction0 j0 L$ C* H# Y
  154.         Book_Synopsis = response.doc('b').eq(1).text()$ P# z) l2 f4 e" R
  155. #        print Book_Synopsis! W, }. v9 l" r" ?8 H0 ?
  156.         Book_Palabras = response.doc('.booktitle p').text().split(' ')[1].split('|')[0]
    5 e( P- k* i* L+ c% P* i
  157. #        print Book_Palabras: \9 y1 i7 w, |+ @
  158.         BookIDs = response.url.split("xiaoshuo/")[-1].split("/")[0]   #小说ID
    ( m  l) E1 A) \) ^- n' S$ U/ U
  159. #        print BookIDs1 Q% G/ W' s" J4 d- n0 o' G
  160.         Book_Dates = str(datetime.datetime.now())         , Z, k& D/ x& c3 d; G7 ]
  161.         for imgs in response.doc('.bigpic > img[src^="http"]').items():
    1 i% L- `$ g! {/ H. D# ?2 a+ c
  162.             img = imgs.attr.src
    % C) E. ?) S% I1 s
  163.             print img
    ( h& q+ S- i9 d% u3 c  r
  164.                 #小说封面下载
    & G! f3 q' k; d' n2 K. u# a
  165.             extension = self.getExtension(img)
    , ~$ K" l) u0 R- Q. ^+ I
  166.             name = self.getname(img)/ ]4 P3 A- K8 F
  167.             file_name = name + "." + extension
    / ~' r: e6 F* v0 ^
  168.             imgDir = P_dir + name
    : l- y1 \( w7 Z+ P! ~$ N- P+ H
  169.             Locaimg = imgDir + "/" + file_name: t* ~3 v5 C- {4 h# V
  170.             print Locaimg. ]" P0 e, M8 I& ^+ u! Y* x  o
  171.             if(self.download(P_dir, imgDir, file_name, img)):   #这2行可注译,图片下载到本地- f- I$ K- d4 E" G
  172.                 print('attachment url is ' + img)               #
    ( y3 e( t9 B- S: l/ \; y
  173.             Datos = {6 W0 W8 l* ~8 w, C) R2 w8 D/ y
  174.                     "Cater_Name":Cater_Name,
      I. }* h3 n; j5 l, m
  175.                     "Book_author":Book_author,' x* G1 C' ^/ [. X( ]. t
  176.                     "Book_Introduction":Book_Introduction,
    8 {7 ~! I7 y% k8 t* O# e9 s
  177.                     "Book_Synopsis":Book_Synopsis,# ]+ @8 A# E9 E/ k4 ~" G( W9 y, ?
  178.                     "Book_Palabras":Book_Palabras,# J. V/ `6 ~0 U3 D" C7 q3 j
  179.                     "img":img,$ ~( R1 z; ^* d
  180.                 }
    ! ~5 h& P# A' z4 V' X
  181.             self.add_BookFile(Bookname, BookIDs, img, Locaimg, Book_Dates)  #这行可注译,数据库发布接口,方便其他系统的发布9 z# f; ]- Y( V1 x$ D
  182.         for each in response.doc('div[class="bookbtn-txt"]  a[class="catalogbtn"]').items():# L; U5 [. I  h6 W4 P( r3 h% `
  183.             self.crawl(each.attr.href, callback=self.index_page,save=Datos)5 G7 F  U: Y" d2 z0 k0 u
  184.             # a( D" l1 ~& A6 c3 H
  185.     @config(age=8 * 60 * 60)    5 k$ W+ m6 R3 t4 n6 r: ^) j
  186.     def index_page(self, response): 6 j8 W& J  x  h7 W, k7 l. u
  187.         Datos = {
    1 x$ a  z0 N1 D& u
  188.                   "Cater_Name":response.save['Cater_Name'],
    ( E% B$ |' `8 B$ z) M" K( P$ q
  189.                    "Book_author":response.save['Book_author'],
    2 V) x. }! ?0 V
  190.                    "Book_Introduction":response.save['Book_Introduction'],$ l# f7 W0 t8 \1 P+ R
  191.                    "Book_Synopsis":response.save['Book_Synopsis'],
    8 w2 W* `/ a2 k( s. b' _
  192.                    "Book_Palabras":response.save['Book_Palabras'],5 ^6 w# o. u. @, z- F
  193.                    "img":response.save['img'],
    . F. \: v9 r7 G$ u( }
  194.                      }
    # S1 Y) B  c; H- S: C( |
  195.         for each in response.doc('.chapter-list li:first-child a[href^="http"]').items():
    & d* b8 C' D; ~8 z) ]( y) b
  196. #        for each in response.doc('.chapter-list  a[href^="http"]').items():  
    $ g$ b! s+ q% O6 l8 @
  197.                     self.crawl(each.attr.href, callback=self.detail_page,save=Datos)3 M" v) x, q( @( B; V! a
  198.     @config(priority=2)1 ^9 I9 T; K. w8 y* q0 E
  199.     @catch_status_code_error
    3 h% T( e% T* q; _% f% R
  200.     def detail_page(self, response):        
    9 X& `5 P) M) [- ]; o& y" Z
  201.         NewRe1 = u'哈书'# s- L' V% q8 x2 w( ~4 I8 }( `
  202.         NewRe2 = u'huhjsd.CC'' o5 m) Z' T" ^1 Y! B' v! B
  203.         NewRe3 = r'^\\n\\n'+ I5 x9 O5 E; l7 [
  204.         NewRe5 = u'小说网'
    / P) W; n7 l$ u+ @3 ^
  205.         NewRe6 = u'fgdfgf'3 C: I" w* @4 B* N8 D
  206.         NewRe7 = u'fgfgf'4 O! \! b! M) X  R: M4 {+ g
  207.         NewRe8 = u'ffhgf'
    7 O; O# U: h% B  V, F$ S
  208.         NewRe4 = r'[\f\t\v+\.\{\(\)\}\!\/_,$%^*(+"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()]+'
    ( v7 B/ L1 r; p$ F- f& {; _$ V
  209.         ReC1 = u'静思'+ z) q% S, K' p+ o4 m$ g
  210.         ReC2 = u'aghgf.com'; F  @6 d! A7 ^# A& c- e& @
  211.         ReC3 = u'aghgfh.com'- v7 ?4 v2 P) e0 Z5 Y( ], U+ Z
  212.         ReC4 = u''" S1 E+ W5 H% }. u- I2 _9 @6 X
  213.         ReC5 = u'文学网'
    ) _1 O7 x" ?2 i9 O& o, C( V
  214.         ReC6 = r'<BR>'
    0 {4 }$ q4 G2 N0 }( c5 L& i8 G5 ~
  215.         Bookname = response.doc('.readlocation a').eq(2).text()   #小说名称1 Y% T. v3 j+ I6 r
  216.         print Bookname
    4 r' m  v5 a+ e
  217.         Cater_Name = response.save['Cater_Name']   # 小说分类
    ; }$ |; Z5 R5 {1 L. a! e
  218.         Book_author = response.save['Book_author']   #小说作者, `; ~+ ?$ M; \& G
  219.         Book_Introduction1 = response.save['Book_Introduction']   #小说简介
    ' u# L% V; ]7 ?0 Q
  220.         Book_Synopsis = response.save['Book_Synopsis']   #最近更新5 }3 \  {% I5 V' X( F1 l
  221.         Book_Palabras = response.save['Book_Palabras']   #小说字数' [  e' u  Y& l; U$ J, U. U% k
  222.         Bookurl = response.url   #小说网址  i$ ~& n$ M! {2 ], Y: R
  223.         Booktitle = response.doc('.article-title').text()   #章节名称
    + P7 k( C5 N1 ?3 N2 L& G% B
  224.         BookID = response.doc('.readset-r span').text()   #小说ID0 o3 ]2 I  q8 y7 ~
  225.         BookConte1 = response.doc('.article-con').text()   #小说章节内容$ n" P% C+ D6 l, P6 e
  226.         abover = response.doc('.article-title').text() + response.save['Book_Synopsis'] + response.save['Book_Palabras'] + response.save['Book_Introduction']   #小说状态(连载还是完成), v5 i0 i9 r- @- F
  227.         Book_Date = str(datetime.datetime.now())    # 采集时间
    9 g! N0 g. g( N( N) {+ Y, L3 s# Z
  228.         BookConte2 = BookConte1.replace(NewRe1 , ReC1)
    ) h4 C7 Y; I, \& ?) m
  229.         BookConte3 = BookConte2.replace(NewRe2 , ReC2)
    ! j; W  V1 y+ g4 ?" S- f% n" }
  230.         BookConte5 = BookConte3.replace(NewRe5 , ReC5)  y/ a6 z$ ?0 k9 O9 P& T
  231.         BookConte6 = BookConte5.replace(NewRe6 , ReC2)
    " i( g0 i$ Q2 e% y# f& B" y5 H5 [. ]
  232.         BookConte7 = BookConte6.replace(NewRe7 , ReC2)3 u8 g# r3 G) I* Q+ a/ _( e6 n
  233.         BookConte8 = BookConte7.replace(NewRe3 , ReC6); r/ D' ]; B) C1 ~6 L$ Q
  234.         BookConte4 = re.sub(NewRe4 , ReC4 , BookConte8)
    ) @1 d( J3 ]0 @) ^; s
  235.         BookConte = BookConte4.replace("\n\n","<br>")' ?1 O, Y. J3 }  @, \& z
  236.         print BookConte
    9 `! `; E# m; N2 Z, K* S
  237.         Book_Introduction2 = Book_Introduction1.replace(NewRe1 , ReC1). Q3 \4 m+ T, o9 y$ W
  238.         Book_Introduction3 = Book_Introduction2.replace(NewRe2 , ReC2)
    % z7 _" V+ U8 o" S5 \, [# H; `- o
  239.         Book_Introduction4 = Book_Introduction3.replace(NewRe3 , ReC3)* b) D( ~7 I* o5 T+ x2 f3 E
  240.         Book_Introduction = re.sub(NewRe4 , ReC4 , Book_Introduction4)
    # q1 a! I: N! }3 t
  241.         Titleid = response.url.split(BookID + "/")[-1].split("/")[0]     
    : V# W3 s5 h' T- @4 e
  242.         Book_img = response.save['img'],  #小说图片1 M% ~4 Z# j  g7 m$ n" q. a
  243.             
    3 N  E7 U1 F- p# @. b4 a" g* o, L
  244.         #insert into MySQL 小说入库  D1 k, G- e9 u
  245.         self.add_question(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布
    ; I6 l; u" H. N3 q. e1 e- c
  246.         self.add_comment(Bookname, Booktitle, BookID, Titleid, Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布
    3 V% X6 l4 `# X+ C0 }/ E6 E7 R2 l
  247.         #post提交发布
    - C6 b6 U5 H7 @" L6 w
  248.         self.add_locoy(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover)  #这行可注译,火车头发布接口,不需要可取消+ p2 {$ {' w# |) p
  249.         Datos = {) F3 U1 i3 q) q2 u" ~( M7 g, G
  250.                   "Cater_Name":response.save['Cater_Name'],0 [8 U: w1 ?1 M8 f* w9 D
  251.                    "Book_author":response.save['Book_author'],
    7 p0 y- a  l; i0 ~
  252.                    "Book_Introduction":response.save['Book_Introduction'],* _8 w8 a$ ~5 W% i% k/ J
  253.                    "Book_Synopsis":response.save['Book_Synopsis'],, U" g: I7 I6 y3 ^" N0 d# d
  254.                    "Book_Palabras":response.save['Book_Palabras'],
    9 u  t! ^9 \7 X# e
  255.                    "img":response.save['img'],* C% m- `, n' X2 w
  256.                      }
    5 i/ q8 c; Y+ N5 Y
  257.         for each in response.doc('.articlebtn > a:nth-child(4)[href*="/xiaoshuo"]').items():
    % Z1 I% o% o/ r5 {
  258.             self.crawl(each.attr.href, callback=self.detail_page,save=Datos) 3 B* `3 _( |6 o2 O% O
  259.         return {
    - m, o/ v. X/ ~! F
  260.             "Cater_Name":Cater_Name,9 m$ Q; e# L- u  f6 Y
  261.             "Bookname":Bookname,# c  O" `8 F6 g
  262.             "Book_author":Book_author,
    $ l9 R) t" O/ I9 u; B4 F
  263.             "Book_Introduction":Book_Introduction,
    , z" l0 B1 D9 F
  264.             "Book_Synopsis":Book_Synopsis,
    ' X+ o  N* O+ n% n- G5 i9 h$ L
  265.             "Book_Palabras":Book_Palabras,% y7 L8 F5 @; E. c1 U
  266.             "Book_img":Book_img,
    $ @5 T+ p& `# B
  267.             "Bookurl": response.url,
    ! m& ]% b" g/ O& h8 G
  268.             "Booktitle": Booktitle,# R% O8 d" h, f
  269.             "BookID": BookID,
    ( C3 ^% O& h6 M
  270.             "BookConte": BookConte,; U- H# N; b' Z" q. X' J
  271.             "Titleid": Titleid,. O4 p+ P1 r/ o3 [" M5 {6 F
  272.             "abover":abover,
    6 b/ m- k% I2 O" O
  273. #            "Book_Date" = str(datetime.datetime.now()),# E6 j& M, n+ y6 [9 D$ K
  274.         }
    ! d! f0 P9 ^  [$ L7 k
  275.     def download(self, P_dir, imgDir, file_name, Book_img):( \: p- Y) B1 D* T2 z# s# R  Q
  276.         if not os.path.exists(imgDir):
    0 i! Y4 ?! a2 ^% B5 _/ Y
  277.             os.makedirs(imgDir)# X2 x- B3 h7 t# m
  278.         file = imgDir + "/" + file_name) L1 A; X% a9 X2 ]6 w
  279. #        print file
    7 |# O, E9 ~9 p6 m3 I
  280.         f = open(file, 'wb+')
    + A; f2 _( K3 k! N9 \
  281.         imag = requests.get(Book_img)
      ?7 s2 k! C7 Y
  282.         f.write(imag.content)3 r0 V' \7 H# ?
  283.         f.close()
    - x/ j+ a- ~9 Y# Q" o. V
  284.         #保存图片前& b: g4 ?$ p4 k( g. I! ?
  285.     def save_imgs(self,response):
    6 H' r* A9 I4 w) P2 k2 }( t' M
  286.         content = response.content
      e2 K2 ?4 v- }( u( u& t
  287.         file_name = response.save["file_name"]
    & D# B+ U  S8 Z4 X
  288.         imgDir = response.save["imgDir"]
    + L& H- n. z! g, M
  289.         file_path = imgDir + file_name
    9 W2 }- R- a# |# A0 t7 F: f& f
  290.         self.save_img(content,imgDir,file_path)* c, R/ X5 B  O& U. B. T+ _
  291.     #保存图片
    1 l9 W' C+ C6 e4 Y; U- L
  292.     def save_img(self,content,imgDir,path):) R; Z; x( \2 U# U
  293.         if not os.path.exists(imgDir):                         : M  j' S! P' l5 ?6 L
  294.             os.makedirs(imgDir)
      z1 ?+ h$ ?- Z# F( c4 K: C
  295.         f = open(path,"wb" )$ d4 I; n9 l5 e+ I. ~( {
  296.         f.write(content)$ V$ a! T$ O: i; o- E
  297.         f.close()- y7 l% e/ j3 b, |, X; m
  298.     #获取url后缀名3 J; k7 `) ?& Z9 V1 K8 c1 w
  299.     def getExtension(self,url):                            # I+ I; M6 d" C: ?" k
  300.         extension = url.split(".")[-1]! u6 c  f+ r5 N  T# T
  301.         return extension
    ; J5 }! I* J; C: o
  302.     : o  m' c* ~3 E! O! Z
  303.     #获取图片名% F3 m. t& o% B
  304.     def getname(self,url):
    . G0 B5 T/ d: {
  305.         name=url.split("/")[-1].split(".")[0]6 D* [) W. N" Z6 ]( N. Z  @
  306.         return name
复制代码
8 V8 Z5 l: U- D! g

* H3 l* U$ e- y) V. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|中国飞逸网

GMT+8, 2025-10-26 06:10

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表