scrapy+xpath爬取不可描述网站[通俗易懂]

scrapy+xpath爬取不可描述网站[通俗易懂]今天来爬一个让人很有动力的网站,网址就不便放上来了,看看有没有有缘人能得知了还是先来items.pyimportscrapyclassAvmooItem(scrapy.Item):#definethefieldsforyouritemherelike:#name=scrapy.Field()name=scrapy.Field()

大家好,又见面了,我是你们的朋友全栈君。

今天来爬一个让人很有动力的网站,网址就不便放上来了,看看有没有有缘人能得知了这里写图片描述
还是先来items.py

import scrapy
 class AvmooItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() name=scrapy.Field() birthday=scrapy.Field() age=scrapy.Field() height=scrapy.Field() cup=scrapy.Field() bust=scrapy.Field() waistline=scrapy.Field() hipline=scrapy.Field() birthplace=scrapy.Field() Avatar=scrapy.Field() designations=scrapy.Field() des_imgs=scrapy.Field() des_urls=scrapy.Field()

各位施主从这些字段应该就可以看出来了吧
接下来就是主爬取程序了
spider.py

# -*- coding:utf-8 -*-
import scrapy
from AVMOO.items import AvmooItem
import os
import requests
class AvmooSpider(scrapy.Spider):
name='AVMOO'
allowed_domains=['xxx.xx','jp.netcdn.space/digital/video/']#,'xxxx.xx']
start_urls=['https://xxx.xx/cn/actresses/']
base_url='https://xxx.xx'
des_imgs=[]
def parse(self,response):
star_urls=response.xpath('//a[@class="avatar-box text-center"]/@href').extract()
for star_url in star_urls:
yield scrapy.Request(star_url,callback=self.star_item)
next_url=self.base_url+response.xpath('//a[@name="nextpage"]/@href').extract()[0]
if next_url:
yield scrapy.Request(next_url,callback=self.parse)
def star_item(self,response):
item=AvmooItem()
item['name']=response.xpath('//span[@class="pb-10"]/text()').extract()[0]
item['age']=response.xpath('//p/text()')[1].extract()
item['birthday']=response.xpath('//p/text()')[0].extract()
item['height']=response.xpath('//p/text()')[2].extract()
item['cup']=response.xpath('//p/text()')[3].extract()
item['bust']=response.xpath('//p/text()')[4].extract()
item['waistline']=response.xpath('//p/text()')[5].extract()
item['hipline']=response.xpath('//p/text()')[6].extract()
item['birthplace']=response.xpath('//p/text()')[7].extract()
self.mkdir('/home/shitfly/webspider/AVMOO/avmoo',item['name'])
f=open(item['name']+'.txt','w+')
print '写入个人信息'
self.save_txt(item,f)
movie_urls=response.xpath('//a[@class="movie-box"]/@href').extract()
for movie_url in movie_urls:
yield scrapy.Request(movie_url,meta={
'item1':item},callback=self.movie_item)
next_url=self.base_url+response.xpath('//a[@name="nextpage"]/@href').extract()[0]
if next_url:
yield scrapy.Request(next_url,meta={
'item1':item},callback=self.star_item2)
def star_item2(self,response):
item1=response.meta['item1']
movie_urls=response.xpath('//a[@class="movie-box"]/@href').extract()
for movie_url in movie_urls:
yield scrapy.Request(movie_url,meta={
'item1':item1},callback=self.movie_item)
try:
next_url=self.base_url+response.xpath('//a[@name="nextpage"]/@href').extract()[0]
except:
pass
if next_url:
yield scrapy.Request(next_url,meta={
'item1':item1},callback=self.star_item2)
def movie_item(self,response):
item=AvmooItem()
item2=response.meta['item1']
item['name']=item2['name']
item['designations']=response.xpath('//span[@style="color:#CC0000;"]/text()').extract()[0]
base_path='/home/shitfly/webspider/AVMOO/avmoo'+'/'+item['name']
self.mkdir(base_path,item['designations'])
cover=response.xpath('//a[@class="bigImage"]/img/@src').extract()[0]
self.des_imgs=[]
self.des_imgs.append(cover)
des_imgs=response.xpath('//a[@class="sample-box"]/div[@class="photo-frame"]/img/@src').extract()
for des_img in des_imgs:
s=des_img.split('-')
s[0]=s[0]+str('jp-')
des_img=''.join(i for i in s)
self.des_imgs.append(des_img)
item['des_imgs']=self.des_imgs
yield item
def mkdir(self,base_path,title): #title是文件夹名
title=title.strip()
isExists=os.path.exists(os.path.join(base_path,title))
if not isExists:
print "新建",title,"文件夹"
os.makedirs(os.path.join(base_path,title))
os.chdir(os.path.join(base_path,title))
else:
print title,'已存在'
os.chdir(os.path.join(base_path,title))
return True
def save_txt(self,item,f):
it=[]
inf=['age','birthday','height','cup','bust','waistline','hipline','birthplace']
for i in inf:
it.append(item[i])
for it_e in it:
it_e=it_e+'\n'
f.write(it_e.encode('utf-8'))

