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

未完待续。。。

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 深度学习中学习率和batchsize对模型准确率的影响

    本内容来自其他的人解析,参考链接在最后的注释。1.前言目前深度学习模型多采用批量随机梯度下降算法进行优化,随机梯度下降算法的原理如下:n是批量大小(batchsize),η是学习率(learningrate)。可知道除了梯度本身,这两个因子直接决定了模型的权重更新,从优化本身来看它们是影响模型性能收敛最重要的参数。学习率直接影响模型的收敛状态,batchsize则影响模型的泛化性能,两者又是分子分母的直接关系,相互也可影响,因此这一次来详述它们对模型性能的影响。2.学习率如何影响模型性.

    2022年4月17日
    84
  • Python科学计算之Pandas[通俗易懂]

    Python科学计算之Pandas[通俗易懂]Reference: http://mp.weixin.qq.com/s?src=3&timestamp=1474979163&ver=1&signature=wnZ

    2022年7月5日
    25
  • 暴力破解工具-hydra使用「建议收藏」

    一、hydra简介:ydra(九头蛇),分布式任务处理系统,由社交标签服务提供商AddThis六年前开发,现在已得到Apache的开源许可,就像Hadoop一样,只是还没有Hadoop那样的知名度和声势。Hydra的创造者称,该“多头”平台非常擅长处理一些大的数据任务——对非常大的数据集进行实时处理。hydra是一款世界顶级密码暴力破解工具,支持几乎所有的协议的在线破解,功能强大,其密码…

    2022年4月9日
    307
  • 利用tasklist和taskkill实现判断进程数按名称杀掉进程

    利用tasklist和taskkill实现判断进程数按名称杀掉进程@echooffsetexe=firefox.exeset/anum=5for/f%%iin(‘tasklist^|find/c/i”%exe%”‘)doif%%igtr%num%taskkill/f/im%exe%TASKKILL[/Ssystem[/Uusername[/P[password]]]]{[/FIfilter][/PIDprocessid|/IMimagename]}[/T][/F]描述:使用该工具按

    2022年6月1日
    38
  • 少儿编程网站源码和scratch课程

    随着智能时代的到来,随着国家双减政策的实施,少儿编程是很多教育从业者的首选。因为不仅国家重视,而且对于承认来说容易上手。但目前市面上的少儿编程,投入都极高,且都是租用有限的账号和功能,并不是拥有真正属于自己的系统。学生端所以一定要有源码,这样才能拥有真正属于自己的少儿编程教学平台和管理平台系统。(源码即和新文件,拥有源码就可以不受任何限制。)另外,系统要大量的投入教学使用,这样才能保证其成熟使用,最后还要有专业的技术团队去维护。学生端+课程视频教师端:可以一键推送学生作业给家长..

    2022年4月6日
    62
  • 1.3万亿条数据查询如何做到毫秒级响应?

    1.3万亿条数据查询如何做到毫秒级响应?

    2020年11月14日
    167

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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