python爬虫学习之路,为老婆爬下整站模板-第三章

前面都已经学习的差不多了,现在又有另一个网站要爬取,http://moku.kaibei.com/categories/7

由于分析到只是7位置的变化,把以前读取列表的方法改了下,在方法里传值进来,页数我是直接写的999页,然后看到他们网站上如果是没有那一页会返回一个content-box的div,里面显示还没有作品,我就查找这个div,如果有这个div存在就跳出循环。


image.png

比上次增加了一个图片文件夹不存在自动创建的几句,其它的都差不多

def kaibei_list(self,item_type):
    item_type = item_type
    vs = MySQLHelper()
    query = '%s%s%s' % ("SELECT plan.page FROM plan WHERE plan.item = ",item_type," ORDER BY plan.time DESC LIMIT 0, 1")
    text = vs.queryAll(query)
    vs.close()
    try:
        start_page = int(text[0]['page']) + 1
    except Exception as e:
        start_page = 1
    for x in range(start_page,999):
        print(str(item_type) + "_page_" + str(x))
        url = 'http://moku.kaibei.com/categories/'+str(item_type)+'/?p='+str(x)+'&sort_by=&order=desc'

        f = request.urlopen(url)
        html = f.read()

        #----检查是否是最后一页,如果是就跳出
        html1 = str(html).replace(" ","").replace("\r\n","").strip()
        imglist = re.findall(r'content-box',html1)
        if len(imglist) == 1:
            break

        url = Selector(text=html).xpath('/html/body/div[5]/div/div/ul[1]/li/a//@href').extract()
        img_src = Selector(text=html).xpath('/html/body/div[5]/div/div/ul[1]/li/a/img//@data-original').extract()
        img_title = Selector(text=html).xpath('/html/body/div[5]/div/div/ul[1]/li/a/img//@alt').extract()

        vs = MySQLHelper()
        curr_time = int(time.time())
        for a in range(len(url)):
            query = '%s%s%s' % ("SELECT list.id FROM list WHERE list.url = '",url[a],"' LIMIT 0, 1") #保证数据不重复
            if vs.query(query) == 0:
                img_src_len = img_src[a]
                url_len = url[a]
                title_len = img_title[a].replace("'","")


                file_url = os.getcwd()
                
                random_str = self.random_str()  #随机字符串,用于图片名
                img_path ='%s%s%s' % (file_url,'/image/',item_type)

                #判断目录是否存在
                path_exts = os.path.exists(img_path)
                if path_exts == False:
                    os.mkdir(img_path)
                    print('mkdir  ----  '+img_path)


                img_name ='%s%s%s%s%s%s%s' % (file_url,'/image/',item_type,'/',curr_time,random_str,'.jpg')
                img_sql_url = '%s%s%s%s%s%s' % ('/image/',item_type,'/',curr_time,random_str,'.jpg')
                data = {
                    'name': title_len,
                    'type': item_type,
                    'url': url_len,
                    'img_url': img_sql_url,
                    'down': '',
                    'baidu_down': '',
                    'status':0
                }
                request.urlretrieve(img_src_len, img_name) #下载图片
                vs.insert('list',data)  #把信息写入数据库
                vs.commit()
        page_data = {
            'item': item_type,
            'time': curr_time,
            'page': x
        }
        vs.insert('plan',page_data)
        vs.commit()
        vs.close()
        print(str(item_type) + "_page end _" + str(x))
        time.sleep(1)
    pass

运行的时候多几个线程运行,一个传入3,一个传入9,其它的我暂时不需要,然后读取页面里面下载地址的线程我也只启动了二个,因为列表还需要下载图片,比较慢,启动多了也是在那里sheep

def main_spider(self):
        p = Process(target=self.kaibei_list,args=(3,))
        p.start()

        a = Process(target=self.kaibei_list,args=(9,))
        a.start()
            
            
        for x in range(0,2):
            name = 'name'+str(x)
            name = Process(target=self.down_url_spider)
            name.start()
            time.sleep(1)
            pass

这网站很有意思,他直接把需要用钱购买的下载地址直接放到了js源码里面,只是用js在控制,我以为可以直接下载了用,但后面证实了我太天真,虽然可以下载,但是下载下来的模板也都还是加过密的,非要用他们的u盾和专业版的才能用。

def down_url_spider(self):
        while True:
            vs = MySQLHelper()
            query = 'SELECT list.id, list.url, list.`status` FROM list WHERE list.`status` = 0 LIMIT 0, 1'  #读取status为0的数据
            text = vs.queryAll(query)
            try:
                item_id = text[0]['id']
                print('down_url_spider' + item_id)
            except Exception as e:
                #print('down_url_spider  sleep ') #如果没有就休息一秒
                vs.close()
                time.sleep(3)
            else:
                #首先把当前数据更改为1,代表已经有人占了坑位了
                querys = "%s%s%s" % ("UPDATE `list` SET `status`= 1 WHERE (`id`='",item_id,"')")
                vs.query(querys)
                vs.commit()

                url = 'http://moku.kaibei.com' + text[0]['url']
                f = request.urlopen(url)
                html = f.read()

                down_url = Selector(text=html).xpath('/html/body/div[5]/div/script[3]').extract()
                text = str(down_url[0]).replace(" ","").replace("\r\n","").strip()
                baidu_down = re.findall(r'pan.baidu.com/s/\w*',text)
                #print(baidu_down)
                baidu_down = baidu_down[0]
                #print(baidu_down)
                querys = "%s%s%s%s%s" % ("UPDATE `list` SET `status`= 2, `baidu_down`= '",baidu_down,"' WHERE (`id`='",item_id,"')")
                vs.query(querys)
                vs.commit()
                vs.close()
            time.sleep(3)
            pass
        
        pass

虽然做了些无用功,但就当学习了,慢慢改进代码。
人生或许也是这样,有时候已经很努力了,但是却没有什么结果,但不要气馁,或许只是暂时没用,后续如果与一些事物关联起来或许会一飞冲天。

我用的是python3,用到了下面这些模块

from multiprocessing import Process
import docs.settings as settings
from urllib import request
from scrapy.selector import Selector
from common.MySQLHelper import MySQLHelper
from lxml import etree
import random
import string
import time
import re
import os

可以看到数据里已经把数据都down下来了


image.png

图片也全下载下来了


image.png

运行过程中出现了一次问题,就是标题上面有个'号的时候,写入数据库出了问题,后来直接把'号替换了,这只是练练手没什么问题,大项目里面就不应该出这些问题了,这就是sql注入的基本原理。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容