前面都已经学习的差不多了,现在又有另一个网站要爬取,http://moku.kaibei.com/categories/7
由于分析到只是7位置的变化,把以前读取列表的方法改了下,在方法里传值进来,页数我是直接写的999页,然后看到他们网站上如果是没有那一页会返回一个content-box的div,里面显示还没有作品,我就查找这个div,如果有这个div存在就跳出循环。
比上次增加了一个图片文件夹不存在自动创建的几句,其它的都差不多
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下来了
图片也全下载下来了
运行过程中出现了一次问题,就是标题上面有个'号的时候,写入数据库出了问题,后来直接把'号替换了,这只是练练手没什么问题,大项目里面就不应该出这些问题了,这就是sql注入的基本原理。