网址已被和谐,这里希望图片保存到本地,所以还是在磁盘中建立文本文件和文件夹。想要传递字段的话,使用meta={‘item1’:item},下一个函数接收是item1=response.meta[‘item1’]。

保存图片的话在管道中来进行保存
pipelines.py

import requests
class AvmooPipeline(object):
def process_item(self, item, spider):
des_imgs=item['des_imgs']
path='/home/shitfly/webspider/AVMOO/avmoo'+'/'+item['name']+'/'+item['designations']
for i in range(len(des_imgs)):
image=requests.get(des_imgs[i])
path_i=path+'/'+str(i)+'.jpg'
f=open(path_i,'wb')
f.write(image.content)
f.close()
print u'正在保存图片:',des_imgs[i]
print u'图片路径:',path_i
print u'文件:',path
return item

需要在settings.py中使用这个管道

ITEM_PIPELINES = {
'AVMOO.pipelines.AvmooPipeline': 300,
}

来重写一下下载中间件编写您自己的下载器中间件
middlewares.py

import random
class RandomUserAgentMiddleware(object):
def __init__(self,agents):
self.agents=agents
@classmethod
def from_crawler(cls,crawler):
return cls(crawler.settings.getlist('USER_AGENTS'))
@classmethod
def from_settings(cls, settings):
return cls(settings.getlist('USER_AGENTS'))
def process_request(self,request,spider):
us=random.choice(self.agents)
print us
request.headers.setdefault('User-Agent',us)

在settings.py中加入一个USER_AGENTS = […]的列表

DOWNLOADER_MIDDLEWARES = {
'AVMOO.middlewares.RandomUserAgentMiddleware': 543,}

就可以随机使用一个USER_AGENTS了

在settings.py中添加

CONCURRENT_ITEMS=100#默认Item并发数
CONCURRENT_REQUESTS=16#默认Request并发数
CONCURRENT_REQUESTS_PER_DOMAIN = 16#默认每个域名的并发数
CONCURRENT_REQUESTS_PER_IP = 0#每个ip的最大并发数,0表示忽略 

settings

未完待续。。。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/130247.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 排序算法汇总总结

    排序算法汇总总结

  • Linux安装CUDA的正确姿势[通俗易懂]

    Linux安装CUDA的正确姿势CUDA(ComputeUnifiedDeviceArchitecture,统一计算架构)是由NVIDIA所推出的一种集成技术,是该公司对于GPGPU的正式名称。透过这个技术,用户可利用NVIDIA的GeForce8以后的GPU和较新的QuadroGPU进行计算。查看显卡是否支持CUDA输入下面命令查看电脑的NVIDIA型号:v…

  • C语言学习——字符串与整数、浮点数、无符号整数之间的转换常用函数

    C语言学习——字符串与整数、浮点数、无符号整数之间的转换常用函数atof(将字符串转换成浮点型数)表头文件 #include <stdlib.h>定义函数 double atof(const char nptr);函数说明atof()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时(’’)才结 束转换,并将结果返回。参数nptr字符串可包含正负号、小数点或E(e)来表示指数部分,…

  • QStringList用法总结

    QStringList用法总结QStringList继承自QList,提供了一个QString的List;同QList一样,QStringList也是隐式数据共享的,并且支持按索引访问及快速插入、删除元素的操作。所有QList支持的操作都可用于QStringList,同时QStringList在此基础上提供了一些便于操作QString的功能。1.QStringList的构造函数及析构函数构造函数:a.QSt

  • SNMP Trap调试记录[通俗易懂]

    SNMP Trap调试记录[通俗易懂]目录一、Trap与Inform二、Trap1、Agent端工作流程2、Manager端工作流程3、流程图三、调试四、SNMP中预定义的trap一、Trap与InformSNMPInformRequests功能允许路由器向SNMP管理器发送通知请求。路由器可以在发生特定事件时向SNMP管理器发送通知。例如,代理路由器可能在自身遇到错误情况时向管理器发…

  • python二级考试报名_python语言程序设计二级考试真题

    python二级考试报名_python语言程序设计二级考试真题请注意看红色标识文字,图片均是超清图片,可以单击查看看见更大的世界,遇见更好的自己Seeabetterworldtomeetbetterforourselves.1.MMdnn—-MMdnn是一个深度学习的模型工具集,它能够互转模型文件、可视化模型结构、自动产生训练/推演的代码、辅助测试模型兼容性等。2.Matplotlib—-Matplotlib是一个高质…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号